База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как передать ТаблицуЗначений с клиента на сервер в 1С? › Ответ в теме: Как передать ТаблицуЗначений с клиента на сервер в 1С?
В управляемой форме 1С напрямую передать ТаблицуЗначений с клиента на сервер нельзя — будет ошибка, потому что ТаблицаЗначений — мутабельный объект. Нужно преобразовать её в передаваемый тип, например, в массив структур.
Алгоритм передачи таблицы значений с клиента на сервер:
1. На клиенте преобразовать ТаблицуЗначений в массив структур.
2. Вызвать серверную процедуру/функцию с этим массивом.
3. На сервере из массива восстановить ТаблицуЗначений.
Пример кода.
На клиенте (в модуле формы или общем модуле с директивой &НаКлиенте):
|
1 2 3 4 5 6 7 8 9 10 11 |
Функция ТаблицаВМассив(Таблица) Массив = Новый Массив; Для Каждого Строка Из Таблица Цикл СтруктураСтроки = Новый Структура; Для Каждого Колонка Из Таблица.Колонки Цикл СтруктураСтроки.Вставить(Колонка.Имя, Строка[Колонка.Имя]); КонецЦикла; Массив.Добавить(СтруктураСтроки); КонецЦикла; Возврат Массив; КонецФункции |
В модуле формы (клиентская процедура, вызывающая сервер):
|
1 2 3 4 5 |
Процедура ОтправитьТаблицуНаСервер() МассивДанных = ТаблицаВМассив(ЭтаФорма.ДанныеФормыКоллекция.Выгрузить()); Результат = ПолучитьДанныеСервера(МассивДанных); // Обработка результата, если нужно КонецПроцедуры |
На сервере (в модуле формы или общем модуле с директивой &НаСервере):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Функция ПолучитьДанныеСервера(МассивДанных) Экспорт Таблица = Новый ТаблицаЗначений; Если МассивДанных.Количество() > 0 Тогда Для Каждого Ключ Из МассивДанных[0].Ключи() Цикл Таблица.Колонки.Добавить(Ключ); КонецЦикла; Для Каждого СтруктураСтроки Из МассивДанных Цикл НоваяСтрока = Таблица.Добавить(); Для Каждого Ключ Из СтруктураСтроки.Ключи() Цикл НоваяСтрока[Ключ] = СтруктураСтроки[Ключ]; КонецЦикла; КонецЦикла; КонецЕсли; // Дальше можно работать с Таблицей Возврат Истина; // или другой результат КонецФункции |
Важно:
— Вызов серверной функции из клиентской должен быть с директивой Экспорт.
— Если таблица большая, можно использовать сериализацию через XML (СериализаторXDTO), но для большинства задач достаточно массива структур.
— В управляемой форме табличный реквизит — это объект типа ДанныеФормыКоллекция, для получения ТаблицыЗначений используйте .Выгрузить().
Рекомендую посмотреть примеры и разбор здесь:
https://infostart.ru/1c/articles/900985/
https://infostart.ru/1c/articles/240022/