Перейти к содержанию

Метод "НачатьТранзакцию" должен располагаться непосредственно перед оператором "Попытка"

Метод НачатьТранзакцию должен быть за пределами блока Попытка-Исключение непосредственно перед оператором Попытка.

Код, который начинает транзакцию, обязан завершить или откатить ее. В случаях когда метод НачатьТранзакцию() находится внутри блока Попытка-Исключение есть риск нарушения парности вызовов НачатьТранзакцию()-ЗафиксироватьТранзакцию(), что может привести к трудно анализируемым ошибкам времени выполнения типа "В этой транзакции уже происходили ошибки."

Неправильно:

Процедура Тест()
    Попытка
        ПодготовкаДанных();
        НачатьТранзакцию(); // ошибка
        СложнаяФункция();
    Исключение
    КонецПопытки;
КонецПроцедуры

Правильно:

НачатьТранзакцию();
Попытка
    СложнаяФункция();
    ЗафиксироватьТранзакцию();
Исключение
    Если ТранзакцияАктивна() Тогда
        ОтменитьТранзакцию();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;

См. также: * Транзакции: правила использования * Вы не умеете работать с транзакциями