1с цикл для справочника

1с цикл для справочника thumbnail

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

1с цикл для справочника

Цикл «Для…»

Оператор цикла Для предназначен для циклического повторения операторов, в конструкции Цикл – КонецЦикла. Условие выполнения цикла всегда проверяется в начале, перед выполнением цикла.

Для <Переменная> = <Знач1> По <Знач2> Цикл // Код КонецЦикла;

Где:

  • Переменная является счетчиком и при каждом повторении цикла автоматически увеличивается на 1. Иначе говоря, это счетчик цикла.
  • Знач1 число, которое задает начальное значение счетчику цикла.
  • Знач2 число, которое задает максимальное значение счетчику цикла. Если значение счетчика цикла становится больше чем Знач2 цикл прекращается.

Пример 1 – Простой обход циклом с счетчиком

Для Сч = 1 По 10 Цикл Сообщить(Сч); // Ответ – 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 КонецЦикла;

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

Пример 2 – Обход с увеличением

Но, при решении конкретных задач, автоматическое увеличение значения счетчика цикла на единицу не всегда уместно. Так что же делать, ведь это же автоматическая функция?! Но всегда есть выход.

Рассмотрим конкретный пример в котором попробуем счетчику цикла задать шаг ровной к 5-и:

Для Сч = 0 По 50 Цикл Сообщить(Сч); // Ответ – 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 Сч = Сч + 5 – 1; КонецЦикла;

Пример 3 – С выходом из цикла «Прервать» (проверка на вечный цикл)

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания – попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.

Попробуйте бесплатно по ссылке >>

Приведем пример, где Сч, Счетчик, Сдвиг, Шаг, КоличествоСообщений являются переменными. Во избежание вхождения программы в вечный цикл, проводиться проверка и при необходимости цикл прерывается:

КолСообщений = 0; Для Сч = Счетчик По Сдвиг Цикл Сообщить(Сч); КолСообщений = КолСообщений + 1; Если КолСообщений > КоличествоСообщений Тогда Сообщить (“Количество сообщений больше заданного значения. Цикл прерван!”); Прервать; КонецЕсли; Сч = Сч + Шаг – 1; КонецЦикла;

*Данный пример мы привели во внешней обработке.

Цикл «Для Каждого…»

Оператор цикла Для Каждого предназначен для циклического обхода коллекций значений. При каждой итерации цикла возвращается новый элемент коллекции. Обход осуществляется до тех пор, пока не будут перебраны все элементы коллекции.

Для Каждого <Переменная> Из < КоллекцияЗначений> Цикл // Код КонецЦикла;

  • Переменная: при каждом входе в цикл переменной присваивается значение очередного элемента коллекции.
  • КоллекцияЗначений: коллекция значений, элементы которой будут присваиваются переменной Переменная.

Пример 1 – Простой обход таблицы значения

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

Таб = Новый ТаблицаЗначений; Таб.Колонки.Добавить(“Автомобиль”); Таб.Колонки.Добавить(“Класс”); Таб.Колонки.Добавить(“Вес”); Стр = Таб.Добавить(); Стр.Автомобиль = “KIA”; Стр.Класс = “A Класс”; Стр.Вес = 1100; Стр = Таб.Добавить(); Стр.Автомобиль = “Ford”; Стр.Класс = “B Класс”; Стр.Вес = 1300; Стр = Таб.Добавить(); Стр.Автомобиль = “BMW”; Стр.Класс = “C Класс”; Стр.Вес = 1400;

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

ИндексЗначение элементаТип элементаАвтомобильКлассВес
СтрокаТаблицыЗначенийСтрокаТаблицыЗначений«KIA»«A Класс»1 100
1СтрокаТаблицыЗначенийСтрокаТаблицыЗначений«Ford»«B Класс»1 300
2СтрокаТаблицыЗначенийСтрокаТаблицыЗначений«BMW»«C Класс»1 400

Теперь реализуем обход по коллекции с помощью цикла Для Каждого.

Для Каждого Ст Из Таб Цикл Сообщить(“Автомобиль ” + Ст.Автомобиль + ” ” + Ст.Класс + “а имеет вес ” + Ст.Вес +” кг.”); КонецЦикла; // Ответ 1 – Автомобиль KIA A Класса имеет вес 1 100 кг. // Ответ 2 – Автомобиль Ford B Класса имеет вес 1 300 кг. // Ответ 3 – Автомобиль BMW C Класса имеет вес 1 400 кг.

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

*Данный пример мы привели во внешней обработке.

Пример 2 – Обход массива

Создадим еще одну коллекцию. Массив, в отличии от таблиц значений, можно создать на клиенте тоже.

МоиПодруги = Новый Массив; МоиПодруги.Добавить(“Арина”); МоиПодруги.Добавить(“Марина”); МоиПодруги.Добавить(“Карина”);

Взглянем на коллекцию:

ИндексЗначение элементаТип элемента
«Арина»Строка
1«Марина»Строка
2«Карина»Строка

А теперь реализуем обход по коллекции, с помощью цикла Для Каждого:

Для Каждого Имя Из МоиПодруги Цикл Сообщить(Имя); КонецЦикла; // Ответ 1 – Арина // Ответ 2 – Марина // Ответ 3 – Карина

Читайте также:  Какая должна быть длина цикла

Пример 3 – Оператор «Продолжить»

Еще один пример, где применим оператор Продолжить:

МоиЛюбимыеЦифры = Новый Массив; МоиЛюбимыеЦифры.Добавить(3); МоиЛюбимыеЦифры.Добавить(7); МоиЛюбимыеЦифры.Добавить(8); МоиЛюбимыеЦифры.Добавить(9);

ИндексЗначение элементаТип элемента
3Число
17Число
28Число
39Число

Для Каждого Ст Из МоиЛюбимыеЦифры Цикл Если Ст <> 8 Тогда Продолжить; Иначе Сообщить(“Я люблю цифру ” + Ст + “!”) КонецЕсли; КонецЦикла; // Ответ – Я люблю цифру 8!

Цикл «Пока…»

Оператор цикла Пока предназначен для циклического повторения операторов, находящиеся внутри конструкции Цикл – КонецЦикла. Цикл выполняется, пока логическое выражение равно Истина. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла. (Описание: синтакс-помощник)

Пока <Выражение> Цикл // Код КонецЦикла;

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

Пример 1 – Обход массива с счетчиком

МоиЛюбимыеКонфеты = Новый Массив (); МоиЛюбимыеКонфеты.Добавить(“Снегурочка N1”); МоиЛюбимыеКонфеты.Добавить(“Баядерка N2”); МоиЛюбимыеКонфеты.Добавить(“Синяя птица N3”); МоиЛюбимыеКонфеты.Добавить(“Красная Шапочка N4”);

Взглянем на коллекцию.

ИндексЗначение элементаТип элемента
«Снегурочка N1»Строка
1«Баядерка N2»Строка
2«Синяя птица N3»Строка
3«Красная Шапочка N4»Строка

Сч = 0; Пока Сч < МоиЛюбимыеКонфеты.Количество() Цикл Сообщить(МоиЛюбимыеКонфеты[Сч]); Сч = Сч + 1; КонецЦикла; //Ответ 1 – Снегурочка N1 //Ответ 2 – Баядерка N2 //Ответ 3 – Синяя птица N3 //Ответ 4 – Красная Шапочка N4

Как мы знаем, индексы строк в коллекции начинаются с 0-я. Это прекрасно видно на развернутом виде коллекции.

  • МоиЛюбимыеКонфеты.Количество() определяет количество срок в коллекции, что в данном случае рано 4-ом.
  • МоиЛюбимыеКонфеты[Сч] определяет элемент коллекции по индексу, где Сч играет роль индекса, и при каждом входе в цикл прибавляется на единицу. Тем самим, мы с каждым разом обращаемся к следующей строке коллекции, начиная со строки с индексом 0. И цикл будет продолжаться, пока значение логического выражение Сч < МоиЛюбимыеКонфеты.Количество() не станет ровному Ложь.

*Данный пример мы привели во внешней обработке.

Пример 2 – Обратный цикл с счетчиком

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

Обратимся к тому же массиву, но напишем код обратного цикла.

МоиЛюбимыеКонфеты = Новый Массив(); МоиЛюбимыеКонфеты.Добавить(“Снегурочка N1”); МоиЛюбимыеКонфеты.Добавить(“Баядерка N2”); МоиЛюбимыеКонфеты.Добавить(“Синяя птица N3”); МоиЛюбимыеКонфеты.Добавить(“Красная Шапочка N4”); Сч = МоиЛюбимыеКонфеты.Количество() – 1; Пока Сч >= 0 Цикл Сообщить(МоиЛюбимыеКонфеты[Сч]); // Среда Вторник Понедельник Сч = Сч – 1; КонецЦикла; //Ответ 4 – Красная Шапочка N4 //Ответ 3 – Синяя птица N3 //Ответ 2 – Баядерка N2 //Ответ 1 – Снегурочка N1

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

*Данный пример мы привели во внешней обработке.

«Прервать» и «Продолжить» в циклах 1С 8.3

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

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

Видео Школы 1С по теме циклов

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

Источник

Цикл – это конструкция, которая предназначена для многократного исполнения неких инструкций. Во встроенном языке 1С существует три вида циклов «Пока», «Для» и «Для Каждого». Рассмотрим на примерах работу с каждым из них.

Цикл «Пока»

Синтаксис:

Пока <Логическое выражение> Цикл

// Операторы

КонецЦикла;

Принцип работы такого цикла заключается в том, что операторы находящиеся после ключевого слова «Цикл», будут выполнятся пока логическое выражение будет равно ИСТИНА.

Пример:

Счётчик = 1; Пока Счётчик <= 5 Цикл Сообщить(Счётчик); Счётчик = Счётчик + 1; КонецЦикла;

В результате выполнения такого цикла, в окно сообщений будут последовательно выведены цифры от 1 до 5.

Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.

Связаться с нами можно по телефону +7 499 350 29 00.

Услуги и цены можно увидеть по ссылке.

Будем рады помочь Вам!

Цикл «Для»

Синтаксис:

Для <Имя переменной> = <Начальное значение> По <Конечное значение> Цикл

// Операторы

КонецЦикла;

После начального присвоения значения для переменной после ключевого слова «Для», такой цикл прекратится, когда значение переменной будет меньше либо равно конечному значению после ключевого слова «По». В таком цикле приращение переменной происходит автоматически, и всегда равно «1».

Читайте также:  Циклы для перебора массивов php

Пример:

Для Счётчик = 1 По 5 Цикл Сообщить(Счётчик); КонецЦикла;

Результат:

Цикл «Для Каждого»

Синтаксис:

Для Каждого <Элемент> Из <Коллекция> Цикл

// Операторы

КонецЦикла;

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

Пример кода:

// Создание массива Массив = Новый Массив(); // Наполнение массива Массив.Добавить(“Элемент №1”); Массив.Добавить(“Элемент №2”); Массив.Добавить(“Элемент №3”); // Обход массива по элементам Для Каждого Элемент Из Массив Цикл Сообщить(Элемент); КонецЦикла;

Визуальное представление созданного массива в 1С:

Результат работы цикла:

Вложенные циклы

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

Пример:

КоллекцияКолонок = ТаблицаЗначений.Колонки; Для Каждого ТекущаяСтрока Из ТаблицаЗначений Цикл Для Каждого ТекущаяКолонка Из КоллекцияКолонок Цикл // Получаем значение ячейки ТекущаяЯчейка = ТекущаяСтрока[ТекущаяКолонка.Имя]; КонецЦикла; КонецЦикла;

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

Как организовать обратный цикл

Пример:

Счётчик = 5; Пока Счётчик >= 1 Цикл Сообщить(Счётчик); Счётчик = Счётчик – 1; КонецЦикла;

Результат:

Как принудительно продолжить цикл

Принудительный переход к следующей итерации в циклах 1С осуществляется с помощью оператора «Продолжить» (Continue).

Пример:

Для Счетчик = 1 По 5 Цикл Если Счетчик = 2 Тогда Продолжить; КонецЕсли; Сообщить(Счетчик); КонецЦикла;

В таком примере с помощью операторов «Если» и «Продолжить» пропускаем цифру «2».

Результат:

Как прервать цикл

Полный выход из цикла (прерывание) во встроенном языке программирования 1С осуществляется с помощью оператора «Прервать» (Break).

Пример:

Для Счетчик = 1 По 5 Цикл Если Счетчик = 2 Тогда Прервать; КонецЕсли; Сообщить(Счетчик); КонецЦикла;

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

Результат:

Источник

В статье будут описаны циклы 1с 8: их разновидности, назначение и применение. А также рассмотрены примеры их использования для конкретных задач. Цикл в 1с, как и в других языках программирования, предназначен для многократного повторения операторов, находящихся внутри него.

В 1с существует три вида циклов:

Вид циклаОписание
ПокаЦикл осуществляющий повторения, пока выполняется условие.
ДляЦикл осуществляющий заданное количество повторений.
Для каждогоЦикл для обхода коллекций. Обходит каждую строку заданной коллекции.

Цикл Пока

Данный цикл предназначен для осуществления повторений, пока выполняется условие. Синтаксис цикла выглядит так:

Пока <Логическое выражение> Цикл // Операторы КонецЦикла;

Для выполнения очередного повторения Логическое выражение должно возвращать значение Истина. Это работает следующим образом:

  1. Вычисляем значение Логического выражения. Если оно Ложь, цикл завершается. Если Истина:
  2. Выполняем операторы цикла;
  3. Возвращаемся на п. 1.

Пример 1. При помощи сообщения вывести пользователю цифры от 1 до 10.

Цифра = 1; Пока Цифра <= 10 Цикл Сообщить(Цифра); Цифра = Цифра + 1; КонецЦикла;

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

Пример 2. А теперь только не четные, в интервале от 1 до 100, в обратном порядке.

Цифра = 100; Пока Цифра >= 1 Цикл Если Цифра % 2 = 1 Тогда Сообщить(Цифра); КонецЕсли; Цифра = Цифра – 1; КонецЦикла;

В примере используется операция %. Она получает остаток от деления одного числа на другое.

При помощи цикла Пока можно обойти массив или любую другую коллекцию в обратном порядке. Это необходимо не часто, но реализовать такой механизм при помощи других циклов проблематично. Рассмотрим такой механизм в примере 3.

Массив = Новый Массив; Массив.Добавить(1); Массив.Добавить(2); Массив.Добавить(3); Индекс = Массив.Количество(); Пока Индекс > 0 Цикл ЭлементМассива = Массив[Индекс – 1]; Сообщить(ЭлементМассива); Индекс = Индекс – 1; КонецЦикла;

Также цикл Пока часто используется для обхода выборки из результата запроса. У выборки для этого есть специальный метод Следующий(). Он осуществляет переход на следующую строку и возвращает Истина, если такая строка есть. Если же следующая строка отсутствует в выборке, метод возвращает Ложь. Нельзя забывать, что работу с запросом можно осуществлять только в серверной процедуре (или функции).

Читайте также:  Пример на цикл менеджмента

Пример 4. При помощи запроса выбрать всех пользователей, кроме недействительных. Обойти выборку циклом Пока.

Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | Пользователи.Ссылка КАК Ссылка |ИЗ | Справочник.Пользователи КАК Пользователи |ГДЕ | НЕ Пользователи.Недействителен”; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Сообщить(Выборка.Ссылка); КонецЦикла;

Цикл Для

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

Для <Счетчик> = <Выражение1> По <Выражение2> Цикл // Операторы КонецЦикла;

При каждом проходе цикл увеличивает значение в переменной Счетчик на 1. Начальное значение счетчика указывается в Выражение1, конечное в Выражение2.

Пример 5. Воспользуемся заданием из первого примера и выведем числа от 1 до 10.

Для Счетчик = 1 По 10 Цикл Сообщить(Счетчик); КонецЦикла;

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

Пример 6. Вывести посимвольно строку «Привет мир!».

Текст = “Привет мир!”; ДлинаСтроки = СтрДлина(Текст); Для НомерСимвола = 1 По ДлинаСтроки Цикл Символ = Сред(Текст, НомерСимвола, 1); Сообщить(Символ); КонецЦикла;

То есть при помощи цикла Для мы обходим номера символов строки. А внутри цикла получаем символ по его номеру.

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

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

Для каждого <Переменная1> Из <Переменная2> Цикл // Операторы КонецЦикла;

В Переменная2 указывается коллекция, а в Переменная1 на каждом проходе цикла будет содержаться элемент коллекции. Контролировать количество элементов при этом не нужно, это делается автоматически. То есть цикл закончит выполняться, как только закончатся элементы коллекции.

Пример 7. Получить сумму элементов числового массива.

Массив = Новый Массив; Массив.Добавить(100); Массив.Добавить(-5); Массив.Добавить(3.4); Массив.Добавить(0); Массив.Добавить(3); СуммаЭлементов = 0; Для Каждого ЭлементМассива Из Массив Цикл СуммаЭлементов = СуммаЭлементов + ЭлементМассива; КонецЦикла; Сообщить(СуммаЭлементов);

В переменной ЭлементМассива при каждом повторении цикла содержится число. Сложив их все, получаем: 101,4.

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

Пример 8. При помощи запроса выбрать всех пользователей. Выгрузить результат в таблицу значений, обойти ее и вывести пользователей с заполненным физическим лицом.

Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | Пользователи.Ссылка КАК Пользователь, | Пользователи.ФизическоеЛицо КАК ФизическоеЛицо |ИЗ | Справочник.Пользователи КАК Пользователи”; Таблица = Запрос.Выполнить().Выгрузить(); Для Каждого СтрокаТаблицы Из Таблица Цикл Если ЗначениеЗаполнено(СтрокаТаблицы.ФизическоеЛицо) Тогда Сообщить(СтрокаТаблицы.Пользователь); КонецЕсли; КонецЦикла;

В примере видно, что переменная СтрокаТаблицы на каждом проходе цикла, содержит очередную строку таблицы. Доступ к ее полям осуществляется через «точку».

Специальные операторы циклов

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

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

Пример 9. Немного модифицируем код из предыдущего примера, и напишем его с использованием оператора Продолжить.

Для Каждого СтрокаТаблицы Из Таблица Цикл Если Не ЗначениеЗаполнено(СтрокаТаблицы.ФизическоеЛицо) Тогда Продолжить; КонецЕсли; Сообщить(СтрокаТаблицы.Пользователь); КонецЦикла;

Завершаем проход цикла, если физическое лицо не заполнено. Метод Сообщить будет выполняться, только при условии наличия физлица.

С оператором Прервать все еще проще, он завершает выполнение цикла. Вне зависимости от того, сколько повторений еще должно было выполниться.

Пример 10. Рассмотрим задачу из самого первого примера. Выведем числа от 1 до 10 циклом Пока. Но при этом модифицируем программный код.

Цифра = 1; Пока Истина Цикл Если Цифра > 10 Тогда Прервать; КонецЕсли; Сообщить(Цифра); Цифра = Цифра + 1; КонецЦикла;

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

Также вы можете скачать обработку со всеми рассмотренными примерами Циклы 1с – примеры. Обработка написана под управляемое приложение, в качестве конфигурации для запросов использовалась демо-база БСП 3.1.

Циклы 1с 8 - примеры

Источник