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