При выполнении отложенных процедур обновления информационной базы в конфигурациях на базе Библиотеки стандартных подсистем (в частности, в «1С:Управление торговлей 11») разработчики и администраторы могут столкнуться с аварийным завершением регламентного задания или обработчика обновления со следующей диагностической ошибкой:
ОбработатьКлассификаторОрганизацийЕГАИСДляУстановкиСоответствий: Открытая внутри обработчика обновления транзакция осталась активной.
Выясним причину такого поведения платформы и разберем по шагам, как локализовать и устранить данную неполадку.
Проанализируем механизм контроля транзакций, встроенный в подсистему «Обновление информационной базы» (БСП):
ВТранзакции(). Если функция возвращает значение Истина, платформа принудительно прерывает процесс и выбрасывает исключение, чтобы не допустить зависания блокировок базы данных и сохранения несогласованной информации.НачатьТранзакцию(), однако парный вызов метода ЗафиксироватьТранзакцию() или ОтменитьТранзакцию() не произошел из-за логической ошибки (например, преждевременного выхода из цикла по Продолжить, Возврат или некорректно обработанной конструкции Попытка ... Исключение).КлассификаторОрганизацийЕГАИС, что приводит к переходу алгоритма в непредусмотренную ветку условий без фиксации изменений.Посмотрим на классический пример корректного управления транзакциями в платформе 1С:
ВыборкаТоваров = Справочники.Номенклатура.Выбрать();
НачатьТранзакцию();
Пока ВыборкаТоваров.Следующий() Цикл
ТоварОбъект = ВыборкаТоваров.ПолучитьОбъект();
ЗакупочнаяЦена = ТоварОбъект.ЗакупочнаяЦена;
Если ЗакупочнаяЦена <> 0 Тогда
ТоварОбъект.ЗакупочнаяЦена = ЗакупочнаяЦена * 1.05;
ТоварОбъект.Записать();
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Если внутри цикла происходит непредвиденный выход или исключение без явной отмены транзакции, она остается открытой, вызывая блокировку и системную ошибку при контрольной проверке БСП.
Чтобы не снимать конфигурацию с полной типовой поддержки, исправление процедуры обработчика можно выполнить с помощью механизма расширений.
ОбработатьКлассификаторОрганизацийЕГАИСДляУстановкиСоответствий, и добавим метод в расширение с аннотацией &Вместо или &ИзменениеИКонтроля.
НачатьТранзакцию();
Попытка
// Алгоритм обработки данных классификатора ЕГАИС
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Если механизм расширений недоступен или не используется, разберем порядок прямой правки конфигурации:
.dt или сделаем копию файла 1Cv8.1CD (для файлового режима).ОбработатьКлассификаторОрганизацийЕГАИСДляУстановкиСоответствий и скорректируем условия завершения транзакции.Поскольку подобные ошибки в типовых обработчиках оперативно устраняются разработчиками «1С» в последующих сборках или официальных патчах (исправлениях EF_...), оптимальным решением может стать накат следующего подверсионного релиза (например, переход с релиза 11.3.3.231 на более актуальный релиз ветки 11.3 или 11.4), где процедура обработки классификатора уже содержит исправление баланса транзакций.
Рассмотрим дополнительные превентивные меры, которые помогают устранить условия возникновения сбоя:
КлассификаторОрганизацийЕГАИС на наличие битых ссылок и дублирующихся записей, очистив некорректные элементы типовой обработкой «Поиск и удаление дублей».