VeleX
@VeleX
Web - наше всё!

Как избежать вложенных транзакций при работе с подпиской на событие?

Доброго времени, коллеги.

Дано: Конфигурация УПП (хотя актуально для любой), документ "Поступление товаров и услуг" (также на его месте может быть любой другой), обработчик "При записи" в модуле данного документа и подписка на событие "ПриЗаписи" вообще любого документа в конфигурации.
Суть проблемы:
Необходимо провести определенную проверку при записи любого документа в системе (через подписку на событие). В большинстве случаев, обработка проходит нормально. Но за исключением создания/заполнения СФ при записи документа "Поступление".
Т.е. При записи док-та "Поступление" открывается транзакция (Транзакция А), в ходе которой заполняется документ СФ, при записи которого открывается Транзакция Б (в ходе работы подписки на событие). В транзакции Б возникает исключение (проверка нашла косяк пользователя), соответственно при попытке закрытия транзакции А возникает исключение "В данной транзакции уже происходили ошибки!".
Конструкции "Попытка... Исключение" я не использую. Транзакции запускаются на уровне платформы.
Обработчик проверки по многим причинам должен быть именно на событии ПриЗаписи документа.

Можете что-либо посоветовать как можно избежать вложенных транзакций, или хотя бы корректно обрабатывать исключения в них?
Заранее благодарю!
  • Вопрос задан
  • 415 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Dementor
программист, архитектор, аналитик
1) Вложенный транзакций в 1С не существует! Синтаксически можно сделать "матрешку", но она будет только в коде и в голове программиста. На деле при откате транзации из любого уровня вложенности происходит откат транзакции верхнего уровня.
2) Механизм подписок на события при записи работает в рамках общей транзакции записи объектов в базу. Любая ошибка в подписках этого типа приведет к общей отмене записи.
3) Исключения нужно обрабатывать с помощью конструкций Попытки.

В вашем случае нужно писать вашу счет-фактуру в базу через попытку; сообщение с ошибкой можно получить кратко или полно с помощью ИнформацияОбОшибке() или более простого ОписаниеОшибки() ; далее в зависимости от бизнес-логики или сообщить пользователю про ошибку, или записать проблему в лог (журнал регистрации) для дальнейшего анализа.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы