При обновлении сильно устаревших конфигураций «1С:Управление торговым предприятием» (УТП) пользователи часто сталкиваются с ситуацией, когда после успешного объединения конфигурации в режиме Конфигуратор программа отказывается запускаться в режиме Предприятие. Ошибка обычно возникает на этапе выполнения служебных обработок, например, ЗаполнениеСинонимовОбъектов, и сопровождается сообщением: «В данной транзакции уже происходили ошибки!». Разберем детально, почему это происходит и как правильно провести обновление, если разрыв между версиями составляет более 10 лет.
Рассмотрим ситуацию, описанную пользователем. При попытке выполнить метод ПолучитьОбъект() для предопределенного элемента справочника система выдает фатальную ошибку. Важно понимать, что сообщение «В данной транзакции уже происходили ошибки!» является следствием, а не первопричиной. Это означает, что ранее в рамках этой же транзакции (которую платформа открывает автоматически при запуске обработчиков обновления) произошел другой сбой, который «пометил» транзакцию как невалидную. Любое последующее обращение к базе данных будет вызывать именно этот текст ошибки.
Проанализируем фрагмент кода, на котором происходит остановка:
СсылкаНаЭлемент = ПолучитьПредопределенный(ТипСправочника, ЗаполняемыйСправочник, Имя);
Если СсылкаНаЭлемент = Неопределено Тогда
Сообщить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Не найден предопределённый элемент %1 для справочника %2'"), Имя, ИмяОбъекта));
Возврат;
КонецЕсли;
ТекущаяЗапись = СсылкаНаЭлемент.ПолучитьОбъект();
В данном случае метод ПолучитьПредопределенный возвращает ссылку, но при попытке получить объект по этой ссылке (ПолучитьОбъект()) происходит сбой. Основные причины такого поведения при «экстремальном» обновлении (с версии 1.2.6 на 1.2.66.1) заключаются в следующем:
Выясним, как правильно организовать процесс, чтобы избежать ошибок транзакции. Никогда не пытайтесь обновить конфигурацию 1С, перепрыгивая через десятки релизов. Правильная стратегия заключается в последовательном обновлении через «контрольные точки».
Рассмотрим шаги для корректного перехода:
Если вы уже применили обновление и получили ошибку, попробуем восстановить целостность базы перед тем, как откатываться назад. Проанализируем состояние таблиц с помощью встроенных инструментов.
Разберем последовательность действий в Конфигураторе:
После завершения тестирования попробуйте снова запустить режим Предприятие. Это может помочь, если ПолучитьОбъект() вызывал ошибку из-за отсутствия фактической записи в таблице БД при наличии ссылки.
Иногда ошибка «В данной транзакции уже происходили ошибки» кэшируется на уровне сеанса. Попробуем очистить локальный кэш пользователя. Для этого удалите базу из списка и добавьте её заново, либо вручную очистите папки в каталоге %AppData%\1C\1Cv8\.
Также проверим настройки обновления предопределенных данных. В Конфигураторе для проблемного справочника (например, «Валюты» или «Классификатор единиц измерения») посмотрим на свойство «Обновление предопределенных данных». Попробуйте временно установить его в значение Не обновлять, если ошибка происходит на этапе инициализации первичных данных, чтобы «проскочить» проблемный участок кода.
Если предыдущие шаги не помогли, разберем ситуацию более глубоко. Нам нужно выяснить, на каком конкретно элементе происходит первый сбой, который «портит» транзакцию.
ЗаполнитьСправочник обработки ЗаполнениеСинонимовОбъектов перед строкой ТекущаяЗапись = СсылкаНаЭлемент.ПолучитьОбъект();.ИмяОбъекта и Имя. Это подскажет нам, в каком справочнике кроется проблема.Важное замечание: В коде обработки мы видим использование функции КодЭлементаУникален. Если вы обновляетесь с очень старой версии, алгоритмы проверки уникальности могли измениться. Рассмотрим фрагмент:
Если НЕ КодЭлементаУникален("Справочник."+ИмяОбъекта,ТекущаяЗапись.Код,СсылкаНаЭлемент) Тогда
ТекущаяЗапись.УстановитьНовыйКод();
КонецЕсли;
Если метод УстановитьНовыйКод() не может подобрать уникальный код из-за замусоренности справочника, это также приведет к ошибке при последующей попытке ТекущаяЗапись.Записать(), что и вызовет блокировку транзакции.
Подводя итог, можно сказать, что обновление 1С — это не просто замена метаданных, а сложный процесс трансформации данных. Чтобы успешно обновить УТП с 2011 до 2022 года, необходимо:
Соблюдение этих правил позволит избежать технических сбоев и гарантирует корректную работу всех механизмов обновленной конфигурации.