Как найти и доработать механизм ввода на основании в 1С

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

Механизм создания документов на основании других объектов конфигурации является одной из базовых возможностей платформы 1С:Предприятие. Начинающие разработчики часто сталкиваются с вопросом: где именно описана логика создания подчиненного документа, откуда вызываются алгоритмы переноса строк табличных частей и как платформа связывает документ-основание с новым документом? Разберем детально, как устроен этот механизм в конфигураторе, где расположен исполняемый код и как управлять процессом программно.

Где настраивается связь между документами в метаданных

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

Рассмотрим по шагам, как проверить настройки связей в дереве метаданных:

  1. Откроем дерево метаданных конфигурации и найдем интересующий нас документ.
  2. Нажмем клавишу F2 или дважды кликнем по объекту, чтобы открыть окно редактирования метаданных.
  3. Перейдем на закладку «Ввод на основании».
  4. Проанализируем две доступные таблицы:
    1. Вводится на основании — список документов и справочников, на основании которых может формироваться данный документ.
    2. Является основанием для — список объектов, которые могут быть созданы на основании текущего документа.

Если нам необходимо найти код заполнения целевого документа (например, ПоступлениеТоваровУслуг, создаваемого по ЗаказПоставщику), логику следует искать в модуле целевого объекта, то есть того документа, который создается.

Событие ОбработкаЗаполнения в модуле объекта

При интерактивном нажатии пользователем кнопки ввода на основании платформа выполняет следующую последовательность действий:

  1. В оперативной памяти создается новый экземпляр целевого документа.
  2. В контексте сервера вызывается системное событие ОбработкаЗаполнения, расположенное в модуле объекта создаваемого документа.
  3. В эту процедуру в качестве параметра передается ссылка на документ-основание (или структура/массив значений).
  4. После завершения процедуры формируется и открывается экранная форма нового документа с уже заполненными данными.

Посмотрим на типовую структуру процедуры ОбработкаЗаполнения в модуле объекта:


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

КонецПроцедуры

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

Особенности заполнения табличных частей в типовых конфигурациях

В комплексных типовых конфигурациях (таких как УПП, Комплексная автоматизация или ERP) заполнение табличных частей редко сводится к простому построчному копированию данных из одного документа в другой. Проанализируем, как это реализовано на практике:

  1. Контроль остатков: При вводе поступления по заказу система обращается к регистрам накопления (например, ЗаказыПоставщикам) и считывает не исходный заказ, а фактически невыполненный остаток по нему.
  2. Разделение логики: Алгоритмы выборки данных и расчета цен обычно выносятся в отдельные процедуры и функции модуля объекта или общих модулей (например, ЗаполнитьТабличнуюЧастьПоОстаткам()), а в самой ОбработкаЗаполнения вызывается лишь точка входа.
  3. Параметр СтандартнаяОбработка: Если установить этот параметр в значение Ложь, платформа отключит автоматическое сопоставление одноименных реквизитов, передав управление исключительно коду разработчика.

Программный ввод на основании

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

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


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

Способы доработки механизма без изменения типового кода

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

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