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