При разработке и отладке механизмов проведения документов в платформе 1С:Предприятие критически важно точно понимать, в каком порядке платформа вызывает события в модуле формы, модуле объекта и модулях наборов записей регистров. Непонимание этого порядка приводит к ошибкам при проверке заполнения реквизитов, неверному расчету остатков или некорректной работе транзакций.
Разберем детально, какие процедуры и в какой очередности выполняются при интерактивном и программном перепроведении документов для управляемых и обычных (неуправляемых) форм.
Рассмотрим порядок вызова процедур, когда пользователь нажимает кнопку «Провести и закрыть» или «Провести» в открытой управляемой форме уже проведенного документа:
ПередЗаписью(&НаКлиенте) — проверка условий на стороне клиента, интерактивные вопросы пользователю.ПередЗаписьюНаСервере(&НаСервере) — подготовка данных на сервере перед открытием транзакции записи.ПередЗаписью — проверка реквизитов, инициализация дополнительных свойств. На этом этапе срабатывают и подписки на событие ПередЗаписью.ПриЗаписи — документ записывается в базу данных (внутри транзакции). Срабатывают подписки на событие ПриЗаписи.Удалять автоматически).ОбработкаПроведения — формирование новых движений по регистрам, выполнение проверок остатков и алгоритмов проведения. Срабатывают подписки на событие ОбработкаПроведения.ПередЗаписью и ПриЗаписи для каждого формируемого набора записей.ПриЗаписиНаСервере(&НаСервере) — постобработка данных формы в контексте транзакции.ПослеЗаписиНаСервере(&НаСервере) — действия после успешного сохранения данных вне транзакции.ПослеЗаписи(&НаКлиенте) — клиентские действия после успешного завершения записи и проведения (например, оповещение других форм).В конфигурациях на обычных формах (например, 1С:УПП 1.3 или 1С:КА 1.1) разделение на клиентский и серверный контекст отсутствует, а цепочка вызовов выглядит следующим образом:
ПередЗаписью — проверка реквизитов формы до начала транзакции.ПередЗаписью — проверка и подготовка данных объекта.ПриЗаписи — запись шапки и табличных частей документа в информационную базу.ОбработкаПроведения — расчет и формирование движений документа.ПриЗаписи — обработка данных в форме внутри транзакции.ПослеЗаписи — завершающие действия формы после фиксации изменений.Если перепроведение документа выполняется программно через метод Записать(), события модуля формы не вызываются вовсе. Проанализируем этот сценарий на примере кода:
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
В этом случае цепочка выполнения включает только следующие шаги:
ПередЗаписью и соответствующие подписки.ПриЗаписи и соответствующие подписки.ОбработкаПроведения и соответствующие подписки.ПередЗаписью и ПриЗаписи).Событие ОбработкаОтменыПроведения вызывается исключительно при явной отмене проведения документа (интерактивно через пункт меню «Отменить проведение» или программно с параметром РежимЗаписиДокумента.ОтменаПроведения). При повторном проведении (перепроведении) данная процедура платформой не вызывается.
Очистка старых движений перед новым проведением регулируется свойством документа «Удаление движений»:
ОбработкаПроведения.Движения[ИмяРегистра].Записывать = Истина.Если на любом из этапов внутри транзакции (в процедурах ПередЗаписью, ПриЗаписи, ОбработкаПроведения или в подписках на события) параметр Отказ устанавливается в значение Истина либо возникает необработанное исключение, платформа производит полный откат транзакции. Изменения реквизитов документа и сформированные движения регистров в базе данных не сохраняются.