Как передать данные из одного внутреннего документа в другой в 1С:Документооборот?

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

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

Ограничения типового механизма

Проанализируем типовой функционал программы:

  1. Настройка связей: механизм «Связи документов» позволяет установить связь между видами документов и добавить команду «Создать на основании». Однако типовой механизм ввода на основании не сопоставляет и не переносит произвольные дополнительные реквизиты из табличной части ДополнительныеРеквизиты одного документа в другой.
  2. Наследование реквизитов: автоматический перенос дополнительных реквизитов «из коробки» работает в связке «Предмет процесса → Бизнес-процесс / Задача» при совпадении имен или настроек реквизитов, но не между двумя независимыми элементами справочника ВнутренниеДокументы.

Для решения задачи без прямого редактирования конфигурации рассмотрим основные практические варианты реализации.

Вариант 1. Использование дополнительных обработчиков бизнес-событий

Механизм бизнес-событий позволяет выполнять произвольный программный код при наступлении определенных системных событий без снятия базы с поддержки.

Разберем порядок настройки:

  1. Перейдем в раздел «Настройка и администрирование» → «Бизнес-события» → «Дополнительные обработчики бизнес-событий».
  2. Создадим новый обработчик и выберем событие (например, запись или регистрация документа-источника, либо создание зависимого документа).
  3. В поле обработчика напишем программный код на встроенном языке 1С, который находит документ-источник, считывает значение нужного свойства из табличной части ДополнительныеРеквизиты и записывает его в целевой документ.

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

Вариант 2. Применение скриптов в комплексных процессах

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

Рассмотрим порядок реализации:

  1. В схеме комплексного процесса перед шагом формирования задачи секретарю добавим блок скрипта (выражение на встроенном языке).
  2. Скрипт обращается к основному предмету процесса (исходному служебному заданию), считывает его реквизиты и программно создает зависимые внутренние документы («Билеты», «Гостиница»).
  3. Сформированные документы связываются с процессом и передаются исполнителю уже в полностью заполненном виде.

Вариант 3. Использование расширения конфигурации (.cfe)

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

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

  1. Подключим расширение конфигурации в режиме совместимости с основной базой.
  2. Перехватим событие ОбработкаЗаполнения в модуле объекта справочника ВнутренниеДокументы с помощью аннотации &После или &Вместо.
  3. При создании на основании документа-источника считаем значения дополнительных реквизитов и заполним соответствующую строку табличной части ДополнительныеРеквизиты нового документа.

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


&Вместо("ОбработкаЗаполнения")
Процедура Расш1_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    ПродолжитьВызов(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка);
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.ВнутренниеДокументы") Тогда
        // Считываем значение дополнительного реквизита из источника
        ЗначениеОписания = УправлениеСвойствами.ПрочитатьЗначениеСвойства(
            ДанныеЗаполнения, 
            ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Описание СЗ")
        );
        
        Если ЗначениеЗаполнено(ЗначениеОписания) Тогда
            УправлениеСвойствами.ЗаписатьЗначениеСвойства(
                ЭтотОбъект, 
                ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Описание СЗ"), 
                ЗначениеОписания
            );
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Вариант 4. Дополнительная внешняя обработка

Для сценария, когда секретарь формирует комплект документов вручную по кнопке, подойдет подключаемая внешняя обработка заполнения:

  1. Создается внешняя обработка с типом назначения ЗаполнениеОбъекта или СозданиеСвязанныхОбъектов.
  2. Обработка регистрируется в справочнике ДополнительныеОтчетыИОбработки.
  3. По нажатию команды обработка считывает реквизиты открытого служебного задания, формирует документы «Билеты» и «Гостиница», автоматически регистрирует записи в регистре сведений СвязиДокументов и открывает созданные формы пользователю.

Важные рекомендации по настройке

При реализации любого из способов обратим внимание на следующие нюансы:

  1. Общие дополнительные реквизиты: чтобы избежать путаницы при сопоставлении, рекомендуется использовать один и тот же элемент плана видов характеристик ДополнительныеРеквизитыИСведения для обоих видов документов, а не создавать два дублирующих свойства.
  2. Регистрация связей: при программном создании документов необходимо формировать записи в регистре сведений СвязиДокументов, чтобы связь отображалась в панели навигации карточки документа.
  3. Защита от изменений: чтобы данные в первичном документе не редактировались после формирования вторичных документов, следует настроить запрет редактирования по состоянию документа (например, после перехода в состояние «Зарегистрирован» или «Согласован»).
← На главную