Как исправить ошибку «Итератор для значения не определен» при обновлении ЗУП 3.1.8?

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

При переходе на новые релизы в программе 1С:Зарплата и Управление Персоналом (ЗУП) пользователи часто сталкиваются с непредвиденными сбоями во время работы отложенных обработчиков обновления. Одна из таких критических ошибок — «Итератор для значения не определен». Сбой происходит при первом запуске информационной базы после обновления конфигурации с релиза 3.1.8.185 до версий 3.1.8.214, 3.1.8.216 или аналогичных.

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

Симптомы и технический анализ проблемы

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

Источник ошибки: Общий модуль АдресныйКлассификаторСлужебный.Модуль, строка 3453 (в зависимости от релиза строка может незначительно смещаться).

Проблемная строка:

Для Каждого Проверка из ДанныеПроверки Цикл

Давайте выясним причину происходящего. Ошибка «Итератор для значения не определен» в платформе 1С:Предприятие всегда означает одно: объект, который система пытается обойти в цикле Для Каждого, не является коллекцией (массивом, соответствием, таблицей значений или структурой). В данном конкретном случае переменная ДанныеПроверки принимает значение Неопределено.

Почему же переменная ДанныеПроверки оказывается пустой? Это происходит на этапе десериализации ответа от веб-сервиса проверки адресов 1С:ИТС. Функция СтрокаJSONВСтруктуру(ПолученныеДанные) пытается преобразовать тело HTTP-ответа от сервера в структуру 1С. Если веб-сервер возвращает пустую строку, некорректный JSON или HTML-страницу с ошибкой (например, из-за блокировки прокси-сервером), функция возвращает Неопределено. Разработчики БСП в данном релизе не предусмотрели проверку типа полученных данных перед запуском цикла, что и приводит к падению всей процедуры обновления.


Способ 1. Обход ошибки через временное изменение кода (метод автора темы)

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

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

Если РезультатПроверки.КодСостояния = 200 Тогда        
    ДанныеПроверки = СтрокаJSONВСтруктуру(ПолученныеДанные);        
ИначеЕсли РезультатПроверки.КодСостояния = 400 Тогда        
    Результат.ПодробноеПредставлениеОшибки = НСтр("ru='У адреса не указан регион'");
    Результат.КраткоеПредставлениеОшибки = НСтр("ru='Не указан регион'");
    Результат.Отказ = Истина;
  1. Добавим оператор Возврат; сразу после установки признака отказа, чтобы принудительно завершить выполнение функции до того, как система попытается запустить цикл по пустой переменной:

Если РезультатПроверки.КодСостояния = 200 Тогда        
    ДанныеПроверки = СтрокаJSONВСтруктуру(ПолученныеДанные);        
ИначеЕсли РезультатПроверки.КодСостояния = 400 Тогда        
    Результат.ПодробноеПредставлениеОшибки = НСтр("ru='У адреса не указан регион'");
    Результат.КраткоеПредставлениеОшибки = НСтр("ru='Не указан регион'");
    Результат.Отказ = Истина;
    Возврат; // Вставленная строчка для обхода ошибки
  1. Обновим конфигурацию базы данных (клавиша F7) и запустим предприятие. Обновление пройдет успешно. При последующем обновлении конфигурации на более актуальные релизы (например, до 3.1.8.246) измененный код автоматически заменится типовым кодом поставщика, где эта проблема уже исправлена разработчиками 1С.

Способ 2. Временное отключение интернета на сервере (рекомендуемый и безопасный)

Рассмотрим более простой и корректный системный подход, который не требует изменения метаданных и снятия конфигурации с поддержки. Так как сбой происходит из-за некорректного ответа веб-сервиса 1С:ИТС, мы можем временно заставить систему думать, что интернет-соединение полностью отсутствует.

Для этого выполним по шагам:

  1. Перед запуском первого обновления информационной базы физически отключим сетевое подключение на сервере 1С:Предприятия (или временно заблокируем исходящий трафик к доменам *.1c.ru на сетевом шлюзе / брандмауэре).
  2. Запустим базу в режиме «1С:Предприятие».
  3. Система попытается отправить запрос к веб-сервису проверки адресов, но сразу же получит сетевую ошибку отсутствия связи (таймаут). В коде 1С обработка сетевых исключений обернута в блок Попытка... Исключение, поэтому программа корректно пропустит этот шаг проверки и успешно завершит процедуру обновления, не вызывая аварийного завершения работы платформы.
  4. После успешного завершения всех обработчиков обновления восстановим сетевое подключение.

Способ 3. Отключение веб-сервиса в пользовательском интерфейсе

Если у вас есть возможность зайти в базу до начала выполнения отложенных обработчиков обновления (или вы восстановили резервную копию до первого запуска обновленной версии), можно отключить интеграцию с веб-сервисом проверки непосредственно в интерфейсе программы:

  1. Перейдем в раздел Администрирование -> Интернет-поддержка и услуги.
  2. Найдем подраздел настройки адресного классификатора.
  3. Отключим использование веб-сервиса 1С для проверки адресов и переведем программу в режим использования локально загруженного классификатора ФИАС / ГАР.
  4. Запустим обновление. В этом случае проверка адресов физических лиц пойдет по локальным таблицам базы данных, и запросы к веб-серверу отправляться не будут.

Способ 4. Очистка и исправление некорректных адресов физлиц

В некоторых случаях первопричиной сбоя являются устаревшие или поврежденные адресные сведения сотрудников (например, если база переносилась из старых версий ЗУП 2.5). Если в адресе сотрудника отсутствует регион или данные записаны некорректной XML-строкой, веб-сервер может выдать пустой ответ.

Проанализируем ситуацию:


Способ 5. Установка официального патча (исправления) от фирмы 1С

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

Если у вас настроена автоматическая загрузка исправлений, программа самостоятельно скачает необходимый патч. Если же база находится в закрытом контуре, вы можете скачать патч вручную с портала техподдержки 1С и установить его через меню Администрирование -> Обслуживание -> Обновление программы -> Установка исправлений (патчей) без снятия конфигурации с поддержки.

← На главную