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

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

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

Выясним причину, почему штатные события модуля объекта не подходят для решения этой задачи, и подробно разберем проверенные способы реализации постобработки.

Ограничения платформы 1С при записи объектов

Проанализируем, как платформа 1С обрабатывает события записи:

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

Рассмотрим основные архитектурные решения, позволяющие обойти эти ограничения.

Способ 1. Размещение кода сразу после метода Записать()

Если документ записывается или проводится программно (в обработке, модуле менеджера или регламентном задании), платформа 1С автоматически открывает и фиксирует транзакцию внутри вызова метода Записать() (при условии, что ранее не была явно вызвана инструкция НачатьТранзакцию()).

Посмотрим на пример кода:


// Запись документа вызывает внутреннюю транзакцию платформы
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

// Код на следующей строке выполняется строго ПОСЛЕ завершения транзакции
ОбработатьДокументПослеЗаписи(ДокументОбъект.Ссылка);

В этом случае процедура ОбработатьДокументПослеЗаписи гарантированно получает ссылку на зафиксированный в базе данных документ.

Способ 2. Очередь задач через регистр сведений или план обмена

Если документ записывается пользователем через интерфейс обычных форм или из произвольных точек системы, проанализируем подход с промежуточной регистрацией:

  1. В подписке на событие ПриЗаписи регистрируем ссылку на документ в специальном регистре сведений или узле плана обмена (с режимом Авторегистрация = Запретить).
  2. Так как запись в регистр происходит внутри той же транзакции, при любой ошибке или откате проведения запись в регистре автоматически отменится.
  3. С помощью регламентного задания или обработчика ожидания (ПодключитьОбработчикОжидания) периодически считываем записи из регистра и выполняем постобработку зафиксированных документов.

Способ 3. Запуск фонового задания с использованием управляемой блокировки

Рассмотрим еще один эффективный алгоритм синхронизации процессов:

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

Способ 4. Механизмы БСП и Менеджер истории данных

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

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

← На главную