8.х как передать результат с сервера на клиент процедуру

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Andriy, 9 мар 2017.

  1. TopicStarter Overlay
    Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Добрый день!!! Задача такова:
    Есть управляемая форма документа "Стенд" на форме есть поле "СерийныйНомер"
    Нужно чтобы по событию АвтоПодборТекста Запрос искал все значения с данным номером
    и подставлял результат выборки в текущую форму в оприделенные поля


    Код:
    &НаКлиенте
    Процедура СерійнийНомерАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
        Если СтрДлина(Текст)>4
            тогда
            СерійнийНомерАвтоПодборНаСервере(Текст);
        конецЕсли;
       
       
          
    
    КонецПроцедуры
    




    Код:
    &НаСервереБезКонтекста
    Процедура СерійнийНомерАвтоПодборНаСервере(Текст)
                              
                Запрос3 = Новый Запрос(
        "ВЫБРАТЬ *
        |ИЗ
        |    Документ.Заявки
        |ГДЕ
        |    (Документ.Заявки.ЗаводскойНомер = &СерНом)");
       
        Запрос3.УстановитьПараметр("СерНом", Текст);
        Результат3 = Запрос3.Выполнить();
        Выборка3 = Результат3.Выбрать();
                
        Пока Выборка3.Следующий() Цикл
        джерело = "Заявка №" + Выборка3.Номер+"    "+Выборка3.дата;
        Модель = выборка3.НазвКотла;
    КонецЦикла;

    В обычной форме все работало нормально, сейчас ничего не получаеться.
  2. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    145
    Симпатии:
    17
    Баллы:
    29
    место процедура сделайте функция
    &НаСервереБезКонтекста
    Процедура СерійнийНомерАвтоПодборНаСервере(Текст)
    ...
    КонецПроцедуры
    так
    &НаСервереБезКонтекста
    Функция СерійнийНомерАвтоПодборНаСервере(Текст)
    ...
    Возврат ВашаСерия; //так возвращаете найденную серию
    КонецФункции

    и меняете обращение к этой функции
    так

    Если СтрДлина(Текст)>4 тогда
    <РеквизитСерия> = СерійнийНомерАвтоПодборНаСервере(Текст);
    конецЕсли;
    Andriy нравится это.
  3. TopicStarter Overlay
    Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Спасибо...
    А могли бы вы наглядно показать?
    К примеру запрос находит документ и в нем данные с поля "тел" тоесть раньше было выборка3.тел

    Как Ее присвоить полю "ТелефонКлиента"

    А "возврат вашасерия " как правильно прописать?
    Последнее редактирование: 10 мар 2017
  4. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    145
    Симпатии:
    17
    Баллы:
    29
    так же как в предыдущем примере с Серией через знак равно "=" вызываете функцию
    вроде все просто, присвоить какое-то значение через "=" проще уже не куда!

    ...
    ТелефонКлиента = ПолучитьТелефонНаСервере(Клиент);
    ...
    Andriy нравится это.
  5. TopicStarter Overlay
    Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Спасибо!!!
  6. TopicStarter Overlay
    Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Не получаеться...
    Вот код
    Код:
    &НаСервереБезКонтекста
    Функция СерійнийНомерАвтоПодборНаСервере(Текст)
                                
                Запрос3 = Новый Запрос(
        "ВЫБРАТЬ *
        |ИЗ
        |    Документ.Заявки
        |ГДЕ
        |    (Документ.Заявки.ЗаводскойНомер = &СерНом)");
       
        Запрос3.УстановитьПараметр("СерНом", Текст);
        Результат3 = Запрос3.Выполнить();
        Выборка3 = Результат3.Выбрать();
       
                
        Пока Выборка3.Следующий() Цикл
           
        джерело = "Заявка №" + Выборка3.Номер+"    "+Выборка3.дата;
        Модель = выборка3.НазвКотла;
       
        КонецЦикла;
       
        Возврат Выборка3;
    КонецФункции


    Код:
    &НаКлиенте
    Процедура СерійнийНомерАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
        Если СтрДлина(Текст)>4
            тогда
            Тел = СерійнийНомерАвтоПодборНаСервере(текст);
           
        конецЕсли;
       
       
          
    
    КонецПроцедуры
    
    выдает ошибку : Ошибка отображения типов: Отсутствует отображение для типа "ВыборкаИзРезультатаЗапроса"
  7. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    145
    Симпатии:
    17
    Баллы:
    29
    да-а-а.

    возвращать надо не выборку а конкретный результат

    пример (хотя бы так)

    &НаСервереБезКонтекста
    Функция СерійнийНомерАвтоПодборНаСервере(Текст)

    Запрос3 = Новый Запрос(
    "ВЫБРАТЬ *
    |ИЗ
    | Документ.Заявки
    |ГДЕ
    | (Документ.Заявки.ЗаводскойНомер = &СерНом)");

    Запрос3.УстановитьПараметр("СерНом", Текст);
    Результат3 = Запрос3.Выполнить();
    Выборка3 = Результат3.Выбрать();


    Пока Выборка3.Следующий() Цикл

    джерело = "Заявка №" + Выборка3.Номер+" "+Выборка3.дата;
    Модель = выборка3.НазвКотла;

    КонецЦикла;

    Возврат джерело; // Выборка3;
    КонецФункции
  8. TopicStarter Overlay
    Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    А на клиенте?
  9. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    145
    Симпатии:
    17
    Баллы:
    29
    а при чем здесь клиент? вы с сервера какую-то ерунду возвращали (выборка3)
  10. TopicStarter Overlay
    Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    я попробывал возвратить "джерело"
    Так ничего не происходит, ни ошибки ничего

    На клиенте нужно написать

    тел=СерійнийНомерАвтоПодборНаСервере(текст);
    ???

    та не работает
  11. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    145
    Симпатии:
    17
    Баллы:
    29
    все происходит просто по данным условиям у вас нет данных, попробуйте так
    &НаСервереБезКонтекста
    Функция СерійнийНомерАвтоПодборНаСервере(Текст)
    Запрос3 = Новый Запрос(
    "ВЫБРАТЬ *
    |ИЗ
    | Документ.Заявки
    |ГДЕ
    | (Документ.Заявки.ЗаводскойНомер = &СерНом)");
    Запрос3.УстановитьПараметр("СерНом", Текст);
    Результат3 = Запрос3.Выполнить();
    Выборка3 = Результат3.Выбрать();
    Пока Выборка3.Следующий() Цикл
    джерело = "Заявка №" + Выборка3.Номер+" "+Выборка3.дата;
    Модель = выборка3.НазвКотла;
    КонецЦикла;

    Если джерело = Неопределено Тогда
    //тестовая печать, бред конечно но хоть что-то
    Сообщить("Нет данных, для ЗаводскойНомер: " + Текст);
    КонецЕсли;

    Возврат джерело; // Выборка3;
    КонецФункции
  12. TopicStarter Overlay
    Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Когда номер найден, ничего не происходит, а при вводе, видает сообщение "Нет данных, для ЗаводскойНомер: " и номер который в данный момент вписан"
  13. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    145
    Симпатии:
    17
    Баллы:
    29
    Ну вот! А вы говорите ни чего на работает! Данные с сервера ПЕРЕДАЮТСЯ! (что и требовалось!!!)
    Теперь вам осталось правильно их найти на сервере и все! Но это уже совсем другая история!
    Andriy нравится это.
  14. TopicStarter Overlay
    Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Решено!!!
    Нужно было на клиенте указать не "джерело = СерійнийНомерАвтоПодборНаСервере(текст); а Обьект.Джерело = "Сер...."

    Но теперь новая проблема, как присвоить к примеру с одной выборки "Джерело" к Джерелу, а "Модель" к модели???
    Несколько возвратов делать?
  15. TopicStarter Overlay
    Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Нужно было на клиенте указать не "джерело = СерійнийНомерАвтоПодборНаСервере(текст); а Обьект.Джерело = "Сер...."

    Но теперь новая проблема, как присвоить к примеру с одной выборки "Джерело" к Джерелу, а "Модель" к модели???
    Несколько возвратов делать?
  16. TrasserZero
    Offline

    TrasserZero Опытный в 1С

    Регистрация:
    26 окт 2016
    Сообщения:
    51
    Симпатии:
    2
    Баллы:
    29
    может, проще загнать выборку в массив, вернуть его и трепать на клиенте как угодно..

    &НаСервере
    Функция ТаблицаЗначенийВМассив(ТекДок)
    ТаблицаЗначений = Запрос.Выполнить().Выгрузить();
    Массив =Новый Массив();
    СтруктураСтрокой ="";
    НужнаЗапятая =Ложь;
    Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
    Если НужнаЗапятая Тогда СтруктураСтрокой = СтруктураСтрокой +",";
    КонецЕсли;
    СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
    НужнаЗапятая =Истина;
    КонецЦикла;
    Для Каждого Строка Из ТаблицаЗначений Цикл
    НоваяСтрока =Новый Структура(СтруктураСтрокой);
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
    Массив.Добавить(НоваяСтрока);
    КонецЦикла;
    Возврат Массив;
    КонецФункции
  17. TopicStarter Overlay
    Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Не судите строго, но как видите, я программист начинающий...
    Посему не могли бы вы показать конкретно на моем примере?
  18. TrasserZero
    Offline

    TrasserZero Опытный в 1С

    Регистрация:
    26 окт 2016
    Сообщения:
    51
    Симпатии:
    2
    Баллы:
    29
    Там, где у вас Результат3 = Запрос3.Выполнить(); надо Результат3 = Запрос3.Выполнить().Выгрузить();
    т.е. получить таблицу значений.. А далее - точно по тексту:
    Массив =Новый Массив();
    СтруктураСтрокой =""; ну и так далее...

    В итоге на клиент вернёте массив, точно соответствующий таблице значений. И там уже поковыряйте его отладчиком, чтоб вытащить нужные данные..
    Проверить не могу, но будет что-то типа Вашего
    Пока Выборка3.Следующий() Цикл
    джерело = "Заявка №" + Выборка3.Номер+" "+Выборка3.дата;
    Модель = выборка3.НазвКотла;
    КонецЦикла;

    только вместо Выборка3.Номер будет НазваниеВашегоМассиваКоторыйВернулиНаКлиента.Номер
    то же и с Выборка3.Дата, Выборка3.НазвКотла
  19. TopicStarter Overlay
    Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    на клиенте такой текст:

    Код:
        Если   СтрДлина(текст)> 4
            Тогда
    
        СерійнийНомерАвтоПодборНаСервере(Текст, ДанныеВыбора);
    
            Пока Масив.Следующий() Цикл
    Объект.Модель = Массив.НазвКотла;
    КонецЦикла;
    
        КонецЕсли;
    
    дает ошибку:
    {Документ.Стенд.Форма.УФДокумента.Форма(183,11)}: Переменная не определена (Массив)
    Пока <<?>>Массив.Следующий() Цикл (Проверка: Тонкий клиент)
    {Документ.Стенд.Форма.УФДокумента.Форма(184,10)}: Переменная не определена (Массив)
    Модель = <<?>>Массив.НазвКотла; (Проверка: Тонкий клиент)




    и возвращает не Массив, а слово "Массив"
    Последнее редактирование: 11 мар 2017
  20. TrasserZero
    Offline

    TrasserZero Опытный в 1С

    Регистрация:
    26 окт 2016
    Сообщения:
    51
    Симпатии:
    2
    Баллы:
    29
    У вас ошибка в слове Массив, там не одна а 2 буквы "с" надо.. Да и вообще, вы начинающий программист? так и не скажешь.. Подумайте, посмотрите отладчиком.. Я-то наугад пишу, нет у меня конфигурации вашей..

Поделиться этой страницей