Что такое итератор в 1с
Перейти к содержимому

Что такое итератор в 1с

  • автор:

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

Приветствую, коллеги! В данной статье будет описана ошибка «Итератор для значения не определён» в 1С, а именно: при каких обстоятельствах она возникает и какие существуют методы исправления и предупреждения ошибки «Итератор для значения не определён» в системе 1С.
Вначале дадим определение того, что такое итератор. Итератор – это специальный интерфейс, функция итератора – давать доступ ко всем элементам из конкретной коллекции, а также предоставлять навигацию по этим элементам. Для простых языков программирования итератором является обычный указатель.
Работа с итераторами для значения в программировании – это, по сути, реализация работы с различными боксами (контейнерами).

2. Диагностика ошибки «Итератор не определен»

Ошибка «Итератор для значения не определён» в 1С может появляться по следующим причинам: 1. обновление конфигурации 1С 8.3; 2. итератор применялся к тем объектам, которые не являются коллекциями.
Могут быть и иные первопричины возникновения неполадки «Итератор не определен», но это скорее единичные случаи, требующие частного разбора кейса. Далее мы будем опираться на вышеописанные причины возникновения ошибки, так как они являются наиболее распространёнными.

3. Ошибка после обновления конфигурации 1С

Опишем ситуацию, когда ошибка «Итератор для значения не определён» возникает при переходе с одного релиза конфигурации 1С на другой. При ошибки обновления конфигурации 1С в справочнике «Производственные календари» попросту не будет некоторой соответствующей записи. То есть нам необходимо сделать запись в этом справочнике. Она должна называться «Российская Федерация» и далее код «РФ».
Данная процедура делается перед обновлением. Если обновление на новый релиз уже было произведено, то необходимо обратно перейти на прежнюю версию (в резервной копии) и сделать запись, как было описано выше, после чего подтвердить стандартные настройки и только после можно проводить обновление конфигурации 1С 8.3:

Рис. 1 Исправление ошибки при обновлении конфигурации 1С
Если резервная копия базы не была создана, то устранение ошибки итератора для значения будет более сложным. Так как ошибка «Итератор для значения не определён» производит полную блокировку рабочего экрана, то нужно действовать по следующему алгоритму: 1. вызвать справку, при помощи клавиши «F1»; 2. вызвать навигационную ссылку, как показано ниже:
Рис. 2 Вызов навигационной ссылки для исправления ошибки при обновлении конфигурации 1С 3. ввести «1cib/list/Справочник.ПроизводственныеКалендари»:

Рис. 3 В навигационной ссылки для исправления ошибки при обновлении конфигурации 1С
4. кликнуть на «Перейти» и завести календарь аналогичным образом.

4. Итератор для объектов-не коллекций

Если вдруг вышло так, что разработчик допустил оплошность и применил итератор к объекту-не коллекции, также возникнет ошибка «Итератор не определен». Здесь важно понимать, что итератор – это некоторый протокол, который способствует получению доступа ко всем элементам внутри конкретной коллекции. Также, при помощи итератора, мы не только получаем доступ, но и можем обойти коллекцию.
Есть следующие способы обхода: · коллекция как список; · коллекция как массив. Коллекции-списки используют такую конструкцию:

Рис. 4 Конструкции для коллекций списком
В случае обхода коллекций массивом необходим цикл, который будет иметь обращение к элементам из нашей коллекции по индексу. Так как коллекции, сами по себе, могут быть разнообразными, помимо разделения по массивам и спискам, их также можно поделить на универсальные (таблицы со значениями, различные соответствия, структуры и массивы) и специализированные (например, табличная часть в документе). Исходя из этого, ошибка «Итератор для значения не определён» может возникать если: · итератор был применён к объектам-не коллекциям; · доступ к коллекции был прописан не верно (например, вид списка, но обращение как к массиву). Чтобы избежать появления этой ошибки итератора для значений, необходимо очень внимательно проверять связь всех итераторов с коллекциями и правильность обращения к самой коллекции. Специалист компании «Кодерлайн» Айдар Фархутдинов

Итераторы выборки

  • Итератор Лого 2.png
  • ОбходПоГруппировкам.png
  • ИтераторИзВыборкиСИтогами.png
  • Стенд.PNG
  • Время выполнения алгоритмов.png

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

Скачать файлы

Оглавление

Постановка проблемы

Обход выборки из результата запроса по группировкам можно выполнить двумя способами: с итогами или без итогов. В первом случае необходимо в запросе указать поля группировки и итогов. Обход элементов выборки в этом случае осуществляется методом Следующий(). Во 2-м — достаточно получить линейный список и выполнить обход элементов выборки с помощью метода СледующийПоЗначениюПоля(). В обоих случаях обход элементов необходимо выполнять с использованием вложенных циклов, каждый уровень которых будет соответствовать обходу по одному полю группировки. Последнее обстоятельство может быть очень неудобным: приводит к громоздкому коду со вложенными циклами, значительно усложняет алгоритмы выборки, когда заранее неизвестен состав и порядок полей группировки.

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

Обход элементов по шаблону проектирования Итератор

Шаблон проектирования Итератор решает проблему обхода элементов коллекции без использования методов самой коллекции. Удобство шаблона в том, что он предоставляет единый интерфейс обхода элементов без привязки к типу данных коллекции.

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

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

Реализация шаблона Итератор

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

  • ТекущиеДанные — ВыборкаИзРезультатаЗапроса, СтрокаТаблицыЗначений — структура для получения данных итератора
  • Источник — РезультатЗапроса, ВыборкаИзРезультатаЗапроса, Таблица
  • ПоляГруппировки — Массив — имена полей группировки
  • ИспользоватьИтоги — Булево — признак использования варианта обхода ПоГруппировкам для выборки из результата запроса

Основная функция работы с итератором: Следующий(СтруктураИтератора). Функция возвращает Истина, если Итератор спозиционировался на следующем элементе и Ложь — если предыдущее значение было последним.

Описание подсистемы

В подсистему входит один общий модуль РаботаСИтератором. Модуль реализует функции

  • ПолучитьСтруктуруИтератораВыборки
  • СледующийИз*

Пример использования

Рисунок 1. Обработка стенд, реализующая различные алгоритмы обхода.

В поставке идет обработка, демонстрирующая различные алгоритмы выборки. Функции демонстрации вынесены в команды на основной форме.

Типичные алгоритмы с использованием итератора и без представлены на следующих листингах.

Листинг 1. Реализация обхода с использованием итератора

Листинг 2. Реализация обхода с использованием вложенных циклов

Производительность

Рисунок

Рисунок 2. Сравнительный график времени выполнения различных алгоритмов обхода выборки из 2000 элементов, среднее время на 20 измерениях.

Реализация алгоритмов обхода выборки эквивалентна реализации через использование вложенных циклов. Дополнительные затраты связаны с проверками из-за универсальности реализации.

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

В целом нельзя сказать, что производительность в данном случае фатально низкая. Многое зависит от условий задачи, размера выборки. У меня получилось, что обход с использованием итератора раз в 6-8 медленнее, чем через использование вложенных циклов. Анализ потерь производительности выявил, что потери сопоставимы с затратами на операторы проверки, чтения переменных и полей вспомогательной структуры (речь идет о микросекундах).

Вывод

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

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

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

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

Анна Викулина

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

Причины и решение ошибки

Возникновение окна с ошибкой о неопределенном итераторе чаще всего проявляется в двух случаях:

  • Неудачное обновление конфигурации;
  • Обращение через итератор к элементам объектов, не являющихся коллекциями – массивам, таблицам значений и другим.

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

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

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

Вариант решения проблемы

При возникновении ошибки вызываете справку по горячей клавише F1, затем нажимаете на кнопку «Перейти по ссылке…» и пишите в открывшееся окно текст «e1cib/list/Справочник.ПроизводственныеКалендари». Вследствие этого действия вы попадаете в справочник производственных календарей. Далее нужно лишь завести необходимый календарь, и ошибка «Итератор для значения не определен» больше вас не побеспокоит.

Возможность вести недостающий календарь также появляется, если нажать «Еще» («Все действия») на окне с ошибкой и выбрать «Открыть внешнюю обработку». Правда, для этого придется потрудиться и написать программу, добавляющую нужный справочник с правильно заполненными полями. Это несложно, поэтому любой программист справится с этим.

Решение с помощью обработки

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

 НоваяТаблицаЗначений = Новый ТаблицаЗначений; Для Каждого элемента из НоваяТаблицаЗначений цикл элемента.Номер = итератор; КонецЦикла; 
 Текст = "ТекстовоеПоле"; Для Каждого элемента из Текст цикл элемента.Номер = итератор; КонецЦикла; 

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

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

Что такое итератор в 1с

Текущую редакцию Вашего 1С-Битрикс можно просмотреть на странице Обновление платформы ( Marketplace > Обновление платформы ).

Старт, Стандарт, Малый бизнес

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

Параметры и структура конструкции

При добавлении конструкции Итератор в шаблон, появляется область выделенная серым цветом. Все действия, расположенные в этой области будут участвовать в цикле.

Итератор имеет один параметр Источник, в котором требуется выбрать источник значений До версии модуля Бизнес-процессы 21.700.0 конструкция работала только с
переменными шаблона.
из списка. Источником значений может быть:

  • Параметр/переменная/константа шаблона БП;
  • Глобальная константа/переменная;
  • Поле документа.

Дополнительные результаты

В результате использования конструкции в форме Вставка значения станут доступны Дополнительные результаты, которые потребуются нам для использования в цикле:

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

Простой пример

Сначала подробно разберем работу итератора на очень простом примере:

  • Пусть у нас есть множественная переменная типа Целое число, в которой задано 6 разных чисел: 4, 8, 15, 16, 23, 42.
  • Создаём шаблон бизнес-процесса. Используем конструкцию Итератор и действие Сообщение соц. сети Действие отправляет уведомление модуля социальной сети.

Подробнее. в теле итератора:

  • В параметре Итератора укажем переменную со списком чисел, а в Сообщении соц. сети в качестве текста сообщения — дополнительный результат итератора Значение:
  • Сохраним шаблон и запустим его на выполнение. Результат — 6 уведомлений с числами из переменной:

    • Итератор взял первое значение из переменной. Это число 4;
    • Действие Сообщение соц.сети отработало с числом 4. Первая итерация цикла завершилась;
    • Итератор взял следующее значение из переменной — число 8;
    • Действие Сообщение соц.сети отработало с числом 8. Вторая итерация цикла завершилась;
    • И т.д. Процесс повторялся пока не было использовано последнее значение из переменной (число 42).

    Таким образом в бизнес-процессе совершено 6 итераций (т.к. в переменной 6 чисел) и в результате показано 6 уведомлений.

    Дополнительный результата итератора Ключ

    Использовать Ключ удобно, например, для автоматического проставления нумерации. Изменим текст в действии Сообщение соц. сети:

    , где — это Ключ к которому мы прибавляем число 1, а — Значение итератора.

    Результатом выполнения бизнес-процесса будет 6 таких уведомлений:

    Другие примеры

    Создание задач для списка пользователей

    Например, у вас имеется переменная с типом Привязка к пользователю, представляющая собой список сотрудников . И вы хотите создать последовательно каждому из них задачу. Укажите в настройках Итератора переменную со списком, а в цикл добавьте действие Задача Действие позволяет создать задачу.

    В качестве Ответственного укажем Значение из дополнительных результатов формы Вставка значения:

    В результате запуска БП будет создано три задачи — по одной задаче для каждого пользователя из множественной переменной:

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

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