Разработка и Конфигурация · 11 мин
Ошибка «Итератор для значения не определен» в 1С: причины и способы исправления
Разбираем ошибку «Итератор для значения не определен» в 1С: что означает, в каком коде возникает, как найти причину и исправить обход коллекции.
Ошибка «Итератор для значения не определен» — одно из самых частых сообщений, с которым сталкиваются разработчики и пользователи 1С при выполнении обработок, отчётов или проведении документов. Она возникает в момент, когда встроенный язык пытается организовать цикл «Для Каждого … Из … Цикл» по значению, которое не является коллекцией и не поддерживает перебор элементов.
Проще говоря, платформа ожидает получить массив, таблицу значений, выборку из запроса, список значений или другую перебираемую структуру, а вместо этого получает число, строку, ссылку на объект, дату или значение «Неопределено». Цикл построить невозможно — и выполнение кода прерывается с этим сообщением.
Ошибка может проявляться и на стороне пользователя: например, при нажатии кнопки в документе, при формировании отчёта или при обмене данными. В таком случае причина почти всегда в коде конфигурации, расширения или внешней обработки, а не в действиях пользователя. Ниже разберём, как локализовать проблему и устранить её.
Что именно означает эта ошибка
Во встроенном языке 1С конструкция «Для Каждого Переменная Из Коллекция Цикл» требует, чтобы выражение после «Из» возвращало объект, поддерживающий обход: массив, структуру, соответствие, таблицу значений, выборку результата запроса, коллекцию строк дерева и так далее. Для каждого такого объекта платформа создаёт внутренний механизм перебора — итератор.
Если выражение возвращает значение примитивного типа (число, строку, дату, булево), ссылку на объект базы данных или «Неопределено», итератор создать невозможно. Платформа сообщает об этом фразой «Итератор для значения не определен» и указывает строку модуля, где произошла ошибка.
Важно понимать: сообщение относится именно к значению в правой части «Из», а не к переменной цикла. Поэтому искать нужно выражение, которое должно было вернуть коллекцию, но вернуло что-то другое.
Типичные ситуации, в которых возникает ошибка
Функция не вернула значение
Самая распространённая причина — цикл строится по результату функции, в которой отсутствует оператор «Возврат» либо возврат происходит не во всех ветках условий. В этом случае функция возвращает «Неопределено», и попытка перебрать его приводит к ошибке.
Обращение к реквизиту с пустым значением
Вторая частая ситуация — перебор табличной части или коллекции через переменную, которой не присвоено значение. Например, код обращается к табличной части объекта через переменную «Объект», но объект не был получен или прочитан, и переменная содержит «Неопределено».
Перепутан тип значения
Третья группа причин — логическая: разработчик ожидает, что в переменной лежит массив или результат запроса, а фактически туда попала ссылка, число или строка. Такое бывает после рефакторинга, при изменении состава возвращаемых значений функций или при работе с данными из внешних источников.
Проверить, что возвращает это выражение в момент выполнения
Проверить ветки кода, где коллекция может не заполняться
Сравнить код общих модулей до и после обновления
Искать в модуле объекта, формы или общем модуле
Как найти источник ошибки
Первый шаг — прочитать полный текст сообщения. Платформа указывает имя модуля и номер строки, где возникла ошибка. Если сообщение обрезано, полный текст можно найти в журнале регистрации или в окне служебных сообщений.
Далее нужно открыть указанную строку в конфигураторе и определить, какое выражение стоит после «Из». Затем — проследить, откуда это выражение получает значение: из функции, из реквизита, из параметра процедуры или из результата запроса.
- 1Откройте полный текст ошибки и запомните модуль и номер строки
- 2Найдите в конфигураторе цикл «Для Каждого» на указанной строке
- 3Определите выражение после слова «Из»
- 4Запустите отладку и поставьте точку останова перед циклом
- 5Посмотрите фактическое значение и его тип в табло
- 6Проследите, где значение должно было заполняться, и найдите ветку, где этого не происходит
Если отладка невозможна (например, ошибка только на рабочем сервере), используйте трассировку: временно добавьте перед циклом вывод типа значения через функцию ТипЗнч() в журнал регистрации. Это позволит понять, что именно приходит вместо коллекции.
Как исправить ошибку в коде
Способ исправления зависит от причины. Если функция не возвращает значение — добавьте оператор «Возврат» во все ветки логики, причём возвращать нужно именно коллекцию (например, пустой массив, а не «Неопределено»). Пустая коллекция безопасна: цикл по ней просто не выполнится ни разу.
Если проблема в данных — добавьте защитную проверку перед циклом. Проверка типа через ТипЗнч() или проверка на «Неопределено» позволяет пропустить обработку или выдать понятное сообщение вместо аварийного прерывания.
ТаблицаТоваров = ПолучитьТовары(Заказ);
Если ТаблицаТоваров = Неопределено Тогда
ТаблицаТоваров = Новый Массив;
КонецЕсли;
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
// обработка строки
КонецЦикла;При работе с результатом запроса помните: метод «Выгрузить()» возвращает таблицу значений, «Выбрать()» — выборку, обе перебираемы. Но если запрос не выполнен или переменной присвоен сам запрос, а не его результат, перебор завершится ошибкой. Всегда проверяйте цепочку «Запрос.Выполнить().Выбрать()» целиком.
Что делать, если ошибка возникает у пользователя
Если вы не разработчик, а пользователь, и ошибка появляется при работе в документе или отчёте, самостоятельно исправить её не получится — причина в программном коде. Но можно собрать информацию, которая ускорит исправление.
Зафиксируйте: в каком документе или отчёте возникает ошибка, какие действия ей предшествуют, возникает ли она у других пользователей и на других данных. Сделайте скриншот полного сообщения. Эти сведения передайте специалисту по сопровождению 1С или разработчику.
Если ошибка появилась сразу после обновления конфигурации или установки расширения, временно отключите расширения и проверьте, сохраняется ли проблема. Часто причина — устаревшее расширение, несовместимое с новой версией конфигурации.
Как выбрать действие
Проверка результата после исправления
После внесения изменений проверьте три сценария: работу с полными данными, работу с пустыми данными (когда коллекция должна быть пустой) и работу в граничных условиях (отменённый документ, незаполненный реквизит, пустой результат запроса).
Признак корректного исправления — цикл либо выполняется по заполненной коллекции, либо корректно пропускается при пустой, без аварийного прерывания. Если вместо ошибки появляется «молчаливое» отсутствие результата, проверьте, не маскирует ли защитная проверка реальную проблему с данными: иногда пустая коллекция — сама по себе признак ошибки выше по логике.
Как проверить результат
Цикл отрабатывает, результат корректен
Ошибка сохраняется или данные обрабатываются частично
Цикл пропускается без ошибки
Возникает то же сообщение или другое исключение
Срабатывает защитная проверка с понятным сообщением
Аварийное прерывание без диагностики
Профилактика: как не допустить ошибку в будущем
Основное правило — функции, которые по логике возвращают коллекцию, должны возвращать её всегда, даже если данных нет. Пустой массив или пустая таблица значений вместо «Неопределено» избавляют вызывающий код от лишних проверок и от рассматриваемой ошибки.
Второе правило — явная инициализация переменных. Переменная, которой не присвоено значение, содержит «Неопределено», и любой цикл по ней завершится ошибкой. Присваивайте начальные значения сразу при объявлении.
Третье правило — при изменении состава возвращаемых значений общих функций проверяйте все места их вызова. Глобальный поиск по имени функции в конфигураторе показывает все точки использования, и каждую стоит проверить на совместимость типов.
При отладке удобно смотреть не только значение переменной, но и её тип в табло: одна и та же переменная в разных запусках может содержать то массив, то Неопределено — это сразу указывает на ветку логики, где заполнение пропущено.
Частые вопросы
Может ли ошибка возникнуть из-за данных в базе, а не из-за кода?
Да, косвенно. Сам код при этом содержит дефект (отсутствие проверки), но проявляется он только на определённых данных — например, когда реквизит не заполнен или запрос не вернул строк. Исправлять нужно код, а данные проверить для понимания сценария.
Почему ошибка появляется только у одного пользователя?
Чаще всего пользователь работает с данными, которые не встречались другим: документ с пустой табличной частью, объект с незаполненным реквизитом. Реже причина в правах — пользователю недоступен объект, и функция возвращает пустое значение вместо коллекции.
Совместима ли ошибка с работой расширений конфигурации?
Да. Если расширение перебирает коллекцию, которую раньше возвращал типовой код, а после обновления конфигурации состав возвращаемого значения изменился, возникает именно эта ошибка. Лечится адаптацией расширения под новую версию.
Поможет ли обновление платформы 1С?
Нет, это ошибка прикладного кода, а не платформы. Обновление платформы не исправит логику, в которой в цикл попадает неколлекционное значение. Нужно искать и исправлять конкретное место в конфигурации или обработке.
Как быстро защитить код от этой ошибки без глубокого анализа?
Добавьте перед циклом проверку: если значение равно Неопределено — заменить его на пустой массив. Это уберёт аварийное прерывание, но не заменит полноценного исправления: причина, по которой значение не заполнено, может влиять на результаты работы.
Опасна ли эта ошибка для данных базы?
Непосредственно нет — выполнение кода просто прерывается. Но если ошибка возникает в середине транзакции записи или проведения, часть связанных действий может не выполниться. После устранения ошибки стоит проверить корректность данных в затронутых документах.
Что важно запомнить
Ошибка «Итератор для значения не определен» означает, что в цикл «Для Каждого» попало значение, не являющееся коллекцией. Причина почти всегда в коде: функция без возврата, неинициализированная переменная или изменившийся тип данных. Исправление — гарантированный возврат коллекции из функций, защитные проверки перед циклом и тестирование на пустых данных.