как в 1с перебрать элементы формы в цикле
Циклы в программировании 1С 8.3
Цикл в программировании — это любая многократно исполняемая последовательность инструкций, организованная любым способом. Именно так описывается цикл во всех языках программирования. По сути циклы в 1С 8.3 не исключение. Но как всегда, каждый язык программирования имеет свою конструкцию, синтаксис, что выражаясь на обычном языке можно описать как правописание. Перейдем к изучении основных понятий и к примерам.
Цикл «Для…»
Оператор цикла Для предназначен для циклического повторения операторов, в конструкции Цикл – КонецЦикла. Условие выполнения цикла всегда проверяется в начале, перед выполнением цикла.
Пример 1 — Простой обход циклом с счетчиком
На данном примере счетчик цикла Сч при каждом входе в цикл увеличится на единицу, и пока не достигнет значению 11, цикл будет продолжаться.
Пример 2 — Обход с увеличением
Но, при решении конкретных задач, автоматическое увеличение значения счетчика цикла на единицу не всегда уместно. Так что же делать, ведь это же автоматическая функция?! Но всегда есть выход.
Рассмотрим конкретный пример в котором попробуем счетчику цикла задать шаг ровной к 5-и:
Пример 3 — С выходом из цикла «Прервать» (проверка на вечный цикл)
Приведем пример, где Сч, Счетчик, Сдвиг, Шаг, КоличествоСообщений являются переменными. Во избежание вхождения программы в вечный цикл, проводиться проверка и при необходимости цикл прерывается:
*Данный пример мы привели во внешней обработке.
Цикл «Для Каждого…»
Оператор цикла Для Каждого предназначен для циклического обхода коллекций значений. При каждой итерации цикла возвращается новый элемент коллекции. Обход осуществляется до тех пор, пока не будут перебраны все элементы коллекции.
Пример 1 — Простой обход таблицы значения
Создадим таблицу значений. Как мы помним, делается это на сервере.
И так, мы создали таблицу значений. Вскроем таблицу, для лучшего понимания.
Индекс | Значение элемента | Тип элемента | Автомобиль | Класс | Вес |
0 | СтрокаТаблицыЗначений | СтрокаТаблицыЗначений | «KIA» | «A Класс» | 1 100 |
1 | СтрокаТаблицыЗначений | СтрокаТаблицыЗначений | «Ford» | «B Класс» | 1 300 |
2 | СтрокаТаблицыЗначений | СтрокаТаблицыЗначений | «BMW» | «C Класс» | 1 400 |
Теперь реализуем обход по коллекции с помощью цикла Для Каждого.
Как мы видим, в каждой строке сообщения оказались данные одной машины, то есть присвоились значение очередного элемента коллекции переменной Ст.
*Данный пример мы привели во внешней обработке.
Пример 2 — Обход массива
Создадим еще одну коллекцию. Массив, в отличии от таблиц значений, можно создать на клиенте тоже.
Взглянем на коллекцию:
Индекс | Значение элемента | Тип элемента |
0 | «Арина» | Строка |
1 | «Марина» | Строка |
2 | «Карина» | Строка |
А теперь реализуем обход по коллекции, с помощью цикла Для Каждого:
Пример 3 — Оператор «Продолжить»
Еще один пример, где применим оператор Продолжить:
Индекс | Значение элемента | Тип элемента |
0 | 3 | Число |
1 | 7 | Число |
2 | 8 | Число |
3 | 9 | Число |
Цикл «Пока…»
Оператор цикла Пока предназначен для циклического повторения операторов, находящиеся внутри конструкции Цикл – КонецЦикла. Цикл выполняется, пока логическое выражение равно Истина. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла. (Описание: синтакс-помощник)
Выражение: логическое выражение, в зависимости значения которой будет выполнятся, или не выполнятся цикл.
Пример 1 — Обход массива с счетчиком
Взглянем на коллекцию.
Индекс | Значение элемента | Тип элемента |
0 | «Снегурочка N1» | Строка |
1 | «Баядерка N2» | Строка |
2 | «Синяя птица N3» | Строка |
3 | «Красная Шапочка N4» | Строка |
Как мы знаем, индексы строк в коллекции начинаются с 0-я. Это прекрасно видно на развернутом виде коллекции.
Но можно получить тот же список, но в обратном порядке. Это называется обратный цикл, хотя на самом деле, этот тот же самый цикл Пока.
Обратимся к тому же массиву, но напишем код обратного цикла.
*Данный пример мы привели во внешней обработке.
«Прервать» и «Продолжить» в циклах 1С 8.3
Вы думаю заметили, что в нескольких циклах, мы специально показали действие операторов Прервать и Продолжить. Хотя слова сами говорят о себе, да и в циклах вполне понятны их действия, тем не менее в заключении статьи, поясним и действие этих операторов.
Видео Школы 1С по теме циклов
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Циклы в 1С на примерах
Цикл – это конструкция, которая предназначена для многократного исполнения неких инструкций. Во встроенном языке 1С существует три вида циклов «Пока», «Для» и «Для Каждого». Рассмотрим на примерах работу с каждым из них.
Цикл «Пока»
Синтаксис:
Принцип работы такого цикла заключается в том, что операторы находящиеся после ключевого слова «Цикл», будут выполнятся пока логическое выражение будет равно ИСТИНА.
Пример:
В результате выполнения такого цикла, в окно сообщений будут последовательно выведены цифры от 1 до 5.
Цикл «Для»
Синтаксис:
После начального присвоения значения для переменной после ключевого слова «Для», такой цикл прекратится, когда значение переменной будет меньше либо равно конечному значению после ключевого слова «По». В таком цикле приращение переменной происходит автоматически, и всегда равно «1».
Пример:
Результат:
Получите понятные самоучители по 1С бесплатно:
Цикл «Для Каждого»
Синтаксис:
Для Каждого Из Цикл
// Операторы
КонецЦикла;
Такой вид циклов служит для обхода неких коллекций значений в 1с (массивов, таблиц значений, структур и т.д.). Цикл будет закончен, когда будут перебраны все элементы коллекции. Использование такого цикла рассмотрим на примере последовательного перебора всех элементов одномерного массива, с последующим выводом значений элементов в окно сообщений.
Пример кода:
Визуальное представление созданного массива в 1С:
Результат работы цикла:
Вложенные циклы
Во встроенном языке программирования 1С доступна возможность использования вложенных циклов. К классическому примеру использования таких конструкций можно отнести один из способов последовательного перебора всех ячеек таблицы значений.
Пример:
С помощью внешнего цикла мы последовательно получаем строки из коллекции «ТаблицаЗначений». Затем во внутреннем цикле, имея строку, получаем значение каждой ячейки из коллекции «КоллекцияКолонок».
Как организовать обратный цикл
Пример:
Результат:
Как принудительно продолжить цикл
Принудительный переход к следующей итерации в циклах 1С осуществляется с помощью оператора «Продолжить» (Continue).
Пример:
В таком примере с помощью операторов «Если» и «Продолжить» пропускаем цифру «2».
Результат:
Как прервать цикл
Полный выход из цикла (прерывание) во встроенном языке программирования 1С осуществляется с помощью оператора «Прервать» (Break).
Пример:
Такой цикл перестанет выполняться, как только значение переменной «Счётчик» будет равно «2».
Как получить доступ к реквизитам формы?
Этот цикл позволяет просмотреть имена а так же типы всех реквизитов формы, в том числе такие реквизиты как надписи, командные панели и тд.
Реквизиты формы могут быть различных типов. Поставив фильтр в виде типа реквизита мы можем просмотреть реквизиты определенного типа.
Если реквизит формы имеет тип «ТабличноеПоле», то можно такой элемент просканировать во вложенном цикле и узнать имена колонок таблицы:
Как получить значение отдельного реквизита формы?
Чаще требуется получать не массив реквизитов формы, а значение отдельных конкретных реквизитов формы. Например реквизиты «Шапки» или «Подвала» формы документа.
Реквизиты шапки могут иметь различные типы: Дата, СправочникСсылка, ЧекБокс, элемент раскрывающегося списка и др.
Как получить значение элементов табличной части формы?
Доступ к табличной части формы через объект
Доступ к табличной части формы (например: Товары) можно получить через объект:
Доступ к табличной части формы через ЭлементыФормы
Для того, чтобы код работал правильно, надо чтобы колонка формы табчасти объекта в свойстве данные ссылалась на реквизит табличной части объекта. Этим определяется тип колонки таб части формы.
То есть должна быть установлена связь между реквизитом табчасти объекта и реквизитом табчасти формы. Форм у объекта метаданных может быть много мы знаем. Табличную часть формы объекта можно получить через объект ЭлементыФормы :
Объект ЭлементыФормы используется для доступа к элементам управления, расположенным на форме, в частности к таб части документа.
Результат для документа Авансовый отчет:
Это табличное поле!! Товары
Количество строк: 4
Женские ботфорты коричневые
Ботинки женские демисезонные
Ботинки женские натуральная кожа
Женские босоножки
Результат для документа Авансовый отчет:
Это табличное поле!! ВыданныеАвансы
=======================
НомерСтроки 1
ДокументАванса Расходный кассовый ордер ТК000000004 от 15.02.2007 19:24:03
СуммаДокументаАванса 300
ВалютаДокументаАванса USD
Выдано 300
Сумма 174
Такое двойное сканирование удобно использовать для быстрой проверки того, что все колонки таб части формы имеют связь с реквизитами таб части объекта. Если такой связи у какой-либо колонки нет, система сгенерирует ошибку.
Программирование в 1С для всех
Выборка 1С – это специальный объект в 1С 8.3, который позволяет перебрать элементы справочников, документов и прочих объектов, имеющих такую возможность.
Для создания выборки справочника следует использовать методы менеджера справочника Выбрать и ВыбратьИерархически (только для справочников с иерархией), а для создания выборки документов – Выбрать.
Для простой выборки.
Для иерархической выборки.
Поскольку выборка это объект, предназначенный для перебора элементов, то для выполнения перебора элементов следует делать обход выборки. Обход выборки осуществляется при помощи цикла. Обход выборки осуществляется динамически, это значит, что при создании выборки не все элементы выбираются сразу из базы данных, а получение элементов происходит порциями, частями. Для обхода используется метод выборки Следующий. Этот метод возвращает Истина, когда следующий элемент выбран, и Ложь, когда достигнут конец выборки.
Обойти выборку документов можно так:
А справочников, соответственно так:
В процессе обхода выборки, мы можем обращаться напрямую ко всем реквизитам того объекта, который выбран на текущей итерации.
В результате, выведется информация обо всех контрагентах.
Поскольку, Контрагенты иерархический справочник, то в выборке присутствуют и группы, и элементы.
Мы не можем получить выборку только элементов или групп, поэтому, чтобы вывелись только элементы, необходимо воспользоваться стандартным реквизитом справочника ЭтоГруппа, этот реквизит имеет значение Истина, когда элемент является группой, и Ложь – когда просто элемент.
Можно код выше исправить следующим образом:
Тогда выведутся только элементы.
У метода менеджера справочника Выбрать существует четыре необязательных параметра.
Первый параметр позволяют формировать выборку элементов с указанным родителем, а второй с указанным владельцем. Третий параметр имеет тип Структура и позволяет отбирать элементы по определённому условию.
Например, у справочника Контрагенты имеется реквизит ТипКонтрагента, который имеет тип ссылка на перечисление ТипыКонтрагентов.
У этого перечисления два значения Покупатель и Поставщик. Если требуется, чтобы выборка выше выводила только покупателей, то следует создать структуру с единственным ключом, название которого должно совпадать с названием реквизит справочника, а в значение структуры указать нужное значение перечисления.
В этом случае будут отобраны только контрагенты-покупатели.
Обратите внимание, что в случае установки отбора нет смысла отсекать группы. Они не попадут в выборку, поскольку этот реквизит у них не заполнен.
Также, имейте в виду, что отбор можно производить только по стандартным реквизитам Наименование, Код, а также по тем реквизитам, у которых в свойстве Индексировать установлено значение Индексировать или Индексировать с доп. Упорядочиванием.
Иерархическая выборка справочников 1С
По мимо обычной выборки справочников при помощи метода менеджера справочника Выбрать, можно производить иерархическую выборку при помощи метода ВыбратьИерархически. Чем отличается простая выборка справочника от иерархической? Разберем простой пример. Выведем в таблицу значений на форме элементы и группы справочника номенклатуры обычной выборкой, а потом иерархической.
Для обычной выборки будет следующий код:
И следующий результат:
Все элементы и группы вывелись как попало, при следующей структуре справочника:
А теперь посмотрим, как будут выведены группы и элементы при иерархической выборке.
Получится следующий результат:
Элементы вывелись в иерархическом порядке. Иерархическая выборка перебирает элементы следующем образом: сначала выбирается элемент самого верхнего уровня, потом если это группа, то отбирается элемент, который входит в эту группу и т.д.
А если мы воспользуемся методом выборки справочников УровеньВВыборке, то сможем увидеть порядок вложенности.
Будет следующий результат:
Где 0 – самый высший уровень (элемент или группа не входят ни в какие группы), 1 – следующий уровень (элемент или группа входят в группу высшего уровня) и т.д.
При иерархической выборке также можно сделать отбор, но будут выбраны только элементы верхнего уровня, поскольку группы отобраны не будут (у них этот реквизит не заполнен), а если группы не отобраны, то и элементы других уровней тоже не будут выбраны, даже если они подходят по условию.
Метод ПолучитьОбъект выборки
Выборка возвращает только ссылку на объект, сам объект мы изменять не можем. Мы можем обратиться к экземпляру объекта отобранной выборкой ссылкой, если воспользуемся методом ПолучитьОбъект().
Например, в этом коде пытаемся всем элементам справочника Номенклатура с видом Товары, обнулить этот вид, присвоив пустую ссылку перечисления.
Для записи элемента использовалась попытка.
Читайте также по теме:
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
Циклы применяются для выполнения каких либо повторяющихся действий, возможные варианты перебора в цикле:
Перебираем строки с помощью цикла Для каждого
Перебираем строки с помощью цикла Пока
Перебираем строки с помощью цикла Для
Еще вариант, но советую его использовать только в без выходных ситуациях, Если
Примеры циклов
А какой цикл работает быстрее?
Итак, я нашел пять способов, как можно организовать цикл средствами 1С.
Первый вид цикла, назовем его условно «Для По» выглядит так:
Второй вид «Для Каждого»:
Третий «Пока»:
Далее вспомнил ассемблерную молодость & цикл «Если»:
Ну и напоследок «Рекурсия»
Естественно, что относить рекурсию к циклам не совсем корректно, но тем ни менее с её помощью можно добиться похожих результатов. Сразу оговорюсь, что в дальнейшем тестировании рекурсия не участвовала. Во первых все тесты проводились при 1 000 000 итераций, а рекурсия выпадает уже при 2 000. Во вторых скорость рекурсии в десятки раз меньше, чем скорость остальных циклов.
Последнее отступление. Одним из условий было выполнение в цикле каких-либо действий. Во первых пустой цикл используется очень редко. Во вторых цикл «ДляКаждого» используется для какой-либо коллекции, а значит и остальные циклы должны работать с коллекцией, чтобы тестирование проходило в одинаковых условиях.
Ну что ж, поехали. В качестве тела цикла использовалось чтение из заранее заполненного массива.
или, при использовании цикла «Для Каждого»
Тестирование проводилось на платформе 8.3.5.1231 для трех видов интерфейса (Обычное приложение, Управляемое приложение и Такси).
Интерфейс | ДляПо | ДляКаждого | Пока | Если |
Обычное приложение | 5734,2 | 4680,4 | 7235,4 | 7263,0 |
Управляемое приложение | 5962,4 | 4882,6 | 7497,4 | 7553,6 |
Такси | 5937,2 | 4854,6 | 7500,8 | 7513,0 |
Числа это время в миллисекундах полученное с помощью функции ТекущаяУниверсальнаяДатаВМиллисекундах(), которую я вызывал до цикла и после его завершения. Числа дробные, потому что я использовал среднее арифметическое пяти замеров. Почему я не использовал Замер производительности? У меня не было цели замерить скорость каждой строчки кода, только скорость циклов с одинаковым результатом работы.
Казалось бы и все, но & тестировать так тестировать!
Интерфейс | ДляПо | ДляКаждого | Пока | Если |
Обычное приложение | 4411,8 | 3497,2 | 5432,0 | 5454,0 |
Управляемое приложение | 4470,8 | 3584,8 | 5522,6 | 5541,0 |
В среднем платформа 8.2 на 25% быстрее, чем 8.3. Я немножко не ожидал такой разницы и решил провести тест на другой машине. Скажу только, что там 8.2 была быстрее процентов на 20.
Почему? Не знаю, дезасемблировать ядро в мои планы не входило, но в замер производительности я все же заглянул. Оказалось, что сами циклические операции в 8.3 проходят несколько быстрее, чем в 8.2. Но на строке
то есть при считывании элемента коллекции в переменную происходит значительное снижение производительность.
Для себя я сделал несколько выводов:
1. Если есть возможность использовать специализированный цикл & «Для Каждого», то лучше использовать его. Кстати, сам по себе он отрабатывает дольше чем другие циклы, но скорость доступа к элементу коллекции у него на много выше.
2. Если заранее знаешь количество итераций & используй «Для По». «Пока» отработает медленнее.
3. Если использовать цикл «Если» & другие программисты тебя явно не поймут.
В статье использованы материалы с хабра и хелпме