Сообщение «в данной транзакции уже происходили ошибки» — это одна из самых коварных диагностических надписей в системе 1С:Предприятие. Она не указывает на первопричину проблемы, а лишь констатирует факт: в текущем сеансе работы с базой данных что-то пошло не так еще до того, как система попыталась окончательно зафиксировать изменения. Рассмотрим детально, почему это происходит и как найти истинный источник сбоя, особенно в контексте конфигураций на обычных формах, таких как УПП 1.3.
Когда мы нажимаем кнопку «Записать» в карточке контрагента, платформа открывает транзакцию. Внутри этой транзакции выполняется не только запись самого элемента справочника Контрагенты, но и множество сопутствующих действий: проверка префиксов, запись в регистры сведений (например, «Контактная информация»), создание основных договоров, регистрация изменений для обмена данными и выполнение кода в подписках на события.
Если на любом из этих этапов возникает ошибка (например, нарушение уникальности индекса в SQL или деление на ноль в коде), платформа помечает транзакцию как ошибочную. Даже если программист предусмотрел блок Попытка — Исключение и «заглушил» ошибку, транзакция всё равно переходит в состояние Rollback Only. Любая последующая попытка обращения к базе данных в этой же транзакции вызовет сообщение «в данной транзакции уже происходили ошибки».
Первым делом нам необходимо поймать первичную ошибку, которая происходит «тихо» внутри системных или прикладных механизмов. Разберем, как правильно настроить инструмент:
Попытка — Исключение.После этой настройки попробуем снова записать контрагента. Отладчик должен остановиться на строке кода, которая вызывает первоначальный сбой. Часто это оказывается модуль РаботаСОбщимиПеременнымиПовтИсп или механизмы проверки уникальности кодов.
Проанализируем ситуацию, когда ошибка возникает после обмена данными (например, между УТ 10.3 и УПП 1.3). При миграции данных могут возникать конфликты, которые не видны при обычном интерактивном вводе:
ОбменДанными.Загрузка = Истина большинство прикладных проверок и подписок на события отключаются. Если ошибка исчезает, значит, проблема кроется в коде одной из подписок (например, при регистрации изменений для планов обмена).Выясним причину сбоя в сопутствующих механизмах. В УПП запись контрагента — это комплексный процесс. Проанализируем следующие области:
ДоговорыКонтрагентов. Если в нем не заполнены обязательные реквизиты (вид договора, организация, валюта), запись сорвется.ПовторноеИспользование (например, РаботаСОбщимиПеременнымиПовтИсп). Если инициализация параметра сеанса произошла с ошибкой внутри транзакции, последующие вызовы будут возвращать закэшированную ошибку.Если отладчик не дает ясного ответа (например, ошибка происходит на уровне SQL-сервера), воспользуемся технологическим журналом. Настроим сбор событий EXCP. Пример файла настройки logcfg.xml для поиска таких ошибок:
<config xmlns="http://v8.1c.ru/7.4/get/logcfg">
<log location="C:\LOGS\EXCP" history="24">
<event>
<eq property="Name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
Анализ логов ТЖ позволит увидеть текст ошибки, которую СУБД возвращает платформе 1С. Ищите строки, содержащие Transaction Rollback caused by exception или нарушения ограничений PRIMARY KEY.
Для решения проблемы «в данной транзакции уже происходили ошибки» всегда следуйте алгоритму «от общего к частному»: