Как передать данные из Таблицы Значений модуля объекта на управляемую форму в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке внешних обработок и документов в 1С нередко возникает ситуация, когда процедура чтения данных из внешнего источника или сложный алгоритм алгоритмически выполняется в модуле объекта и формирует ТаблицуЗначений. Однако отобразить эти данные необходимо пользователю на управляемой форме. Рассмотрим, почему возникает эта проблема и какими способами её можно решить.

Причины ограничений платформы 1С

Выясним причину основных сложностей при работе с коллекциями данных на управляемых формах:

  1. Разделение контекстов клиента и сервера: Объект ТаблицаЗначений является серверным типом данных. В контексте управляемой формы реквизиты таблиц имеют тип ДанныеФормыКоллекция. Напрямую передать ТаблицуЗначений на клиентский контекст невозможно — платформа вызовет ошибку передачи типов.
  2. Время жизни переменных модуля объекта: Переменные, объявленные в модуле объекта обработки через ключевое слово Перем, не сохраняют свое состояние между вызовами сервера. При каждом обращении с формы к серверу объект пересоздается заново, и его внутренние переменные очищаются.

Способ 1. Использование Табличной части объекта (Решение автора)

Простейший и надежный способ — добавить стандартную Табличную часть в метаданные обработки в режиме конфигуратора. В этом случае платформа автоматически создает реквизит формы Объект.ИмяТабличнойЧасти, который доступен как на сервере, так и на клиенте.

Разберем алгоритм заполнения табличной части формы из модуля объекта:

  1. Преобразуем реквизит формы Объект в эквивалентный объект прикладного решения с помощью метода РеквизитФормыВЗначение().
  2. Вызываем экспортную процедуру модуля объекта для формирования данных.
  3. Очищаем существующие строки и переносим данные из полученной ТаблицыЗначений в реквизит Объект.ТЧ.

Посмотрим на пример кода в серверном обработчике формы:


&НаСервере
Процедура ЗаполнитьТаблицуНаФормеСервер()
    
    // Получаем экземпляр объекта обработки из контекста формы
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    
    // Вызываем экспортный метод модуля объекта
    ОбъектОбработки.ЗаполнитьТЗ(); 
    
    // Очищаем табличную часть перед заполнением
    Объект.ТЧ.Очистить();
    
    // Переносим данные из ТЗ модуля в табличную часть формы
    Для Каждого Стр Из ОбъектОбработки.ТЗ Цикл
        СтрокаТЧ = Объект.ТЧ.Добавить();
        ЗаполнитьЗначенияСвойств(СтрокаТЧ, Стр);
    КонецЦикла;
    
КонецПроцедуры

Способ 2. Использование реквизита формы «ТаблицаЗначений» и метода ЗначениеВРеквизитФормы

Если нет необходимости добавлять Табличную часть в метаданные обработки, можно воспользоваться штатным механизмом преобразования данных формы на сервере.

Рассмотрим пошагово, как настроить отображение без изменения структуры метаданных:

  1. В окне реквизитов формы создаем новый реквизит (например, ТаблицаФормы) с типом ТаблицаЗначений.
  2. Добавляем в данный реквизит колонки, совпадающие по именам и типам с колонками таблицы из модуля объекта.
  3. Перетаскиваем реквизит ТаблицаФормы в дерево элементов формы для создания визуальной таблицы.
  4. На сервере формы загружаем данные из модуля объекта одной командой ЗначениеВРеквизитФормы().

Проанализируем пример кода на сервере формы:


&НаСервере
Процедура ЗагрузитьТЗНаФормуСервер()
    
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    
    // Функция модуля объекта возвращает сформированную ТаблицуЗначений
    ТаблицаИзМодуля = ОбъектОбработки.ПолучитьСформированнуюТЗ(); 
    
    // Передаем данные в реквизит формы без цикла
    ЗначениеВРеквизитФормы(ТаблицаИзМодуля, "ТаблицаФормы");
    
КонецПроцедуры

Способ 3. Передача данных через Временное хранилище

Если `ТаблицаЗначений` формируется в процессе длительной операции или считывается из внешнего источника один раз, её удобно сохранить во временном хранилище.

В модуле объекта или серверном вызове выгружаем таблицу командой ПоместитьВоВременноеХранилище(ТЗ, УникальныйИдентификатор). Затем на форме при необходимости считываем данные методом ПолучитьИзВременногоХранилища().

Организация поиска и обработки данных при двойном клике

Проанализируем решение второй задачи — обработку двойного клика по строке таблицы на форме для поиска связанных данных:

  1. Для элемента таблицы на форме создаем клиентский обработчик события Выбор.
  2. В обработчике извлекаем данные текущей выделенной строки через свойство Элементы.ИмяТаблицы.ТекущиеДанные.
  3. Передаем ключевой реквизит выбранной строки (например, идентификатор или код) в серверную процедуру.
  4. На сервере производим поиск в исходных таблицах значений с помощью методов Найти() или НайтиСтроки().

Посмотрим на пример клиентского обработчика события Выбор:


&НаКлиенте
Процедура ТаблицаФормыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    ТекущаяСтрока = Элементы.ТаблицаФормы.ТекущиеДанные;
    Если ТекущаяСтрока <> Неопределено Тогда
        // Передаем ключевое значение на сервер для поиска
        ОбработатьВыборНаСервере(ТекущаяСтрока.Идентификатор);
    КонецЕсли;

КонецПроцедуры

Таким образом, использование штатных механизмов платформы 1С (таких как ЗначениеВРеквизитФормы или задействование табличных частей) позволяет быстро и корректно передавать коллекции данных между модулем объекта и управляемой формой.

← На главную