Внедрение 1C Блог О нас
 
1С:Франчайзинг На главную Написать нам

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


Итератор для значения не определен в 1С 8.3 - как исправить?

Ошибка «Итератор для значения не определен» в 1С 8.3 появляется как минимум в двух случаях:

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

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

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

Дело в данном случае заключается в отсутствии определенной записи в справочнике «Производственные календари«. А именно необходимо добавить запись с наименованием «Российская Федерация» и код «РФ».

Сделать это нужно до обновления. То есть тем, кто уже сделал обновление и наткнулся на ошибку «Итератор для значения не определен», следует вернуться к прежней версии (развернуть резервную копию), добавить там запись в справочник, заполнить все по умолчанию, а затем обновляться:

Получите 267 видеоуроков по 1С бесплатно:

А что же делать тем, кто не сделал резервную копию базы 1С? Выход тоже есть, но немного посложнее. Или, скорее, похитрее.

Вся проблема в том, что ошибка вызывает исключительную ситуацию и блокирует интерфейс, предлагая закончить работу. Вызываем справку (F1) и вызываем навигационную ссылку:

В открывшемся окне вводим саму ссылку «1cib/list/Справочник.ПроизводственныеКалендари»:

И нажимаем «Перейти». Все, можно заводить календарь.

Попытка применить итератор к объектам, которые не являются коллекциями

Часто при программировании разработчики 1С допускают распространенную ошибку: пытаются применить итератор к объектам, которые не являются коллекциями.

Причем коллекции бывают разные.

Для начала разберемся, что такое «итератор». Итератор происходит от английского слова «iterator» – протокол (или интерфейс), который предоставляет доступ к элементам коллекций. Кроме доступа, естественно, предоставляется и возможность обхода коллекции.

Существует два разных способа обхода коллекций:

Коллекции в виде списка существует конструкция:

Для Каждого Из Цикл

КонецЦикла;

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

Как я уже упоминал, коллекции могут быть различными, причем кроме деления на массив и список, они еще делятся на универсальные (таблицы значений, соответствия, структуры, массивы) и специализированные, например, табличные части документов.

Ошибка «Итератор для значения не определен» у программистов 1С возникает в двух случаях:

  • когда разработчик пытается применить итератор к объектам, коллекциями не являющихся;
  • когда доступ к коллекции разработчик пытается сделать неправильно, например, к списку как к массиву.

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

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

programmist1s.ru

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

Администратор 1. 21.02.2017 1858 просмотров

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

Возникновение проблемы после обновления программы

Чаще всего, если после переконфигурирования 1С возникает подобная ошибка, причина ее заключается в том, что в определенном справочнике (чаще всего это справочник «Производственные календари») отсутствуют определенные значения. Для устранения ошибки достаточно внести запись «Российская Федерация» и добавить код сокращения – «РФ» Эту операцию необходимо произвести перед обновлением программы. Если же ошибка возникает после того, как программа была обновлена, необходимо откатить ее до прежней версии для внесения данных в соответствующий справочник. После этого можно снова обновить программу 1С. Что делать, если откатить обновление невозможно? При отсутствии резервной копии программы задача по устранению ошибки «Итератор для значения не определен» немного усложняется. Что делать? Для начала воспользуемся клавишей F1 и откроем навигационную панель, в окно которой нам необходимо будет ввести путь к нужному справочнику, то есть: 1cib/list/наименование справочника. В нашем случае это будет справочник Производственные Календари.

После перехода по ссылке проблема, как правило, снимается.

Возникновение ошибки при применении итератора к неколлекционным объектам.

Такую ошибку допускают неопытные программисты, и возникает она в двух ситуациях: либо программист 1С применяет итератор к объектам, которые не являются коллекцией, либо когда протокол доступа осуществляется неправильно. Если ошибка возникла по одной из этих причин, то для ее решения Вам лучше обратиться к профессионалам. Звоните: 8 (800) 700-15-02 или регистрируйтесь на сайте 1С-ник на час, наши программисты оперативно и качественно решат любые возникающие проблемы в 1С.

Да, помогла Нет, не для меня

flumi.ru

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

Платформа 8.2 Итератор для значения не определен

Запрос = Новый Запрос

Запрос.Текст =

ВЫБРАТЬ

| Служебный.Пользователь,

| Служебный.Совет

|ИЗ

| Справочник.Служебный КАК Служебный

|ГДЕ

| Служебный.Пользователь = Пользователь

СпрПОльзователи = Справочники.Пользователи.НайтиПоНаименованию(СТП)

628902

хочется сделать так.

есть справочник Пользователи там все пользователи

спр. СоветыДня там список советов всевозможных

и есть Спр. Служебный где записывается имя пользователя и совет который уже выдовался

Меню

Метки: Итератор для значения не определен 1с 8.2, Итератор, итератор класса, итератор ввода, итератор пхп .

Содержание

Описание

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

Главное предназначение итераторов заключается в предоставлении возможности пользователю обращаться к любому элементу контейнера при сокрытии внутренней структуры контейнера от пользователя. Это позволяет контейнеру хранить элементы любым способом при допустимости работы пользователя с ним как с простой последовательностью или списком. Проектирование класса итератора обычно тесно связано с соответствующим классом контейнера. Обычно контейнер предоставляет методы создания итераторов.

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

Отличия от индексации

В процедурных языках программирования широко используется индексация. основанная на счётчике цикла для перебора всех элементов последовательности, например, массива. Хотя индексация может использоваться совместно с некоторыми объектно-ориентированными контейнерами, использование итераторов даёт свои преимущества:

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

Возможность модификации контейнера во время итерации его элементов стала необходимой в современном объектно-ориентированном программировании. где взаимосвязи между объектами и последствия выполнения операций могут быть не слишком очевидными. Использование итератора избавляет от этих видов проблем.

Неявные итераторы

Некоторые объектно-ориентированные языки, такие как Perl. Python. C#. Ruby и последние версии Java и Delphi имеют специальные операторы итерации элементов контейнера без явного использования итераторов. Реальный итератор может на самом деле существовать, но если он существует, то он не описывается в исходном коде явно.

Перебор элементов коллекции с помощью неявного итератора осуществляется при помощи оператора «foreach » (или эквивалентного ему), как например в следующем коде на языке Python:

В других случаях итераторы могут быть созданы самой коллекцией объектов, как в этом примере на языке Ruby:

Иногда неявность бывает только частичной. Так, стандартная библиотека шаблонов языка C++ содержит некоторые шаблоны функций, например for_each(). выполняющие такую неявную итерацию. Тем не менее, они все равно требуют явного задания итератора в качестве параметра. Но после инициализации последующая итерация происходит неявно без использования какого-либо итератора.

Генераторы

Одним из способов реализации итераторов является использование сопроцедур. которые могут возвращать управление (и вычисленные результаты) несколько раз, запоминая свое состояние и точку возврата в предыдущем вызове. В некоторых языках сопроцедуры могут быть представлены особого вида функциями. называемыми генераторами. Генератор#160 — функция, которая помнит, в каком месте был предыдущий return, и при следующем вызове возобновляет работу с прерванного места.

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

Пример генератора, возвращающего числа Фибоначчи. с применением оператора yield языка Python :

Итераторы в различных языках программирования

Оберон

Обычное обращение к переменным. составляющим ряд. осуществляется по их номеру. При этом адрес требуемой переменной вычисляется как: «адрес 1-й переменной» + «размер переменной» x «заданный номер». При последовательном обращении к таким переменным можно получить значительный выигрыш производительности, если вычислять адрес последующей переменной через адрес предыдущей. Для этого и применяется бегунок. Вид переменных, составляющих ряд, к которым будет осуществляться последовательное обращение, называется опорным видом бегунка, а число переменных ряда, на которое будет перемещаться бегунок после каждого такого обращения, называется шагом бегунка. Шаг бегунка задаётся как целая постоянная. Если при объявлении вида шаг бегунка не указан, то считается, что шаг равен 1.

C++

Язык C++ широко использует итераторы в STL. поддерживающей несколько различных типов итераторов, включая 'однонаправленные итераторы', 'двунаправленные итераторы' и 'итераторы произвольного доступа'. Все стандартные шаблоны типов контейнеров реализуют разнообразный, но постоянный набор типов итераторов. Синтаксис стандартных итераторов сделан похожим на обычные указатели языка Си. где операторы * и - используются для указания элемента, на который указывает итератор, а такие арифметические операторы указателя, как ++. используются для перехода итератора к следующему элементу.

Итераторы обычно используются парами, один из которых используется для указания текущей итерации, а второй служит для обозначения конца коллекции. Итераторы создаются при помощи соответствующих классов контейнеров, используя такие стандартные методы как begin() и end(). Функция begin() возвращает указатель на первый элемент, а end() #160 — на воображаемый несуществующий элемент, следующий за последним.

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

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

Безопасность применения итератора определяется раздельно для различных типов стандартных контейнеров в некоторых случаях итератор допускает изменения контейнера во время итерации.

Неявная итерация также частично поддерживается C++ при помощи шаблонов стандартных функций, как std::for_each() [1] и std::accumulate() [2]. При использовании они должны быть проинициализированы существующими итераторами, обычно begin и end, определяющих область итерации, но не должно быть явного определения итераторов для дальнейшего выполнения итерации. Следующий пример демонстрирует использование for_each .

Ограничением применения этого способа является невозможность объявлять тело цикла просмотра внутри, требуя где-нибудь объявления указателя функции или функтора и передачи его как аргумента. Это может быть частично скомпенсировано использованием такой библиотеки как Boost и применением лямбда-функции для неявного создания функторов со схожим инфиксным синтаксисом операторов. Только с учетом этого, такая библиотека определенные операции должна выполнять заданными способами.

Java

Представленный в релизе JDK 1.2 языка java.util.Iterator обеспечивает итерацию контейнерных классов. Каждый Iterator реализует методы next() и hasNext() и дополнительно может поддерживать метод remove(). Итераторы создаются соответствующими контейнерными классами, как правило методом iterator() .

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

Для коллекции типов, поддерживающей подобное, метод итератора remove() удаляет последний 'посещенный' элемент из контейнера. Почти все остальные типы модификации контейнера во время итерации являются небезопасными.

Кроме того, для java.util.List существует java.util.ListIterator со схожим API, но позволяющем прямую и обратную итерации, обеспечивая определение текущего индекса в списке и переход к элементу по его позиции.

В релиз Iterable для поддержки улучшенного цикла for (iterator(). возвращающий Iterator. Используя улучшенный цикл for прошлый пример можно переписать в виде

C# и прочие .NET языки

Итераторы в .NET Framework называются 'перечислителями' (enumerators) и представлены интерфейсом IEnumerator. IEnumerator реализует метод MoveNext(). который переходит к следующему элементу и указывает достигнут ли конец коллекции свойство Current служит для получения значения указываемого элемента дополнительный метод Reset() возвращает перечислитель на его исходную позицию. Перечислитель первоначально указывает на специальное значение перед первым элементом, поэтому вызов MoveNext() необходим для начала итерации.

Перечислители обычно передаются вызовом метода GetEnumerator() объекта, реализующего интерфейс IEnumerable. Классы контейнеров обычно реализуют этот интерфейс. Тем не менее, выражение foreach в языке C# может оперировать любым объектом, поддержвающим подобный метод, даже если он не реализует IEnumerable. Оба интерфейса были расширены в обобщенных версиях .NET 2.0 .

C# 2.0 также поддерживает генераторы. метод, объявляемый как возвращаемый IEnumerator (или IEnumerable ), но использующий выражение « yield return » (гибкое возвращение) для создания последовательности элементов вместо возвращения сущности объекта, будет превращен компилятором в новый класс, реализующий соответствующий интерфейс.

Python

В следующем примере для Python 2.4 (и выше) итератором является сам файловый объект f. обеспечивающий доступ к файлу как к последовательности строк:

Любой пользовательский класс может поддерживать стандартную итерацию (явную или неявную) при определении метода __iter__(). который создает итератор. Затем итератору нужно определение метода next(). возвращающего следующий элемент.

Генераторы языка Python реализуют протокол этой итерации.

PHP

В PHP 4 были представлены конструкции цикла просмотра как в языке Perl и некоторых других. Это позволяет простым способом просматривать массивы. В PHP 4 цикл просмотра работает только с массивами и выдает ошибку при попытке использования с переменными разного типа или неинициализированными переменными.

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

Последние новости

НДС, уплаченный с суммы предоплаты по расторгнутому договору, можно принять к вычету от news

[14 Ноя , 15:39]

В трудовом договоре сумма оклада включает в себя НДФЛ от news

[14 Ноя , 15:34]

Объект при УСН можно изменить, если переход на «упрощенку» еще не состоялся от news

[14 Ноя , 15:31]

Торговый сбор для торговли не в магазине от news

[14 Ноя , 15:26]

Особенности замены календарных лет для исчисления пособий от news

Источники: http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=628910, http://www.clothes-ekb.ru/klu48pai/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80, http://forum-1c.ru/index.php?topic=43088.0

Комментариев пока нет!

informatik-m.ru

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

1С:Предприятие 8.3 (8.3.8.1652) Бухгалтерия предприятия, редакция 3.0 (3.0.43.195)

При обновлении на версию 3.0.43.195 возникает ошибка: итератор для значения не определен. В конфигураторе процедура обновления проходит успешно, ошибок и предупреждений не выдается. При запуске Предприятия процесс обновления выдает ошибку. (ОбщийМодуль.УчетНДФЛ.Модуль(12542)) Конфигурация типовая, предыдущие обновления прошли нормально.

Тестирование и исправление ошибок результата не дает. Часто возникающие вопросы:

  • В чем может быть причина такой ошибки?
  • Как с ней бороться?
  • Кто-нибудь сталкивался с таким?

Это связано с отсутствием производственного календаря в базе с кодом «РФ»

Решение проблемы: воспользоваться обработкой открытия справочника «Производственные календари». (Скачать)

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

Read More about итератор для значения не определен

imonit.ru


Смотрите также