При разработке на управляемых формах в 1С:Предприятие 8.3 часто возникает ситуация: на сервере сформирована или получена ТаблицаЗначений, и ее данные необходимо вывести пользователю на экран. Рассмотрим, почему нельзя напрямую передать этот объект на клиент и какими способами можно правильно отобразить данные на форме.
Главное ограничение клиент-серверной архитектуры 1С заключается в том, что тип данных ТаблицаЗначений недоступен на тонком и веб-клиенте. На клиенте элементы формы типа «Таблица» работают с объектом ДанныеФормыКоллекция.
Тем не менее, в конструкторе управляемой формы на сервере существует возможность создавать реквизиты с типом ТаблицаЗначений. Все массовые операции по заполнению данных должны выполняться строго в серверном контексте.
Это основной и самый удобный способ для вывода произвольных табличных данных, не связанных напрямую с объектом базы данных.
Разберем процесс настройки и заполнения по шагам:
ТаблицаНаФорме) и укажем для него тип ТаблицаЗначений.ТаблицаНаФорме в левую панель Элементы — платформа автоматически создаст элемент формы с типом ТаблицаФормы и привязанными полями.Посмотрим на пример кода заполнения реквизита формы на сервере:
&НаСервере
Процедура ЗаполнитьТаблицуНаСервере()
// Получаем или формируем ТаблицуЗначений на сервере
ТЗДанные = СформироватьДанные();
// Вариант А: Использование метода ЗначениеВРеквизитФормы
ЗначениеВРеквизитФормы(ТЗДанные, "ТаблицаНаФорме");
// Вариант Б: Использование метода Загрузить() у реквизита формы
// ТаблицаНаФорме.Загрузить(ТЗДанные);
КонецПроцедуры
Если на форме уже выведена табличная часть прикладного объекта (например, документа, справочника или обработки), процесс упрощается. Данные из серверной таблицы значений можно загрузить напрямую в табличную часть.
Рассмотрим пример кода:
&НаСервере
Процедура ЗагрузитьВТабличнуюЧастьНаСервере()
// Формируем или получаем ТаблицуЗначений с совпадающими именами колонок
ТЗДанные = ПолучитьТаблицуТоваров();
// Загружаем данные в табличную часть объекта формы
Объект.Товары.Загрузить(ТЗДанные);
КонецПроцедуры
Метод Загрузить() автоматически очищает текущую коллекцию и переносит строки из таблицы значений по совпадающим именам колонок.
Если таблица значений сформирована в одной форме (или внешней обработке) и ее нужно передать для отображения в другую форму, используют механизм временного хранилища.
Проанализируем порядок действий:
ТаблицуЗначений во временное хранилище и получаем строковый адрес.ПриСозданииНаСервере извлекаем таблицу из хранилища и загружаем ее в реквизит формы.Посмотрим на пример реализации:
// В исходной форме при открытии новой формы:
&НаСервере
Функция ПоместитьТаблицуВХранилище()
ТЗ = СформироватьДанные();
Возврат ПоместитьВоВременноеХранилище(ТЗ, УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура ОткрытьФормуПросмотра()
АдресХранилища = ПоместитьТаблицуВХранилище();
ПараметрыОткрытия = Новый Структура("АдресТаблицы", АдресХранилища);
ОткрытьФорму("Обработка.ПросмотрДанных.Форма.Форма", ПараметрыОткрытия);
КонецПроцедуры
// В целевой форме в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АдресТаблицы") И ЗначениеЗаполнено(Параметры.АдресТаблицы) Тогда
ТЗДанные = ПолучитьИзВременногоХранилища(Параметры.АдресТаблицы);
ТаблицаНаФорме.Загрузить(ТЗДанные);
КонецЕсли;
КонецПроцедуры
При передаче табличных данных на клиент важно учитывать объем информации. Все строки реквизита формы передаются между сервером и клиентом при вызове контекста формы.
Выясним основные правила оптимизации:
ДинамическийСписок — он запрашивает и передает данные порциями по мере прокрутки.ТабличныйДокумент, который оптимизирован для отображения больших печатных форм.