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