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