Что такое итератор для значения не определен в 1с
Перейти к содержимому

Что такое итератор для значения не определен в 1с

  • автор:

Итератор для значения не определен 1С 8.3

Ошибка Итератор для значения не определен 1С 8.3 связана с доступом к элементам коллекций в программном коде. Она возникает при обращении через итератор к массиву или таблице значений, которые не являются коллекцией.

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

  • обновления Конфигурации 1С;
  • внесения собственных доработок в 1С.

Поиск ошибки и ее исправление будет рассмотрен на конкретном примере.

Итератор для значения не определен

Ошибка Итератор для значения не определен 1С 8.3 может возникать при обновлении типовой информационной базы и выполнении собственных доработок в Конфигураторе 1С.

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

Поиск ошибки в сервисе 1С

Ошибка 1С Итератор значения не определен может появиться после обновления 1С. Список регистрации этой ошибки в последних обновлениях 1С:Бухгалтерия 3.0 следующий:

    ; ; ; ; ; ; ;
  • и т. д.

Поэтому при получении ошибки Итератор для значения не определен 1С 8.3 после обновления конфигурации нужно воспользоваться поиском ошибки в сервисе 1С:

Для работы с сервисом нужно указать:

  • слова, по которым производится поиск ошибки — в строке Найти ;
  • Конфигурацию 1С, где проявилась ошибка.

После нажатия кнопки Найти сервис отобразит список зарегистрированных ошибок. Пройдитесь внимательно по всем ссылкам: если описывается ваш случай — подождите обновления 1С.

После обновления 1С 8.3 на релиз 3.0.43.194 выходит ошибка Итератор для значения не определен при формировании справки НДФЛ. Что делать?

Инструкция по исправлению ошибки:

  1. Перейдите в сервис поиска ошибок 1С.
  2. Укажите в форме поиска:
    • Строка поискаИтератор;
    • КонфигурацияБухгалтерия предприятия 3.0.
  3. Нажмите кнопку Найти .
    В сервисе поиска ошибок 1С зарегистрирована ошибка 50005128. В ее описании указаны причина появления ошибки и как можно ее исправить: установить код РФ в справочнике Производственный календарь .
  4. Откройте справочник Производственные календари (кнопка Главное меню — Все функции — Производственные календари ).
  5. Установите код РФ, как рекомендует 1С.

Сохраните изменения по кнопке Записать и закрыть .

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

Как правило, такие ошибки регистрируются и исправляются очень быстро. В течении 2-3 дней после сбора информации об ошибках выходит релиз с исправлениями, на который нужно обновиться пользователям 1С.

Исправление ошибки «Итератор для значения не определен»

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

В рассмотренном выше примере с производственным календарем ошибка возникала в общем модуле Учет НДФЛ в строке 12542.

Исправление ошибки в этом случае заключается в открытии указанного модуля Учет НДФЛ и анализа строчки кода 125452.

Но подсказка по месту ошибки выводится не всегда. Поэтому ее исправить довольно сложно. Покажем исправление ошибки 1С Итератор для значений неопределен при подключении внешней печатной формы в программу.

При попытке подключить в 1С внешнюю печатную форму Счет Фактура выданный (ошибка) 1.07.2020 появляется ошибка Итератор для значения не определен .

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

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

Обращение итератора к строке, не являющейся коллекцией, и приводит к появлению ошибки 1С Итератор для значения не определен . Правильный пример кода описывает в процедуре СведенияОВнешнейОбработке массив назначения — документ Счет фактура выданный :

После внесения изменений в МассивНазначений подключение внешней печатной формы Счет Фактура выданный (правильно) 1.07.2020 в 1С выполнится без ошибок.

При правильно прописанном коде в списке печатных форм Счета-фактуры выданные отображается подключенная внешняя печатная форма Счет-фактура от 01.07.2020.

См. также:

Подписывайтесь на наши YouTube и Telegram чтобы не пропустить
важные изменения 1С и законодательства

Помогла статья?

Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно

Итератор для значения не определен в переменной

Здравствуйте,ругается 1с вот так "Итератор для значения не определен",я сделал запрос ,ин мне вернул 2 колонки,содержащие ссылки на номенклатуру,я выгрузил в таблицу значений,и поместил в переменную "данныеНормОдежды"это все в модуле обьекта документ,потом в форме документа я хотел сделать вот так
Для Каждого строчка Из данныеНормОдежды Цикл

Если строчка.спецодежда.код= редактируемаяСтрока.текущаястрока.НаименованиеНМНА.код Тогда

редактируемаяСтрока.текущаястрока.СпецодеждаНов =строчка.спецодежда;
редактируемаяСтрока.текущаястрока.ВидНормыНовый =строчка.ВидНормыВыдачи;
иначе

Сообщить("нет по норме");

подскажите,пожалуйстачто не так, если можно поподробней,и не пинайте сильно,я только учусь.

в модуле объекта

Перем данныеНормОдежды Экспорт;

ЗапросНорм = Новый Запрос;
ЗапросНорм.Текст =
"ВЫБРАТЬ
| НормыВыдачиСпецодеждыСрезПоследних.Спецодежда,
| НормыВыдачиСпецодеждыСрезПоследних.ВидНормыВыдачи
|ИЗ
| РегистрСведений.НормыВыдачиСпецодежды.СрезПоследних(&НаДату, ) КАК НормыВыдачиСпецодеждыСрезПоследних
|ГДЕ
| НормыВыдачиСпецодеждыСрезПоследних.ПодразделениеОрганизации.код = &подразделение
| И НормыВыдачиСпецодеждыСрезПоследних.КодРабочегоМеста = &КодРабочегоМестаНов"
;

ЗапросНорм.УстановитьПараметр("НаДату", НачалоДня(Дата));
ЗапросНорм.УстановитьПараметр("подразделение", Подразделение.код);
ЗапросНорм.УстановитьПараметр("КодРабочегоМестаНов",РабочееМестоКод);
ВыборкаНорм = ЗапросНорм.Выполнить().Выгрузить();

я запутался,я что сказать должен?

есть к примеру 6 строк,возвращает точно.

из отладчика
ВыборкаНорм ТаблицаЗначений ТаблицаЗначений

ВыборкаНорм.Колонки.Спецодежда.ТипЗначения ТипЗначения Null, Номенклатура ОписаниеТипов

ЗапросНорм = Новый Запрос;
ЗапросНорм.Текст =
"ВЫБРАТЬ
| НормыВыдачиСпецодеждыСрезПоследних.Спецодежда,
| НормыВыдачиСпецодеждыСрезПоследних.ВидНормыВыдачи
|ИЗ
| РегистрСведений.НормыВыдачиСпецодежды.СрезПоследних(&НаДату, ) КАК НормыВыдачиСпецодеждыСрезПоследних
|ГДЕ
| НормыВыдачиСпецодеждыСрезПоследних.ПодразделениеОрганизации.Код = &подразделение
| И НормыВыдачиСпецодеждыСрезПоследних.КодРабочегоМеста = &КодРабочегоМестаНов"
;

ЗапросНорм.УстановитьПараметр("НаДату", НачалоДня(Дата));
ЗапросНорм.УстановитьПараметр("подразделение", Подразделение.Родитель.Родитель.Код);
ЗапросНорм.УстановитьПараметр("КодРабочегоМестаНов",РабочееМестоКод);
ВыборкаНорм = ЗапросНорм.Выполнить().Выгрузить();

(17) ну так обходишь ты не ВыборкаНорм , а данныеНормОдежды

Смысл в этой строчке?
ДанныеНормОдежды= ВыборкаНорм;

там точно между запросом и этой строкой ничего? ДанныеНормОдежды — это не какой-нибудь реквизит объекта или формы, где тип определен?

Если ты просто хочешь обойти результат запроса, либо обходит ТЗ ВыборкаНорм, а лучше вообще не выгружай запрос, а обходи выборку

ВыборкаНорм = ЗапросНорм.Выполнить().выбрать();
Пока Выборка.Следующий() Цикл
// тут твой код
КонецЦикла;
и т.п.

(33) а вдруг ты его украдешь?

ТС, короче, разберись в отладчике, как у тебя вместо ТЗ оказывается ссылка, в какой момент и почему.

Функция ПолучениеНормОдежды(Подразделение,РабочееМестоКод,Дата) экспорт
ЗапросНорм = Новый Запрос;
ЗапросНорм.Текст =
"ВЫБРАТЬ
| НормыВыдачиСпецодеждыСрезПоследних.Спецодежда,
| НормыВыдачиСпецодеждыСрезПоследних.ВидНормыВыдачи
|ИЗ
| РегистрСведений.НормыВыдачиСпецодежды.СрезПоследних(&НаДату, ) КАК НормыВыдачиСпецодеждыСрезПоследних
|ГДЕ
| НормыВыдачиСпецодеждыСрезПоследних.ПодразделениеОрганизации.код = &подразделение
| И НормыВыдачиСпецодеждыСрезПоследних.КодРабочегоМеста = &КодРабочегоМестаНов"
;

ЗапросНорм.УстановитьПараметр("НаДату", НачалоДня(Дата));
ЗапросНорм.УстановитьПараметр("подразделение", Подразделение.код);
ЗапросНорм.УстановитьПараметр("КодРабочегоМестаНов",РабочееМестоКод);
ВыборкаНорм = ЗапросНорм.Выполнить().Выгрузить();

//СтруктураОтбор = Новый Структура("Подразделение, КодРабочегоМестаНовый, Спецодежда", Подразделение, РабочееМестоКод, Неопределено);
//Пока ВыборкаНорм.Следующий() Цикл
//
//СтруктураОтбор.Спецодежда = ВыборкаНорм.Спецодежда;
//МасСтрСпецодежда = Перемещение.НайтиСтроки(СтруктураОтбор);
Если ВыборкаНорм.Количество()=0 Тогда
ЗапросНорм = Новый Запрос;
ЗапросНорм.Текст =
"ВЫБРАТЬ
| НормыВыдачиСпецодеждыСрезПоследних.Спецодежда,
| НормыВыдачиСпецодеждыСрезПоследних.ВидНормыВыдачи
|ИЗ
| РегистрСведений.НормыВыдачиСпецодежды.СрезПоследних(&НаДату, ) КАК НормыВыдачиСпецодеждыСрезПоследних
|ГДЕ
| НормыВыдачиСпецодеждыСрезПоследних.ПодразделениеОрганизации.Код = &подразделение
| И НормыВыдачиСпецодеждыСрезПоследних.КодРабочегоМеста = &КодРабочегоМестаНов"
;

ЗапросНорм.УстановитьПараметр("НаДату", НачалоДня(Дата));
ЗапросНорм.УстановитьПараметр("подразделение", Подразделение.Родитель.Код);
ЗапросНорм.УстановитьПараметр("КодРабочегоМестаНов",строка(РабочееМестоКод));
ВыборкаНорм = ЗапросНорм.Выполнить().Выгрузить();

Если ВыборкаНорм.Количество()=0 Тогда

ЗапросНорм = Новый Запрос;
ЗапросНорм.Текст =
"ВЫБРАТЬ
| НормыВыдачиСпецодеждыСрезПоследних.Спецодежда,
| НормыВыдачиСпецодеждыСрезПоследних.ВидНормыВыдачи
|ИЗ
| РегистрСведений.НормыВыдачиСпецодежды.СрезПоследних(&НаДату, ) КАК НормыВыдачиСпецодеждыСрезПоследних
|ГДЕ
| НормыВыдачиСпецодеждыСрезПоследних.ПодразделениеОрганизации.Код = &подразделение
| И НормыВыдачиСпецодеждыСрезПоследних.КодРабочегоМеста = &КодРабочегоМестаНов"
;

ЗапросНорм.УстановитьПараметр("НаДату", НачалоДня(Дата));
ЗапросНорм.УстановитьПараметр("подразделение", Подразделение.Родитель.Родитель.Код);
ЗапросНорм.УстановитьПараметр("КодРабочегоМестаНов",РабочееМестоКод);
ВыборкаНорм = ЗапросНорм.Выполнить().Выгрузить();

КонецЕсли;
КонецЕсли;
//КонецЦикла;
// ДанныеНормОдежды= ВыборкаНорм;

возврат ДанныеНормОдежды//МасСтрСпецодежда
КонецФункции // ПолучениеНормОдежды()

Итератор для значения не определен в 1С 8.3

Итератор (от англ. iterator ― перечислитель) позволяет получать в переменной с указанным именем поочередно все элементы коллекции. К элементам коллекций можно обращаться через числовой индекс (только если коллекция имеет определенную последовательность) или через итератор. В 1С Предприятии более универсальным способом обхода является обход через итератор «Для каждого…», поскольку может применяться для обхода большинства коллекций. Но и у него есть ряд нюансов, из-за которых может возникать ошибка 1С Итератор значения не определен.

Причины возникновения ошибки

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

Неверное обращение к элементу коллекции

Если обратиться к каталогу ошибок (Публикации ошибок) и задать в окне поиска Итератор для значения не определен 1С 8.3, то окажется не так уж много зарегистрированных ошибок, которые происходят в результате обновления релиза. Всего 67 по всем конфигурациям, что очень мало по сравнению с другими видами зарегистрированных ошибок.

image002

В некоторых ошибках сразу в публикации видно, что сообщение 1С Итератор для значения не определен получено в момент попытки перебора коллекции.

image003

Скорее всего, в этом примере МассивОрганизаций и Вложения имеют значения Неопределено , тогда как обращение через итератор явно предполагает, что данные элементы являются, например, таблицей значений или массивом.

Способ исправления

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

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

Универсального рецепта исправления нет, поэтому для каждого такого сообщения придется разбираться в коде.

Для разбора причины возникновения ошибки создадим обработку в конфигурации «1С: Зарплата и управление персоналом». На форме выберем документ для обработки, в нашем случае документ Премия , в котором есть табличные части. Определим, что ТаблицаНачислений — это табличная часть документа.

image004

При обращении через итератор к ТаблицаНачислений в цикле будем получать требуемые нам значения и работать с ними по своему усмотрению. Но если обратиться к другому элементу документа, не являющимся коллекцией, то получим сообщение, что итератор значения не определен.

image005

ИсправленныйДокумент — это ссылка на документ, а не табличная часть, поэтому обращение к такому элементу вызовет следующее:

image006

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

image007

В примере на картинке выше мы передали табличную часть документа в параметр выполняемой процедуры. Но вместо коллекции передать можно и неверное значение. Например, передадим строку или Булево. У выполняемой процедуры один параметр, и примеров неверной передачи можно привести очень много: передача строки, реквизита, значения Неопределено и так далее.

image008

В каждом случае будем получать ошибку, что программа не смогла выполнить процедуру ОбработатьТаблицу, поскольку попыталась обработать через итератор то, что коллекцией не являлось.

image009

Перейдем по кнопке Подробно в режиме конфигуратора в строку, где программа не смогла отработать, и исправим ошибку. В приведенном примере укажем не реквизит документа или Булево, а таблицу.

Бывают случаи, когда таблица значений до момента вызова процедуры была переопределена (до вызова процедуры ОбработатьТаблицу таблица значений ТаблицаНачислений получила значение Неопределено ), и у вас никак не получается исправить передаваемый параметр, а выполнение процедуры крайне необходимо для получения правильного результата. Тогда можно попробовать добавить проверку на тип значения получаемого параметра. Например, проверить является ли ТаблицаДанных ТаблицейЗначений .

image010

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

Что такое итератор для значения не определен в 1с

Недавнее обновление 1С:Бухгалтерии 8.3 (редакция 3.0) на версию 3.0.43.194 преподнесло многим пользователям неприятный сюрприз.

После обновления при попытке зайти в 1С:Предприятие в режиме пользователя у многих начала появляться ошибка «Итератор для значения не определен«:

Это явная ошибка разработчиков 1С, которые не предусмотрели ситуацию, когда у некоторых пользователей не создан производственный календарь для российской федерации (с кодом «РФ»).

Вариантов исправления два (второй самый быстрый).

Первый вариант

  1. Восстановите базу из архива сделанного перед обновлением.
  2. Затем создайте и заполните производственный календарь с кодом РФ (вот инструкция).
  3. Снова повторите обновление — на этот раз ошибки не возникнет.

Второй вариант

Для тех кто не хочет повторять обновление или, не дай бог, не сделал резервную копию перед обновлением.

Скачайте и распакуйте вот эту обработку на рабочий стол (она простейшая, я написал её за 1 минуту — в ней программным способом создаётся производственный календарь с кодом РФ):

В момент возникновения ошибки нажмите кнопку «Ещё» и выберите пункт «Открыть внешнюю обработку»:

Укажите эту обработку и в открывшейся форме нажмите кнопку «Добавить календарь»:

Теперь перезапустите 1с — ошибки больше не возникнет.

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Владимир Милькин

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *