Как передать данные табличной части документа в другую форму в обычных формах 1С?

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

Постановка задачи и разбор ситуации

Рассмотрим распространенную техническую задачу: в обычном приложении 1С при работе с документом (например, «Поступление товаров и услуг») необходимо по нажатию кнопки открыть другую форму (например, форму сопоставления или сравнения цен) и передать в нее все строки табличной части.

Выясним, каким образом организовать передачу таблицы значений между обычными формами и корректно отобразить переданные данные пользователю.

Способ 1. Передача таблицы значений через свойство открываемой формы

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

В модуле открываемой формы (например, «СравнениеЦен») необходимо объявить экспортную переменную:

Перем ДанныеДляСопоставления Экспорт;

В вызывающей форме (в обработчике нажатия кнопки документа) пропишем следующий алгоритм открытия новой формы и передачи данных:


ФормаСравнения = ПолучитьФорму("СравнениеЦен");
ФормаСравнения.ДанныеДляСопоставления = Товары.Выгрузить();
ФормаСравнения.Открыть();

Способ 2. Использование экспортной процедуры инициализации

Посмотрим на более чистый с точки зрения архитектуры подход — передачу данных через процедуру-инициализатор. В модуле открываемой формы создадим экспортную процедуру:


Процедура ИнициализироватьДанные(ТаблицаИсточника) Экспорт
    // Заполняем внутренние данные формы или элемент управления
    ЭлементыФормы.ТабличноеПолеЦен.Значение = ТаблицаИсточника;
    ЭлементыФормы.ТабличноеПолеЦен.СоздатьКолонки();
КонецПроцедуры

После этого вызов из формы документа будет выглядеть следующим образом:


ФормаСравнения = ПолучитьФорму("СравнениеЦен");
ФормаСравнения.ИнициализироватьДанные(Товары.Выгрузить());
ФормаСравнения.Открыть();

Как отобразить переданную таблицу на открываемой форме

Проанализируем особенность обычных форм: коллекция ТаблицаЗначений является объектом данных, но не видна в интерфейсе сама по себе. Для её демонстрации на форме используется элемент управления Табличное поле.

  1. Добавим на форму элемент управления типа Табличное поле (например, с именем ТабличноеПолеЦен).
  2. Свяжем таблицу значений с табличным полем, присвоив ее свойству Значение.
  3. Если колонки табличного поля не были сформированы заранее в Конфигураторе, сформируем их программно методом СоздатьКолонки().

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

Важные нюансы работы с данными: выгрузка и возврат результатов

Проанализируем ключевые особенности и варианты работы с табличной частью:

  1. Копирование или прямая ссылка: вызов метода Товары.Выгрузить() формирует независимую копию данных. Изменения, внесенные в выгруженную таблицу в новой форме, не затронут исходный документ автоматически. Если требуется редактировать исходную табличную часть непосредственно, в открываемую форму можно передать сам объект Товары без использования Выгрузить().
  2. Возврат результатов сопоставления: если необходимо обработать данные в дочерней форме и вернуть результат в документ, откроем форму модально с помощью метода ОткрытьМодально():

ФормаСравнения = ПолучитьФорму("СравнениеЦен");
ФормаСравнения.ДанныеДляСопоставления = Товары.Выгрузить();
РезультатСопоставления = ФормаСравнения.ОткрытьМодально();

Если РезультатСопоставления <> Неопределено Тогда
    // Загружаем полученные данные обратно в табличную часть документа
КонецЕсли;
← На главную