Как исправить ошибку «Открытая внутри обработчика обновления транзакция осталась активной» при обновлении 1С:Управление торговлей?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

При выполнении отложенных процедур обновления информационной базы в конфигурациях на базе Библиотеки стандартных подсистем (в частности, в «1С:Управление торговлей 11») разработчики и администраторы могут столкнуться с аварийным завершением регламентного задания или обработчика обновления со следующей диагностической ошибкой:

ОбработатьКлассификаторОрганизацийЕГАИСДляУстановкиСоответствий: Открытая внутри обработчика обновления транзакция осталась активной.

Выясним причину такого поведения платформы и разберем по шагам, как локализовать и устранить данную неполадку.

Причины возникновения ошибки

Проанализируем механизм контроля транзакций, встроенный в подсистему «Обновление информационной базы» (БСП):

  1. Проверка подсистемы БСП: После вызова каждого обработчика обновления подсистема выполняет проверку состояния транзакции с помощью функции ВТранзакции(). Если функция возвращает значение Истина, платформа принудительно прерывает процесс и выбрасывает исключение, чтобы не допустить зависания блокировок базы данных и сохранения несогласованной информации.
  2. Нарушение баланса транзакций в коде: В исходном коде процедуры был выполнен вызов НачатьТранзакцию(), однако парный вызов метода ЗафиксироватьТранзакцию() или ОтменитьТранзакцию() не произошел из-за логической ошибки (например, преждевременного выхода из цикла по Продолжить, Возврат или некорректно обработанной конструкции Попытка ... Исключение).
  3. Специфика данных: Ошибка часто проявляется только на базах с определенным набором данных — например, при наличии дублей, незаполненных реквизитов или некорректных ссылок в справочнике КлассификаторОрганизацийЕГАИС, что приводит к переходу алгоритма в непредусмотренную ветку условий без фиксации изменений.

Посмотрим на классический пример корректного управления транзакциями в платформе 1С:


ВыборкаТоваров = Справочники.Номенклатура.Выбрать();
НачатьТранзакцию();
Пока ВыборкаТоваров.Следующий() Цикл
    ТоварОбъект = ВыборкаТоваров.ПолучитьОбъект();
    ЗакупочнаяЦена = ТоварОбъект.ЗакупочнаяЦена;
    Если ЗакупочнаяЦена <> 0 Тогда
        ТоварОбъект.ЗакупочнаяЦена = ЗакупочнаяЦена * 1.05;
        ТоварОбъект.Записать();
    КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();

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

Способ 1. Исправление логики через расширение конфигурации (рекомендуемый)

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

  1. Создадим резервную копию информационной базы.
  2. В конфигураторе добавим новое расширение с назначением Адаптация или Исправление.
  3. Найдем модуль, содержащий процедуру ОбработатьКлассификаторОрганизацийЕГАИСДляУстановкиСоответствий, и добавим метод в расширение с аннотацией &Вместо или &ИзменениеИКонтроля.
  4. Скорректируем блок транзакции, гарантировав вызов фиксации или отмены в любых сценариях выполнения:

НачатьТранзакцию();
Попытка
    // Алгоритм обработки данных классификатора ЕГАИС
    
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;
КонецПопытки;
  1. Применим расширение и повторно запустим выполнение отложенных процедур обновления через панель администрирования или регламентное задание.

Способ 2. Исправление кода в конфигурации поставщика со снятием с поддержки

Если механизм расширений недоступен или не используется, разберем порядок прямой правки конфигурации:

  1. Создание бэкапа: Обязательно выполним выгрузку информационной базы в файл .dt или сделаем копию файла 1Cv8.1CD (для файлового режима).
  2. Включение возможности изменения: В меню «Конфигурация» откроем «Поддержка» -> «Настройка поддержки» и включим возможность изменения с сохранением поддержки.
  3. Локализация процедуры: Через глобальный поиск найдем метод ОбработатьКлассификаторОрганизацийЕГАИСДляУстановкиСоответствий и скорректируем условия завершения транзакции.
  4. Выполнение обновления: Запустим информационную базу в режиме предприятия и дождемся успешного завершения всех фоновых заданий обновления.
  5. Возврат на поддержку: После перехода на следующий стабильный релиз конфигурации, где ошибка устранена вендором, вернем типовой режим поддержки.

Способ 3. Переход на более свежий релиз конфигурации

Поскольку подобные ошибки в типовых обработчиках оперативно устраняются разработчиками «1С» в последующих сборках или официальных патчах (исправлениях EF_...), оптимальным решением может стать накат следующего подверсионного релиза (например, переход с релиза 11.3.3.231 на более актуальный релиз ветки 11.3 или 11.4), где процедура обработки классификатора уже содержит исправление баланса транзакций.

Способ 4. Проверка и нормализация данных

Рассмотрим дополнительные превентивные меры, которые помогают устранить условия возникновения сбоя:

  1. Выполним штатное Тестирование и исправление информационной базы в конфигураторе с установленными флагами проверки логической и ссылочной целостности.
  2. Проверим справочник КлассификаторОрганизацийЕГАИС на наличие битых ссылок и дублирующихся записей, очистив некорректные элементы типовой обработкой «Поиск и удаление дублей».
  3. В файловом режиме базы убедимся, что платформа 1С:Предприятие обновлена до актуальной стабильной сборки ветки 8.3.
← На главную