Как исправить зацикливание при обновлении УТ 11.5 в процедуре обработки ставок НДС?

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

Обновление конфигурации 1С:Управление торговлей с версии 11.4 на 11.5 (а также аналогичных версий ERP и Комплексной автоматизации) — это сложный процесс, сопряженный с радикальным изменением архитектуры учета. Одной из самых распространенных и неприятных проблем является критическая ошибка при выполнении отложенных обработчиков обновления: "Произошло зацикливание процедуры обработки данных. Выполнение прервано".

Особенно часто эта ошибка проявляется в процедуре РегистрыСведений.АналитикаУчетаПартий.ОбработатьДанныеДляПереходаНаНовуюВерсию. В этой статье мы подробно разберем, почему это происходит, как диагностировать причину и какие программные методы помогут успешно завершить переход на новую версию.

Выясним причину: почему возникает зацикливание?

Начиная с версии 11.5, разработчики 1С перешли от использования жестко заданного перечисления Перечисления.СтавкиНДС к справочнику Справочники.СтавкиНДС. Это было сделано для реализации историчности ставок (возможность указывать периоды действия) и поддержки сложных расчетных механизмов. Процесс обновления должен автоматически сопоставить каждое значение из документов и регистров со ссылкой на новый справочник.

Механизм зацикливания в БСП (Библиотеке стандартных подсистем) работает так:

  1. Обработчик выбирает порцию записей (например, из регистра АналитикаУчетаПартий), где реквизит СтавкаНДС (справочник) еще не заполнен.
  2. Система пытается определить, какой элемент справочника создать на основе старого значения перечисления.
  3. Если в вашей конфигурации в перечисление СтавкиНДС была добавлена кастомная ставка (например, "22%"), типовой алгоритм 1С "не узнает" её. Он не создает элемент справочника и оставляет поле пустым.
  4. Так как поле осталось пустым, при следующей итерации БСП снова выбирает эти же записи. Процесс повторяется бесконечно, пока счетчик циклов не достигнет предела и система не выдаст исключение о зацикливании.

Проанализируем ситуацию с кастомными ставками

Если ваша база эксплуатировалась в условиях специфического законодательства или в нее вносились изменения программистами, скорее всего, в перечислении СтавкиНДС присутствуют лишние значения. Например, ставка 22% или специфические расчетные ставки. Типовое обновление 11.5 рассчитано только на стандартный набор (0%, 10%, 18%, 20% и их расчетные аналоги).

Чтобы решить проблему, нам необходимо вмешаться в процесс заполнения справочника СтавкиНДС, чтобы система корректно обработала ваши уникальные значения. В качестве готового решения можно применить расширение для добавления новых ставок НДС в УТ 11.5 и ERP 2.5.

Решение 1: Программная доработка через механизм расширений

Рассмотрим пример кода, который необходимо внедрить в систему через расширение, используя аннотацию &ИзменениеИКонтроль. Нам нужно модифицировать процедуру, отвечающую за первоначальное наполнение справочника ставок.


&ИзменениеИКонтроль("ЗаполнитьСправочникСтавкиНДС")
Процедура ИНДСЗаполнитьСправочникСтавкиНДС()
    НачатьТранзакцию();
    Попытка
        // Добавляем обработку нашей кастомной ставки 22%
        // Сначала проверим, существует ли уже такая ставка в справочнике
        СтавкаНДС22 = УчетНДСРФВызовСервера.СтавкаНДСПоЗначениюПеречисления(
            Перечисления.СтавкиНДС.НДС22, Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС);

        Если СтавкаНДС22.Пустая() Тогда
            СтавкаНДС22_Объект = Справочники.СтавкиНДС.СоздатьЭлемент();
        Иначе
            СтавкаНДС22_Объект = СтавкаНДС22.ПолучитьОбъект();
        КонецЕсли;

        СтавкаНДС22_Объект.Наименование = "22%";
        СтавкаНДС22_Объект.Ставка = 22;
        СтавкаНДС22_Объект.Страна = Справочники.СтраныМира.Россия;
        СтавкаНДС22_Объект.НачалоПериода = Дата(2026, 01, 01);
        СтавкаНДС22_Объект.ПеречислениеСтавкаНДС = Перечисления.СтавкиНДС.НДС22; 
        
        // Обязательно заполняем типы налогообложения, иначе ставка не подберется
        СтавкаНДС22_Объект.ТипыНалогообложенияНДС.Очистить();
        НоваяСтрока = СтавкаНДС22_Объект.ТипыНалогообложенияНДС.Добавить();
        НоваяСтрока.ТипНалогообложенияНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
        
        ОбновлениеИнформационнойБазы.ЗаписатьДанные(СтавкаНДС22_Объект);
        
        // Аналогично нужно обработать расчетную ставку (22/122), если она есть
        // ... (аналогичный код для расчетной ставки)
        
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Важный момент: При создании элемента справочника вручную или через код крайне важно заполнять табличную часть ТипыНалогообложенияНДС. Именно по этой таблице система в дальнейшем сопоставляет данные в регистрах. Если вы просто создадите элемент с наименованием "22%", но не укажите тип налогообложения, обработчик обновления его не увидит и зацикливание продолжится.

Решение 2: Оптимизация процесса обновления на больших базах

Если в вашей базе сотни тысяч или миллионы записей в регистре АналитикаУчетаПартий, даже при отсутствии ошибок обновление может идти очень долго. Рассмотрим, как ускорить этот процесс:

  1. Управление количеством потоков: По умолчанию система запускает обновление в максимально возможное количество потоков. При обработке тяжелых регистров это часто приводит к взаимоблокировкам (Deadlocks). В настройках обновления (через форму "Результаты обновления" -> "Настройка потоков") рекомендуется установить количество потоков равным 1 или 2 для проблемного обработчика.
  2. Промежуточные релизы: Опытные специалисты рекомендуют не прыгать через слишком много версий сразу. Если переход с 11.4.13 на 11.5.7 вызывает зацикливание, попробуйте сначала обновиться до последнего релиза ветки 11.4 (например, 11.4.14), а затем переходить на более свежие релизы 11.5 (например, 11.5.12+), где механизмы перехода были существенно доработаны.
  3. Очистка дублей аналитики: Перед обновлением проанализируйте регистр АналитикаУчетаПартий. Если в нем есть записи с одинаковыми ключами аналитики, но разными ставками НДС, это может вызвать конфликт уникальности при попытке записи обновленных данных.

Разберем по шагам: что делать, если база уже "встала"?

Если вы уже запустили обновление и получили ошибку зацикливания, выполните следующие действия:

  1. Остановите выполнение всех регламентных заданий обновления.
  2. С помощью консоли запросов или анализа метаданных найдите в Перечисления.СтавкиНДС значения, которые не являются типовыми.
  3. Создайте расширение и переопределите процедуру заполнения справочника, как показано в примере выше, добавив логику для ваших кастомных ставок.
  4. Вручную запустите процедуру заполнения справочника (можно через обработку "Консоль кода").
  5. Сбросьте статус выполнения проблемного обработчика в регистре сведений ОбновлениеИнформационнойБазы (установите статус "Не выполнялся") и запустите отложенное обновление заново.

Использование комплексного подхода — программной корректировки справочника и правильной настройки потоков — гарантирует успешный переход на УТ 11.5 даже при наличии значительных кастомизаций в учете НДС. Для контроля и перезапуска процедур после исправления ошибок пригодится обработка для принудительного выполнения отложенного обновления информационной базы.

← На главную