Переход с версии 1С:Управление торговлей 11.4 на 11.5 является одним из самых технически сложных этапов сопровождения системы. Одной из наиболее распространенных проблем является сбой отложенных обработчиков обновления информационной базы, особенно тех, которые касаются документов ПриобретениеТоваровУслуг и регистров накопления. Часто пользователи сталкиваются с ошибкой: «Произошло зацикливание процедуры обработки данных. Выполнение прервано». В этой статье мы подробно разберем, почему это происходит и как устранить причину зависания.
Для начала разберем механизм работы Библиотеки Стандартных Подсистем (БСП). Ошибка «Произошло зацикливание» генерируется системой автоматически, когда один и тот же объект (например, конкретный документ) попадает в выборку обработчика более 10 раз, но после попытки записи он всё равно остается помеченным как «необработанный». Рассмотрим ситуацию на примере модуля ОбновлениеИнформационнойБазыСлужебный.
Система пытается выполнить процедуру Документы.ПриобретениеТоваровУслуг.ОбработатьДанныеДляПереходаНаНовуюВерсию. В ходе этой процедуры документ открывается, заполняются новые реквизиты, и вызывается метод Записать(). Если в конфигурации или расширениях есть доработки, которые препятствуют корректной записи, БСП фиксирует неудачу и пробует снова в следующем потоке, что и приводит к бесконечному циклу.
Одной из ключевых причин зависания на этапе 11.5 является глобальное изменение структуры учета НДС. Рассмотрим основные моменты:
Перечисления (фиксированный список).СтавкиНДС.Проанализируем ситуацию: если в базе есть документы, где ставка НДС была не заполнена или имела некорректное значение (например, в документах организаций на патенте или упрощенке), типовой обработчик может «спотыкаться» об эти данные, пытаясь найти соответствие в справочнике, которого не существует. Для выявления проблемных участков и контроля результата можно использовать автоматическое сравнение бухгалтерских и налоговых проводок между базами 1С.
Наиболее часто решение кроется не в типовом коде, а в подписках на события или коде расширений. Рассмотрим механизм конфликта подробнее. В версии 11.5 многие реквизиты (например, связанные с условиями оплаты и сроками) были перенесены или переименованы (получили префикс Удалить...). Если у вас есть код в обработчике ПриЗаписи, который обращается к этим старым полям, возникает ошибка.
Пример проблемного кода, который может вызвать зацикливание:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Если в расширении остался старый код обращения к реквизиту
Если Объект.СрокОплаты = Дата(1, 1, 1) Тогда
// В версии 11.5 этот реквизит может быть уже неактуален или перемещен
Объект.СрокОплаты = ТекущаяДата();
КонецЕсли;
КонецПроцедуры
Когда обработчик обновления пытается записать документ ПриобретениеТоваровУслуг, срабатывает ваш код из расширения. Если запись не проходит из-за обращения к несуществующим или заблокированным полям, транзакция откатывается, документ не обновляется, и обработчик БСП запускает его снова. Рассмотрим, как это выявить.
Для эффективного решения задачи проанализируем последовательность действий программиста:
ЗавершитьВыполнениеОтложенногоОбработчика.Если автоматическое обновление зависло, мы можем попробовать выполнить процедуру для одного конкретного документа вручную через консоль кода. Это позволит увидеть точную ошибку записи в реальном времени. Рассмотрим пример такого кода:
// Выбираем один документ из тех, что зависли в обновлении
ДокументОбъект = Документы.ПриобретениеТоваровУслуг.НайтиПоНомеру("0000-000001", ТекущаяДата()).ПолучитьОбъект();
// Вызываем процедуру обновления из общего модуля (имя может меняться в зависимости от версии)
Параметры = Новый Структура;
Параметры.Вставить("Объект", ДокументОбъект);
Попытка
Документы.ПриобретениеТоваровУслуг.ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры);
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Документ успешно обновлен");
Исключение
Сообщить("Ошибка при обновлении: " + ОписаниеОшибки());
КонецПопытки;
Часто в списке зависших процедур фигурирует обработка регистра ТоварыКПоступлению. В УТ 11.5 изменилась концепция работы с неотфактурованными поставками. Если у вас зависла эта процедура, проанализируем следующие моменты:
Во-первых, проверьте наличие «битых» ссылок (Объект не обнаружен) в документах-основаниях. Если регистр пытается сослаться на удаленный заказ, процедура будет завершаться с ошибкой.
Во-вторых, убедитесь, что все документы ПриобретениеТоваровУслуг завершили свое обновление. Процедуры по регистрам накопления обычно зависят от успешного завершения обработки самих документов. Пока документы не «прожеваны» системой, регистры будут находиться в состоянии ожидания или выдавать ошибки зацикливания.
Подводя итог, можно сказать, что «зацикливание» при обновлении на УТ 11.5.7 чаще всего не является ошибкой в коде 1С. Это защитный механизм БСП, который сообщает вам о конфликте между данными обновления и вашими доработками. Главный совет: обращайте внимание на реквизиты, которые были изменены или удалены в новой версии. Если ваш код пытается программно заполнять СрокОплаты или специфические Ставки НДС через старые механизмы, обновление не завершится.
После того как вы исправите код в расширениях или удалите некорректные обработчики ПриЗаписи, отложенное обновление автоматически продолжит работу и успешно завершит обработку оставшихся документов. Для перезапуска или ускорения этого процесса можно воспользоваться обработкой для принудительного выполнения отложенного обновления информационной базы.