Решение задач 1С:Предприятие 8 на примерах

«В данной транзакции уже происходили ошибки» в 1С: причины и решение

Ошибки 1СОшибки в кодеОпубликовано

Внутри транзакции уже произошло исключение, транзакция помечена как ошибочная, а код продолжил работать с базой. Любая следующая операция с данными в такой транзакции выдаёт это сообщение.

Текст ошибки

В данной транзакции уже происходили ошибки!

Причины

Почему так происходит

Платформа откатывает изменения транзакции целиком. Если внутри транзакции что-то сломалось, зафиксировать её уже нельзя, даже если исключение было перехвачено. Поэтому настоящая причина — первая ошибка, а «В данной транзакции уже происходили ошибки» лишь следствие.

Как найти первую ошибку

  1. Откройте журнал регистрации и отберите события с уровнем «Ошибка» на время сбоя. Первая запись в серии обычно и есть причина.
  2. В конфигураторе включите остановку по ошибке: «Отладка» → «Остановка по ошибке», без фильтра по тексту. Отладчик остановится на первом исключении, даже если оно перехвачено.
  3. Посмотрите обработчики, которые выполняются в той же транзакции: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, подписки на события, расширения.

Правильный шаблон транзакции

Если исключение внутри транзакции перехвачено, транзакцию нужно отменить и, как правило, пробросить исключение дальше:

НачатьТранзакцию();
Попытка
    ЗаписатьШапку(Данные);
    ЗаписатьТовары(Данные);
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ЗаписьЖурналаРегистрации("Загрузка данных", УровеньЖурналаРегистрации.Ошибка,,,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    ВызватьИсключение;
КонецПопытки;

Чего делать нельзя

НачатьТранзакцию();
Для Каждого Элемент Из Список Цикл
    Попытка
        Элемент.ПолучитьОбъект().Записать();
    Исключение
        // ошибка проглочена, цикл продолжается -
        // следующая запись выдаст «уже происходили ошибки»
    КонецПопытки;
КонецЦикла;
ЗафиксироватьТранзакцию();

Если нужно записать как можно больше объектов, пропуская проблемные, используйте отдельную транзакцию на каждый объект, а не одну общую.

Отказ вместо исключения

В обработчиках ПередЗаписью и ОбработкаПроверкиЗаполнения для отказа от записи используйте параметр Отказ = Истина и сообщение пользователю. Тогда вызывающий код получит понятную ошибку записи, а не цепочку исключений.

Для пользователя

Ошибка почти всегда указывает на проблему в коде или в данных, которые обрабатываются одной операцией. Повторите действие для одного документа, чтобы найти проблемный объект, и передайте администратору время сбоя для поиска в журнале регистрации.

Если ошибка появляется при групповом перепроведении или загрузке данных, запустите операцию на меньшем периоде или для меньшего числа объектов. Так проще найти документ, на котором возникает первая ошибка, и исправить именно его.

Частые вопросы

Можно ли просто убрать Попытку?

Тогда исключение дойдёт до пользователя с настоящей причиной, и разбираться станет проще. Но правильнее оставить перехват с ОтменитьТранзакцию() и ВызватьИсключение, чтобы сохранить запись в журнал.

Транзакцию я не открывал. Откуда она?

Платформа сама открывает транзакцию при записи и проведении объекта. Всё, что выполняется в обработчиках записи и подписках, идёт внутри неё.

Запись в регистр сведений 1С программно: менеджер записи, набор записей и удаление

Алгоритмы

Разбор записи в регистр сведений из кода 1С: когда брать менеджер записи, а когда набор с отбором, как удалить запись или очистить регистр и почему записи становятся неуникальными.

Регистры в 1С: виды регистров и движения документа по регистру накопления

Алгоритмы

Разбор видов регистров 1С и того, какой из них выбрать для задачи, с примерами кода: как документ делает движения по регистру накопления, как контролировать остатки и читать данные виртуальными таблицами.

Отладка в 1С: точки останова и отладка на сервере

Алгоритмы

Практическое руководство по отладчику 1С: точки останова, шаги, табло, остановка по ошибке, замер производительности и настройка отладки серверного кода и фоновых заданий.

Похожие ошибки