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