13 окт. 2016 г.

Передача данных таблицы значений с сервера на клиент

Навеяно публикацией на Инфостарте, с использованием передачи через XML. За идею плюс, но на мой взгляд, мудрено и многовато кода. Старый добрый способ с массивом структур прост и эффективен. Так же где то год назад добавил в копилку и успешно использую вариант с передачей на сервер копии реквизита формы, содержащего таблицу значений. Данный способ хорош тем, что при необходимости данные таблицы можно передать на сервер без остального контекста формы, не затрачивая время на перенос этих данных в тот же самый массив структур. Опять же, на стороне сервера можно использовать такие методы данной коллекции, как Выгрузить / Загрузить.

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

&НаКлиенте
Процедура ПередатьТаблицу()
    
    ДанныеОбработки = ОбработатьТаблицуНаСервере(Т);
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ОбработатьТаблицуНаСервере(Знач Т)
    
    //Т - копия реквизита с данными, тип ДанныеФормаКоллекция
    //если необходимо, получаем таблицу значений
    ТЗ = Т.Выгрузить(); 
    
    //Обработка таблицы значений
    //...
    
    //можно вернуть результат обратно
    Т.Загрузить(ТЗ);
    
    Возврат Т;
    
КонецФункции

В качестве демонстрации набросал простую обработку. Для варианта с коллекцией формы кода получается несколько меньше, чем с массивом структур. И, как оказалось, работает побыстрее и менее затратна по передаваемому объему.




&НаКлиенте
Процедура Команда1(Команда)
 
 ДанныеТаблицы = Команда1НаСервере();
 
КонецПроцедуры

&НаКлиенте
Процедура Команда2(Команда)
 
 ДанныеТаблицы = Команда2НаСервере(Т);
 
КонецПроцедуры

&НаСервереБезКонтекста
Функция Команда1НаСервере()
 
 МассивСтрок = Новый Массив;
 ТЗ = ПолучитьТестовуюТаблицу();
 Для Каждого СтрокаТЗ Из ТЗ Цикл
  СоставСтроки = Новый Структура("Число1, Число2, Число3, Число4", СтрокаТЗ.Число1, СтрокаТЗ.Число2, СтрокаТЗ.Число3, СтрокаТЗ.Число4);
  МассивСтрок.Добавить(СоставСтроки);
 КонецЦикла;
 
 Возврат МассивСтрок;
 
КонецФункции

&НаСервереБезКонтекста
Функция Команда2НаСервере(Знач Т)
 
 Т.Загрузить(ПолучитьТестовуюТаблицу());
 Возврат Т;
 
КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьТестовуюТаблицу()
 
 Запрос = Новый Запрос;
 Запрос.Текст = 
 "ВЫБРАТЬ
 | 0 КАК Число
 |ПОМЕСТИТЬ Т
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 | 1
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 | 2
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 | 3
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 | 4
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 | 5
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 | 6
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 | 7
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 | 8
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 | 9
 |;
 |
 |////////////////////////////////////////////////////////////////////////////////
 |ВЫБРАТЬ
 | Т1.Число КАК Число1,
 | Т2.Число КАК Число2,
 | Т3.Число КАК Число3,
 | Т4.Число КАК Число4
 |ИЗ
 | Т КАК Т1,
 | Т КАК Т2,
 | Т КАК Т3,
 | Т КАК Т4";
 
 Возврат Запрос.Выполнить().Выгрузить();
 
КонецФункции // ПолучитьТестовуюТаблицу()

Результат замеров передачи первым и вторым способами таблицы в 10000 строк с сервера на клиент:
Время Отправлено Принято
1,31 665 4 050 476
0,47 1 749 979 452

PS: пар раз встречал упоминания, что подобный способ через копию структуры не рекомендуется, поскольку вроде как не документирован. Но конкретики, к чему это может привести, так и не увидел. Если у вас есть информация по этому поводу, будьте добры, оставьте ссылку в комментариях.

Комментариев нет:

Отправить комментарий