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

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

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

Понимание проблемы транзакций

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

Решение через Подписки на события

Одним из самых эффективных способов перехватить момент изменения проведения является использование ПодпискиНаСобытия. Рассмотрим, как это реализовать:

  1. Создаем подписку на событие ПриЗаписи для документа.
  2. В обработчике события, если документ не проведен, вызываем принудительную запись движений, чтобы гарантировать обновление таблиц базы данных.

Разберем пример кода для такой подписки:


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

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

Использование фоновых заданий для гарантии

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

  1. В основном коде, где отменяется проведение, мы инициируем запуск фонового задания.
  2. Передаем в задание ссылку на документ и, при необходимости, версию объекта или уникальный идентификатор транзакции.
  3. Фоновое задание, работая в отдельном сеансе, ожидает завершения транзакции основного сеанса (можно использовать блокировки для синхронизации).

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

Практические советы и рекомендации

При реализации этих механизмов придерживайтесь следующих правил:

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

← На главную