При переходе на новые релизы в программе 1С:Зарплата и Управление Персоналом (ЗУП) пользователи часто сталкиваются с непредвиденными сбоями во время работы отложенных обработчиков обновления. Одна из таких критических ошибок — «Итератор для значения не определен». Сбой происходит при первом запуске информационной базы после обновления конфигурации с релиза 3.1.8.185 до версий 3.1.8.214, 3.1.8.216 или аналогичных.
В этой статье мы подробно разберем, почему возникает эта техническая проблема, проанализируем исходный код конфигурации и рассмотрим несколько эффективных способов решения — от быстрого временного «костыля» в коде до правильных системных настроек, которые не требуют снятия конфигурации с поддержки.
Ошибка заявляет о себе при первом запуске обновленной базы, когда система выполняет процедуры обновления данных в фоновом режиме. На экране появляется критическое сообщение, ссылающееся на следующий фрагмент кода:
Источник ошибки: Общий модуль АдресныйКлассификаторСлужебный.Модуль, строка 3453 (в зависимости от релиза строка может незначительно смещаться).
Проблемная строка:
Для Каждого Проверка из ДанныеПроверки Цикл
Давайте выясним причину происходящего. Ошибка «Итератор для значения не определен» в платформе 1С:Предприятие всегда означает одно: объект, который система пытается обойти в цикле Для Каждого, не является коллекцией (массивом, соответствием, таблицей значений или структурой). В данном конкретном случае переменная ДанныеПроверки принимает значение Неопределено.
Почему же переменная ДанныеПроверки оказывается пустой? Это происходит на этапе десериализации ответа от веб-сервиса проверки адресов 1С:ИТС. Функция СтрокаJSONВСтруктуру(ПолученныеДанные) пытается преобразовать тело HTTP-ответа от сервера в структуру 1С. Если веб-сервер возвращает пустую строку, некорректный JSON или HTML-страницу с ошибкой (например, из-за блокировки прокси-сервером), функция возвращает Неопределено. Разработчики БСП в данном релизе не предусмотрели проверку типа полученных данных перед запуском цикла, что и приводит к падению всей процедуры обновления.
Если вам необходимо срочно запустить базу и продолжить обновление, а конфигурация уже открыта в режиме Конфигуратора, можно применить быстрое исправление кода. Для этого выполним следующие шаги:
ЗаполнитьРезультатПроверкиАдресаПоКлассификаторуСервис1С в общем модуле АдресныйКлассификаторСлужебный.
Если РезультатПроверки.КодСостояния = 200 Тогда
ДанныеПроверки = СтрокаJSONВСтруктуру(ПолученныеДанные);
ИначеЕсли РезультатПроверки.КодСостояния = 400 Тогда
Результат.ПодробноеПредставлениеОшибки = НСтр("ru='У адреса не указан регион'");
Результат.КраткоеПредставлениеОшибки = НСтр("ru='Не указан регион'");
Результат.Отказ = Истина;
Возврат; сразу после установки признака отказа, чтобы принудительно завершить выполнение функции до того, как система попытается запустить цикл по пустой переменной:
Если РезультатПроверки.КодСостояния = 200 Тогда
ДанныеПроверки = СтрокаJSONВСтруктуру(ПолученныеДанные);
ИначеЕсли РезультатПроверки.КодСостояния = 400 Тогда
Результат.ПодробноеПредставлениеОшибки = НСтр("ru='У адреса не указан регион'");
Результат.КраткоеПредставлениеОшибки = НСтр("ru='Не указан регион'");
Результат.Отказ = Истина;
Возврат; // Вставленная строчка для обхода ошибки
3.1.8.246) измененный код автоматически заменится типовым кодом поставщика, где эта проблема уже исправлена разработчиками 1С.Рассмотрим более простой и корректный системный подход, который не требует изменения метаданных и снятия конфигурации с поддержки. Так как сбой происходит из-за некорректного ответа веб-сервиса 1С:ИТС, мы можем временно заставить систему думать, что интернет-соединение полностью отсутствует.
Для этого выполним по шагам:
*.1c.ru на сетевом шлюзе / брандмауэре).Попытка... Исключение, поэтому программа корректно пропустит этот шаг проверки и успешно завершит процедуру обновления, не вызывая аварийного завершения работы платформы.Если у вас есть возможность зайти в базу до начала выполнения отложенных обработчиков обновления (или вы восстановили резервную копию до первого запуска обновленной версии), можно отключить интеграцию с веб-сервисом проверки непосредственно в интерфейсе программы:
В некоторых случаях первопричиной сбоя являются устаревшие или поврежденные адресные сведения сотрудников (например, если база переносилась из старых версий ЗУП 2.5). Если в адресе сотрудника отсутствует регион или данные записаны некорректной XML-строкой, веб-сервер может выдать пустой ответ.
Проанализируем ситуацию:
Поскольку данная ошибка в релизах линейки 3.1.8 признана официальным багом Библиотеки стандартных подсистем (БСП), фирма 1С выпустила соответствующий патч (исправление) для этой версии.
Если у вас настроена автоматическая загрузка исправлений, программа самостоятельно скачает необходимый патч. Если же база находится в закрытом контуре, вы можете скачать патч вручную с портала техподдержки 1С и установить его через меню Администрирование -> Обслуживание -> Обновление программы -> Установка исправлений (патчей) без снятия конфигурации с поддержки.