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