Часто в процессе разработки возникает ситуация, когда при программном создании документов через транзакции отладчик показывает успешное выполнение всех строк кода, включая метод ЗафиксироватьТранзакцию(), однако в самой базе данных документ не появляется. Давайте вместе разберем, почему это происходит и как найти скрытую причину такого поведения системы.
Транзакционный механизм в 1С устроен таким образом, что все действия, выполненные между НачатьТранзакцию() и ЗафиксироватьТранзакцию(), являются неделимыми. Если в процессе выполнения этого блока происходит хотя бы одна критическая ошибка, платформа автоматически выполняет ОтменитьТранзакцию(). Проблема заключается в том, что если ваш код «проглатывает» исключение (например, через пустой блок Попытка...Исключение), вы можете не увидеть сообщения об ошибке, хотя вся транзакция уже была отменена системой.
Первым делом проанализируем, не блокирует ли запись документа логика платформы или конфигурации:
ПриЗаписи или ОбработкаПроведения содержит логику, которая при определенных условиях принудительно удаляет документ или вызывает ошибку.ОтменитьТранзакцию() в глубине процедур откатит всю внешнюю транзакцию целиком.Рассмотрим распространенную ошибку, связанную с созданием подчиненных объектов, например, счетов-фактур. Часто основной документ записывается успешно, а дочерний объект вызывает ошибку при записи. Если это происходит внутри блока Попытка, вы можете не узнать об этом.
Попробуйте временно убрать транзакцию из кода и выполнить создание документа. Если в этот момент «вылетит» явная ошибка платформы, значит, проблема была именно в некорректных данных или методах объекта. В рассматриваемом случае решение выглядело следующим образом:
// Пример того, где может скрываться ошибка
Попытка
ДокументОбъект.Записать();
// Часто ошибка возникает при записи связанных объектов, например, счета-фактуры
СчетФактура.Записать();
Исключение
// Если здесь пусто, вы никогда не узнаете, что транзакция прервалась
ЗаписьЖурналаРегистрации("Ошибка записи", ...);
КонецПопытки;
Разработчик, столкнувшийся с этой проблемой, обнаружил, что в коде создания счета-фактуры содержалась критическая ошибка. После того как он закомментировал проблемный участок или исправил логику формирования счета-фактуры, транзакция успешно завершилась и данные появились в базе.
Если простой перебор кода не помогает, проанализируем ситуацию с помощью профессиональных инструментов:
ERR и EXCP. Это позволит увидеть, какая именно строка кода вызвала исключение, которое привело к откату транзакции.Ложь, значит, транзакция была разорвана где-то раньше.При работе с транзакциями всегда придерживайтесь правила: никогда не оставляйте блоки Исключение пустыми. Обязательно выводите информацию об ошибке в журнал регистрации или в сообщение пользователю. Это сэкономит вам часы отладки в ситуациях, когда «код проходит, а документа нет». Помните, что «молчаливый» откат — это всегда признак того, что где-то возникла ошибка, которую система пытается скрыть от пользователя, но которая препятствует завершению транзакции.