Как исправить ошибку: «В данной транзакции уже происходили ошибки!»
В процессе отладки кода я, вероятно, как и многие разработчики, часто сталкиваюсь с различными ошибками. А если речь идет о поддержке систем с серьезными и масштабными доработками, то неприятное окно с красным крестиком может появиться даже в процессе деятельности пользователя. Любую ошибку в работе программы всегда хочется устранить как можно быстрее. Поэтому важно понимать, что именно привело к исключительной ситуации. И самое неприятное в этом случае – видеть ошибку, которая не содержит никакой информации о причинах произошедшего, а вместо это дает расплывчатую фразу: «В данной транзакции уже происходили ошибки!». Что это за зверь и с чем его едят, я расскажу в этой статье. Поделюсь своим опытом в понимании и решении подобных ошибок.
Что такое транзакция
Немного погружения в теорию. Транзакция представляет собой набор действий, которые должны выполняться исключительно вместе, иначе они теряют смысл. Приведу простой пример. Для решения задачи необходимо создать комплект из 5 документов. Если выполнять данную разработку без использования транзакций, то можно столкнуться с ситуацией, когда 2 документа были успешно созданы, а третий упал в ошибку при записи, прерывая дальнейшее выполнение кода. В конечном итоге мы получим только 2 документа в системе. Повторное успешное выполнение кода приведет к тому, что будут созданы все 5 документов, но при этом в базе останутся 2 документа от первой неудачной попытки, хотя в данной ситуации нам нужно было отменить их создание. Для этого и нужно использовать транзакции. Они позволяют в исключительных ситуациях вернуть данные в исходное состояние.
Почему в данной транзакции уже происходили ошибки?
Что такое транзакция мы уже разобрались. Кажется, они должны нести только пользу в сложных разработках, но почему вместо этого можно получить ошибку с непонятным содержанием? Ответ кроется в неправильном использовании транзакций. Корректная схема работ с любой транзакцией должна содержать начало, точку фиксации и точку отмены в случае ошибки, как показано в примере 1.
Пример 1
Любая ошибка в работе с данными базы должна приводить к отмене транзакции. На практике в доработанном коде часто можно увидеть пропущенный метод фиксирования или отмены, а также неправильное размещение этих методов. Если после возникновения исключительной ситуации до отмены транзакции снова выполнить любую операцию над данными, то мы получим именно то, что меньше всего хотим увидеть в результате работы: «В данной транзакции уже происходили ошибки!».
Пример 2
В примере 2 «действие над данными 2» приведет к некорректному выполнению транзакции и вышеупомянутой ошибки.
Еще немного о работе с вложенными транзакциями
С правильной организацией транзакции разобрались.
На этом все?
Не совсем.
Корректная схема организации работы с транзакциями безусловно поможет избежать многих исключительных ситуаций при работе с ними, но не всех. Правильного размещения начала, фиксации и отмены будет достаточно, если ведется полностью независимая разработка. Например, создана небольшая внешняя обработка или независимая команда. На практике часто приходится дорабатывать метод, который вызывается из другого метода, который вызывается из другого метода, который вызывается из другого метода… И так до бесконечности. А еще регулярно приходится вызывать другие готовые методы, которые могут открывать транзакции. В такой ситуации одна транзакция может стать частью другой, что снова приведет к «уже происходившим ошибкам» или ошибкам при фиксации и отмене транзакции. 1С не поддерживает вложенные транзакции, поэтому отмена одной транзакции внутри другой приводит к исключительным ситуациям. Это значит, что работая с транзакцией, необходимо проверять, в каком состоянии она находится.
Пример 3
В примере 3 приведен код, который позволяет избежать открытия одной транзакции внутри другой, ведь не всегда это можно увидеть сразу по коду в рамках одной процедуры. Транзакция могла быть открыта в любом из вызываемых ранее методов и вложенных в них методов.
Пример 4
А код из примера 4 позволит избежать ошибки в случае, если вызванный метод упал в ошибку и уже отметил нашу транзакцию.
Транзакция — это не страшно
Иногда кажется, что проще отказаться от использования чего-то, чтобы впоследствии не иметь дело с непонятными ошибками. Однако, использование транзакций очень полезно при разработке сложных решений. Соблюдение нескольких простых правил поможет организовать грамотное решений по работе с данными, а также быстрее разобраться с проблемой, когда видишь на экране: «В данной транзакции уже происходили ошибки!».
Подпишитесь на Телеграм-канал, чтобы быть в курсе