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

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

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

Метод 1: Использование временного хранилища (Рекомендуемый)

Наиболее надежным способом передачи больших объемов данных, таких как табличные части, является использование механизма временных хранилищ. Суть метода заключается в том, что мы временно сохраняем данные на сервере, а в параметры открытия передаем лишь «адрес» этого хранилища.

Разберем процесс по шагам:

  1. Подготовка данных на сервере: На стороне сервера формируется ТаблицаЗначений.
  2. Помещение в хранилище: Мы используем метод ПоместитьВоВременноеХранилище. Крайне важно вторым параметром передать УникальныйИдентификатор формы-владельца, чтобы данные были доступны в контексте открываемого окна.
  3. Передача адреса: Полученный адрес передается в структуру параметров открытия формы.
  4. Получение данных: В событии ПриСозданииНаСервере или ОбработкаЗаполнения открываемого документа мы считываем данные из хранилища.

Пример серверной логики для подготовки адреса:


&НаСервере
Функция ПодготовитьДанныеДляЗаполнения(ДанныеТЧ)
    Адрес = ПоместитьВоВременноеХранилище(ДанныеТЧ, ЭтаФорма.УникальныйИдентификатор);
    Возврат Адрес;
КонецФункции

Метод 2: Использование механизма ОбработкаЗаполнения

Для того чтобы документ заполнился корректно с учетом всех типовых алгоритмов (пересчет налогов, скидок, заполнение по умолчанию), необходимо использовать событие ОбработкаЗаполнения в модуле объекта. Этот метод вызывается платформой автоматически при создании документа через ОткрытьФорму с параметром ЗначенияЗаполнения.

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


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
        Если ДанныеЗаполнения.Свойство("Товары") Тогда
            Для Каждого СтрокаТЧ Из ДанныеЗаполнения.Товары Цикл
                ЗаполнитьЗначенияСвойств(Товары.Добавить(), СтрокаТЧ);
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Метод 3: Дозаполнение объекта формы после открытия

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

Алгоритм действий на клиенте:

  1. Открываем форму документа через ОткрытьФорму.
  2. В качестве оповещения или через свойства возвращаемого объекта управляем процессом заполнения.
  3. Используем метод ЗаполнитьЗначенияСвойств для каждой строки, добавляемой в ТЧ объекта.

Важно помнить: при ручном добавлении строк после открытия формы, автоматические вычисления (такие как РассчитатьСумму() или проверка ограничений) могут не сработать. Вам придется вызывать эти методы программно после завершения цикла заполнения.

Рекомендации по архитектуре

При работе с типовыми конфигурациями, такими как Комплексная автоматизация или ERP, всегда старайтесь сначала проверить, нет ли в объекте уже готовых процедур заполнения (например, ЗаполнитьДокументПоОтбору). Использование типовых механизмов позволяет сохранять целостность данных и корректную работу функциональных опций.

Если задача стоит перед вами постоянно — лучше использовать подписки на события. Создав подписку на событие ОбработкаЗаполнения для нужных документов, вы сможете реализовать универсальный обработчик, который будет перехватывать передаваемые вами данные и распределять их по табличным частям без изменения основного модуля объекта.

Проанализировав все варианты, мы приходим к выводу, что комбинация временного хранилища (для передачи данных) и штатной ОбработкаЗаполнения (для распределения данных по полям) является «золотым стандартом» разработки в управляемых формах 1С.

← На главную