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

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

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

Рассмотрим, как правильно реализовать подобную логику, почему созданные программно документы могут не отображаться в структуре подчиненности и каких архитектурных ошибок следует избегать.

Архитектурный подход: почему нельзя создавать документы в проведении

Первое, на что стоит обратить внимание — это место вызова процедуры создания документов. Начинающие разработчики часто пытаются поместить программное создание сторонних документов прямо в модуль объекта в обработчик события ОбработкаПроведения.

Делать это категорически не рекомендуется по следующим причинам:

  1. Вложенные транзакции и блокировки: Проведение документа выполняется в открытой транзакции. Создание и запись других документов внутри этой же транзакции приводит к блокировкам таблиц СУБД и рискам возникновения взаимных блокировок (deadlocks) при одновременной работе пользователей.
  2. Проблемы при перепроведении: При повторном проведении документа-источника система будет повторно генерировать дубликаты подчиненных документов.
  3. Интеграция с внешними системами: При автоматической загрузке выписок из Клиент-Банка предварительно созданные входящие платежные поручения могут продублироваться или вызвать конфликты сопоставления.

Правильное решение — выносить генерацию связанных документов в отдельную команду (кнопку на форме или пункт меню «Ввести на основании») либо в специальную обработку-мастер.

Программно формируем комплект документов

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

Посмотрим на пример кода:


НачатьТранзакцию();
Попытка
    // 1. Создаем первый документ (Платежное поручение входящее на тело кредита)
    ДокТело = Документы.ПлатежноеПоручениеВходящее.СоздатьДокумент();
    ДокТело.Заполнить(СсылкаНаОснование);
    ДокТело.ДокументОснование = СсылкаНаОснование;
    ДокТело.СуммаДокумента = СуммаТелаКредита;
    ДокТело.Записать(РежимЗаписиДокумента.Запись);

    // 2. Создаем второй документ (Платежное поручение входящее на проценты)
    ДокПроценты = Документы.ПлатежноеПоручениеВходящее.СоздатьДокумент();
    ДокПроценты.Заполнить(СсылкаНаОснование);
    ДокПроценты.ДокументОснование = СсылкаНаОснование;
    ДокПроценты.СуммаДокумента = СуммаПроцентов;
    ДокПроценты.Записать(РежимЗаписиДокумента.Запись);

    // 3. Создаем третий документ (Реализация товаров и услуг)
    ДокРеализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    ДокРеализация.Заполнить(СсылкаНаОснование);
    ДокРеализация.ДокументОснование = СсылкаНаОснование;
    ДокРеализация.Записать(РежимЗаписиДокумента.Запись);

    ЗафиксироватьТранзакцию();
    Сообщить("Комплект документов успешно сформирован!");
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение "Ошибка при создании комплекта документов: " + ОписаниеОшибки();
КонецПопытки;

В этом примере вызов метода Заполнить(СсылкаНаОснование) активирует стандартную процедуру ОбработкаЗаполнения в модуле объекта создаваемого документа, что позволяет автоматически подтянуть контрагента, договор, организацию и другие типовые реквизиты.

Почему документы не отображаются в структуре подчиненности

Проанализируем частую проблему: код выполняется без ошибок, но при открытии отчета «Структура подчиненности» (или иерархии связанных документов) новые документы не видны.

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

  1. Физическая запись документа: Объект не просто должен быть создан в оперативной памяти через СоздатьДокумент(), он должен быть записан в базу данных с помощью метода Записать(). До вызова Записать() ссылка на документ не существует в базе.
  2. Заполнение реквизита основания: В подчиненном документе реквизит, хранящий ссылку на родительский документ (например, ДокументОснование), должен содержать явную ссылку на документ-источник (СсылкаНаОснование).
  3. Настройка состава критерия отбора в Конфигураторе: Реквизит ДокументОснование созданного документа должен быть включен в состав критерия отбора СвязанныеДокументы.

Для проверки состава критерия отбора выполним следующие шаги в Конфигураторе:

  1. В дереве метаданных найдем ветку Критерии отбора и откроем объект СвязанныеДокументы.
  2. Перейдем на вкладку Состав.
  3. Убедимся, что напротив реквизита ДокументОснование целевых документов (ПлатежноеПоручениеВходящее, РеализацияТоваровУслуг) установлены флажки.

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

← На главную