Какова последовательность выполнения процедур при перепроведении документа в 1С?

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

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

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

Последовательность событий при интерактивном перепроведении в управляемых формах

Рассмотрим порядок вызова процедур, когда пользователь нажимает кнопку «Провести и закрыть» или «Провести» в открытой управляемой форме уже проведенного документа:

  1. Модуль формы: ПередЗаписью(&НаКлиенте) — проверка условий на стороне клиента, интерактивные вопросы пользователю.
  2. Модуль формы: ПередЗаписьюНаСервере(&НаСервере) — подготовка данных на сервере перед открытием транзакции записи.
  3. Открытие неявной транзакции базы данных платформой.
  4. Модуль объекта: ПередЗаписью — проверка реквизитов, инициализация дополнительных свойств. На этом этапе срабатывают и подписки на событие ПередЗаписью.
  5. Модуль объекта: ПриЗаписи — документ записывается в базу данных (внутри транзакции). Срабатывают подписки на событие ПриЗаписи.
  6. Очистка старых движений (если в свойстве документа «Удаление движений» установлено значение Удалять автоматически).
  7. Модуль объекта: ОбработкаПроведения — формирование новых движений по регистрам, выполнение проверок остатков и алгоритмов проведения. Срабатывают подписки на событие ОбработкаПроведения.
  8. Модули наборов записей регистров: вызов событий ПередЗаписью и ПриЗаписи для каждого формируемого набора записей.
  9. Модуль формы: ПриЗаписиНаСервере(&НаСервере) — постобработка данных формы в контексте транзакции.
  10. Фиксация транзакции базы данных платформой.
  11. Модуль формы: ПослеЗаписиНаСервере(&НаСервере) — действия после успешного сохранения данных вне транзакции.
  12. Модуль формы: ПослеЗаписи(&НаКлиенте) — клиентские действия после успешного завершения записи и проведения (например, оповещение других форм).

Последовательность событий при перепроведении в обычных (неуправляемых) формах

В конфигурациях на обычных формах (например, 1С:УПП 1.3 или 1С:КА 1.1) разделение на клиентский и серверный контекст отсутствует, а цепочка вызовов выглядит следующим образом:

  1. Модуль формы: ПередЗаписью — проверка реквизитов формы до начала транзакции.
  2. Открытие неявной транзакции базы данных.
  3. Модуль объекта: ПередЗаписью — проверка и подготовка данных объекта.
  4. Модуль объекта: ПриЗаписи — запись шапки и табличных частей документа в информационную базу.
  5. Очистка старых движений по регистрам.
  6. Модуль объекта: ОбработкаПроведения — расчет и формирование движений документа.
  7. Модуль формы: ПриЗаписи — обработка данных в форме внутри транзакции.
  8. Фиксация транзакции базы данных.
  9. Модуль формы: ПослеЗаписи — завершающие действия формы после фиксации изменений.

Порядок выполнения при программном перепроведении

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


ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);

В этом случае цепочка выполнения включает только следующие шаги:

  1. Открытие транзакции записи.
  2. Модуль объекта: ПередЗаписью и соответствующие подписки.
  3. Модуль объекта: ПриЗаписи и соответствующие подписки.
  4. Очистка движений (при автоматическом удалении).
  5. Модуль объекта: ОбработкаПроведения и соответствующие подписки.
  6. Запись наборов записей движений регистров (с вызовом их событий ПередЗаписью и ПриЗаписи).
  7. Фиксация транзакции.

Вызывается ли ОбработкаОтменыПроведения при перепроведении?

Событие ОбработкаОтменыПроведения вызывается исключительно при явной отмене проведения документа (интерактивно через пункт меню «Отменить проведение» или программно с параметром РежимЗаписиДокумента.ОтменаПроведения). При повторном проведении (перепроведении) данная процедура платформой не вызывается.

Очистка старых движений перед новым проведением регулируется свойством документа «Удаление движений»:

  1. Удалять автоматически — платформа сама очищает старые записи регистров перед вызовом процедуры ОбработкаПроведения.
  2. Не удалять автоматически или Удалять при отмене проведения — разработчик должен самостоятельно очищать движения или управлять флагом Движения[ИмяРегистра].Записывать = Истина.

Отказ от проведения и обработка ошибок

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

← На главную