
Идея в следующем: допустим, Т - реквизит формы с типом ТаблицаЗначений. Тогда процесс передачи будет выглядеть так:
&НаКлиенте
Процедура ПередатьТаблицу()
ДанныеОбработки = ОбработатьТаблицуНаСервере(Т);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ОбработатьТаблицуНаСервере(Знач Т)
//Т - копия реквизита с данными, тип ДанныеФормаКоллекция
//если необходимо, получаем таблицу значений
ТЗ = Т.Выгрузить();
//Обработка таблицы значений
//...
//можно вернуть результат обратно
Т.Загрузить(ТЗ);
Возврат Т;
КонецФункции
В качестве демонстрации набросал простую обработку. Для варианта с коллекцией формы кода получается несколько меньше, чем с массивом структур. И, как оказалось, работает побыстрее и менее затратна по передаваемому объему.
&НаКлиенте
Процедура Команда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: пар раз встречал упоминания, что подобный способ через копию структуры не рекомендуется, поскольку вроде как не документирован. Но конкретики, к чему это может привести, так и не увидел. Если у вас есть информация по этому поводу, будьте добры, оставьте ссылку в комментариях.
Комментариев нет:
Отправить комментарий