Как исправить ошибку «В данной транзакции уже происходили ошибки» при обновлении УТП с версии 1.2.6 на 1.2.66.1

Программист 1С v8.3 (Обычные формы)
← На главную

При обновлении сильно устаревших конфигураций «1С:Управление торговым предприятием» (УТП) пользователи часто сталкиваются с ситуацией, когда после успешного объединения конфигурации в режиме Конфигуратор программа отказывается запускаться в режиме Предприятие. Ошибка обычно возникает на этапе выполнения служебных обработок, например, ЗаполнениеСинонимовОбъектов, и сопровождается сообщением: «В данной транзакции уже происходили ошибки!». Разберем детально, почему это происходит и как правильно провести обновление, если разрыв между версиями составляет более 10 лет.

Анализ причины возникновения ошибки

Рассмотрим ситуацию, описанную пользователем. При попытке выполнить метод ПолучитьОбъект() для предопределенного элемента справочника система выдает фатальную ошибку. Важно понимать, что сообщение «В данной транзакции уже происходили ошибки!» является следствием, а не первопричиной. Это означает, что ранее в рамках этой же транзакции (которую платформа открывает автоматически при запуске обработчиков обновления) произошел другой сбой, который «пометил» транзакцию как невалидную. Любое последующее обращение к базе данных будет вызывать именно этот текст ошибки.

Проанализируем фрагмент кода, на котором происходит остановка:


СсылкаНаЭлемент = ПолучитьПредопределенный(ТипСправочника, ЗаполняемыйСправочник, Имя);
Если СсылкаНаЭлемент = Неопределено Тогда
    Сообщить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Не найден предопределённый элемент %1 для справочника %2'"), Имя, ИмяОбъекта));
    Возврат;
КонецЕсли;
ТекущаяЗапись = СсылкаНаЭлемент.ПолучитьОбъект();

В данном случае метод ПолучитьПредопределенный возвращает ссылку, но при попытке получить объект по этой ссылке (ПолучитьОбъект()) происходит сбой. Основные причины такого поведения при «экстремальном» обновлении (с версии 1.2.6 на 1.2.66.1) заключаются в следующем:

  1. Изменение механизма предопределенных данных: За 10 лет платформа 1С перешла с версии 8.2 на 8.3. В новых версиях механизм связи объектов метаданных и данных в таблицах БД был существенно переработан. Появились новые свойства, такие как «Обновление предопределенных данных». При прямом обновлении через 60 релизов соответствие между уникальными идентификаторами (UUID) в конфигурации и в базе данных может нарушиться.
  2. Нарушение ссылочной целостности: Если в старой базе были «битые» ссылки или задублированные коды справочников, новые жесткие проверки платформы 8.3 блокируют запись объектов.
  3. Пропуск промежуточных обработчиков: Это самая главная причина. Каждое обновление содержит процедуры, которые реструктуризируют данные. Если обновиться «прыжком», данные в базе остаются в формате 2011 года, а программный код ожидает структуру 2022 года.

Метод 1: Поэтапное обновление (Рекомендуемый способ)

Выясним, как правильно организовать процесс, чтобы избежать ошибок транзакции. Никогда не пытайтесь обновить конфигурацию 1С, перепрыгивая через десятки релизов. Правильная стратегия заключается в последовательном обновлении через «контрольные точки».

Рассмотрим шаги для корректного перехода:

  1. Создание резервной копии: Перед любыми манипуляциями обязательно создайте выгрузку базы (.dt) или копию файла БД.
  2. Выбор промежуточных релизов: Для УТП (Украина) критически важно пройти через релизы, в которых менялись механизмы учета или структура глобальных модулей. Рекомендуется использовать цепочку релизов с шагом примерно в 10-15 выпусков (например, 1.2.19 -> 1.2.36 -> 1.2.54 -> 1.2.66).
  3. Запуск в режиме Предприятие: После каждого обновления конфигурации в Конфигураторе (F7) необходимо обязательно запускать программу в режиме 1С:Предприятие. При запуске система предложит выполнить «Процедуры обновления данных». Дождитесь их завершения. Только после того, как все фоновые и регламентные задания по обновлению завершены, можно приступать к следующему релизу.

Метод 2: Тестирование и исправление базы данных

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

Разберем последовательность действий в Конфигураторе:

После завершения тестирования попробуйте снова запустить режим Предприятие. Это может помочь, если ПолучитьОбъект() вызывал ошибку из-за отсутствия фактической записи в таблице БД при наличии ссылки.

Метод 3: Очистка кэша и принудительное обновление предопределенных

Иногда ошибка «В данной транзакции уже происходили ошибки» кэшируется на уровне сеанса. Попробуем очистить локальный кэш пользователя. Для этого удалите базу из списка и добавьте её заново, либо вручную очистите папки в каталоге %AppData%\1C\1Cv8\.

Также проверим настройки обновления предопределенных данных. В Конфигураторе для проблемного справочника (например, «Валюты» или «Классификатор единиц измерения») посмотрим на свойство «Обновление предопределенных данных». Попробуйте временно установить его в значение Не обновлять, если ошибка происходит на этапе инициализации первичных данных, чтобы «проскочить» проблемный участок кода.

Метод 4: Локализация ошибки через отладчик

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

  1. В Конфигураторе установите точку останова в процедуре ЗаполнитьСправочник обработки ЗаполнениеСинонимовОбъектов перед строкой ТекущаяЗапись = СсылкаНаЭлемент.ПолучитьОбъект();.
  2. Запустите отладку.
  3. Когда программа остановится, посмотрите значение переменной ИмяОбъекта и Имя. Это подскажет нам, в каком справочнике кроется проблема.
  4. Часто оказывается, что в базе уже есть элемент с таким же кодом или наименованием, как у предопределенного, который система пытается обновить. В этом случае поможет ручное переименование дубля в режиме Предприятие (если база дает войти) или использование обработки «Поиск и замена дублей».

Важное замечание: В коде обработки мы видим использование функции КодЭлементаУникален. Если вы обновляетесь с очень старой версии, алгоритмы проверки уникальности могли измениться. Рассмотрим фрагмент:


Если НЕ КодЭлементаУникален("Справочник."+ИмяОбъекта,ТекущаяЗапись.Код,СсылкаНаЭлемент) Тогда
    ТекущаяЗапись.УстановитьНовыйКод();
КонецЕсли;

Если метод УстановитьНовыйКод() не может подобрать уникальный код из-за замусоренности справочника, это также приведет к ошибке при последующей попытке ТекущаяЗапись.Записать(), что и вызовет блокировку транзакции.

Резюме

Подводя итог, можно сказать, что обновление 1С — это не просто замена метаданных, а сложный процесс трансформации данных. Чтобы успешно обновить УТП с 2011 до 2022 года, необходимо:

  1. Действовать поэтапно, не пропуская промежуточные релизы.
  2. Обязательно выполнять обработчики обновления в пользовательском режиме на каждой контрольной точке.
  3. Перед началом процесса провести полное тестирование и исправление исходной базы.

Соблюдение этих правил позволит избежать технических сбоев и гарантирует корректную работу всех механизмов обновленной конфигурации.

← На главную