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