Перейти к содержимому

Транзакции держите короткими: внутри — только работа с данными ИБ. Запрещены внутри транзакции:

  • обращения к внешним системам (HTTP-вызовы, отправка почты, файловые операции по сети);
  • интерактивные действия и ожидания (диалоги, Приостановить);
  • долгие вычисления, которые можно выполнить до начала транзакции.

Оформление — только каноничным шаблоном: НачатьТранзакцию() перед Попытка, ЗафиксироватьТранзакцию()последним оператором блока Попытка, ОтменитьТранзакцию() — первым в Исключение, затем ВызватьИсключение;.

Пока транзакция открыта, удерживаются блокировки: все параллельные сеансы, которым нужны те же данные, ждут. Долгая транзакция с HTTP-вызовом внутри означает, что таймаут внешней системы (30–300 секунд) становится временем блокировки ваших документов — очередь проведения, ошибки «конфликт блокировок», зависшие сеансы. Нарушенный шаблон (фиксация вне Попытка, отсутствие отката) оставляет транзакцию открытой или прячет ошибку.

В 1С нет настоящих вложенных транзакций: НачатьТранзакцию() внутри уже открытой транзакции лишь увеличивает счётчик, а реальная фиксация происходит на самом внешнем ЗафиксироватьТранзакцию(). Отсюда два следствия:

  • ОтменитьТранзакцию() на любом уровне вложенности помечает на откат всю транзакцию, а не «свой» кусок;
  • исключение, проглоченное внутри вложенного блока, не спасает внешнюю транзакцию — она уже помечена, и внешняя фиксация упадёт с «В данной транзакции уже происходили ошибки».

Каждая процедура, работающая с транзакцией, использует каноничный шаблон и пробрасывает исключение наружу — тогда вложенные вызовы безопасны: любой сбой докатывается до внешнего уровня и откатывает всё целиком. Решение «часть данных необязательна» принимается структурой вызовов (две транзакции), а не проглатыванием ошибки внутри одной.

Исключений из шаблона оформления нет. Для длительности: если бизнес-операция требует записи во внешнюю систему «атомарно» с записью в ИБ — не растягивайте транзакцию, а стройте идемпотентный сценарий с повтором: записать локально → отправить вовне → отметить факт отправки.