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