Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 дек 2024, 23:58

Как передать данные от сервера клиенту

Автор Kolya123, 07 окт 2014, 15:45

0 Пользователей и 1 гость просматривают эту тему.

Kolya123

Здравствуйте, помогите новичку, как мне вернуть данные от сервера клиенту, чтобы дальше ими заполнить табличную форму документа, при этом  данные беру из другого документа. Вот что я написал -
&НаКлиенте
Процедура КлиентПриИзменении(Элемент, ПолучитьДанные, СтандартнаяОбработка)
    ТД = Элементы.Информация.ТекущиеДанные;
    ПолучитьДанные();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПолучитьДанные()

   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   РеализацияЗаказ.Фильм,
      |   РеализацияЗаказ.Количество,
      |   РеализацияЗаказ.Срок,
      |   РеализацияЗаказ.Стоимость,
      |   РеализацияЗаказ.Ссылка.Дата,
      |   РеализацияЗаказ.Ссылка.Клиент
      |ИЗ
      |   Документ.Реализация.Заказ КАК РеализацияЗаказ";

   РезультатЗапроса = Запрос.Выполнить();

   ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

   КонецЦикла;

   

КонецПроцедуры

дфтын

Рез = Новый .. .Структура? ТЗ ?
Получитьданные(рез);

//Работаем с возвращенными значениями
Для каждого стр из Рез Цикл

Цикл;


...
...
...
...
&НаСервереБезКонтекста
Процедура ПолучитьДанные(Рез)
Цикл
рез.Добавить()
КонецЦикла

КонецПроцедуры

Kolya123

&НаКлиенте
Процедура КлиентПриИзменении(Элемент, СтандартнаяОбработка)
    ТД = Элементы.Информация.ТекущиеДанные;
    МассивДанных = Новый Массив;
    ПолучитьДанные(МассивДанных);
   
    Для Каждого СтрокаМассива Из МассивДанных Цикл
    ТД.Фильм = СтрокаМассива.Фильм;   
    ТД.Количество = СтрокаМассива.Количество;
    ТД.Срок = СтрокаМассива.Срок;
    ТД.Стоимость = СтрокаМассива.Стоимость;
   
    КонецЦикла;
   
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПолучитьДанные(МассивДанных)
   
   ТЗ = Новый ТаблицаЗначений();
    ТЗ.Колонки.Добавить("Фильм");
   ТЗ.Колонки.Добавить("Количество");
   ТЗ.Колонки.Добавить("Срок");
   ТЗ.Колонки.Добавить("Стоимость");
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   РеализацияЗаказ.Фильм,
      |   РеализацияЗаказ.Количество,
      |   РеализацияЗаказ.Срок,
      |   РеализацияЗаказ.Стоимость,
      |   РеализацияЗаказ.Ссылка.Дата,
      |   РеализацияЗаказ.Ссылка.Клиент
      |ИЗ
      |   Документ.Реализация.Заказ КАК РеализацияЗаказ";

   РезультатЗапроса = Запрос.Выполнить();

   ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
      НоваяСтрока = ТЗ.Добавить();
      НоваяСтрока.Фильм = ВыборкаДетальныеЗаписи.Фильм;
      НоваяСтрока.Количество = ВыборкаДетальныеЗаписи.Количество;
      НоваяСтрока.Стоимость = ВыборкаДетальныеЗаписи.Стоимость;      
      НоваяСтрока.Срок = ВыборкаДетальныеЗаписи.Срок;
      
      
   КонецЦикла;
   
      МассивДанных = Новый Массив;
      
      Для Каждого СтрокаТЗ Из ТЗ Цикл
       
       СтрокаТаблицы = Новый Структура;
        Для Каждого ИмяКолонки Из ТЗ.Колонки Цикл
            СтрокаТаблицы.Вставить(ИмяКолонки.Имя, СтрокаТЗ[ИмяКолонки.Имя]);
        КонецЦикла;
       
        МассивДанных.Добавить(СтрокаТаблицы);
       
    КонецЦикла;

КонецПроцедуры

{Документ.Возврат.Форма.ФормаДокумента.Форма(9)}: Значение не является значением объектного типа (Фильм)
    ТД.Фильм = СтрокаМассива.Фильм;   

Как это можно исправить?


cska-fanat-kz

Отладкой!
На первый взгляд в коде все нормально...

ЗЫ Зачем создавать промежуточную ТЗ? Сразу делайте Запрос.Выполнить().Выгрузить()
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

TreeDogNight

Как вариант: используй на сервере не процедуру, а функцию. Перегрузи на ТаблицуЗначений в массив, и возвращай на клиент.

дфтын

А зачем вообще в ТЗ загонять да еще таким способом?
Запрос.Следующий() этого достаточно. вы замедлили работу в два раза , отъели ценную память и вообще делаете лишние движения. так можно писать,только если вам плаят за количество написанных строк :) плюс вводите в заблуждение, предполагается, что вы что - то хитрое делаете
Добавлено: 08 окт 2014, 10:10


Цитата: TreeDogNight от 08 окт 2014, 10:08
Как вариант: используй на сервере не процедуру, а функцию. Перегрузи на ТаблицуЗначений в массив, и возвращай на клиент.
Ого! Это зачем это вот так все делать? Может это дествительно решение, расскажите?

cska-fanat-kz

И еще.
Зачем вам получать массив структур если вы из всей этой массы элементов в итоге получаете только значения ПОСЛЕДНЕГО?
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

TreeDogNight

Цитата: дфтын от 08 окт 2014, 10:08Ого! Это зачем это вот так все делать? Может это дествительно решение, расскажите?
Клиент не поддерживает ТаблицуЗначений, но поддерживает Массив. Моё решение исходит из этого:)

дфтын

а! ну я к тому. что можно сразу в массив:)
Кстати тут очень серьезные рекомендации 1С, и на защите это будет грубейшая ошибка, если не использовать Запрос.Следующий, а выгрузить в ТЗ, а потом из неё заполнять.
Одна из причин, в том, что при Запрос.Следующий данные получаются порционно, а так, если цу вас 150 тыщ товаров,они сразу все в ТЗ запишутся, и прощай сервак если мало в нем памяти

Kolya123

Цитата: cska-fanat-kz от 08 окт 2014, 11:30
И еще.
Зачем вам получать массив структур если вы из всей этой массы элементов в итоге получаете только значения ПОСЛЕДНЕГО?
Не совсем так, просто я хотел сначала проверить, что табличная часть заполняется, а потом придумать как всеми данными заполнить.
А про сразу в массив, я не знаю как, новичок еще.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск