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