Закажите бесплатный расчет стоимости вашей задачи по 1С!
Перезвоним за 10 минут! (в рабочие часы)

Циклы в программировании 1С 8.3

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

Цикл «Для…»

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

Для <Переменная> = <Знач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;

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

Индекс Значение элемента Тип элемента Автомобиль Класс Вес
0 СтрокаТаблицыЗначений СтрокаТаблицыЗначений «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 — Обход массива

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

МоиПодруги = Новый Массив;

МоиПодруги.Добавить("Арина");

МоиПодруги.Добавить("Марина");

МоиПодруги.Добавить("Карина");

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

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

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

Для Каждого Имя Из МоиПодруги Цикл

Сообщить(Имя);

КонецЦикла;

// Ответ 1 - Арина

// Ответ 2 - Марина

// Ответ 3 – Карина

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

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

МоиЛюбимыеЦифры = Новый Массив;

МоиЛюбимыеЦифры.Добавить(3);

МоиЛюбимыеЦифры.Добавить(7);

МоиЛюбимыеЦифры.Добавить(8);

МоиЛюбимыеЦифры.Добавить(9);
Индекс Значение элемента Тип элемента
0 3 Число
1 7 Число
2 8 Число
3 9 Число
Для Каждого Ст Из МоиЛюбимыеЦифры Цикл

Если   Ст <> 8 Тогда

Продолжить;

Иначе

Сообщить("Я люблю цифру " +  Ст + "!")

КонецЕсли;

КонецЦикла;

// Ответ - Я люблю цифру 8!

Цикл «Пока…»

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

Пока <Выражение> Цикл

// Код

КонецЦикла;

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

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

МоиЛюбимыеКонфеты = Новый Массив ();

МоиЛюбимыеКонфеты.Добавить("Снегурочка N1");

МоиЛюбимыеКонфеты.Добавить("Баядерка N2");

МоиЛюбимыеКонфеты.Добавить("Синяя птица N3");

МоиЛюбимыеКонфеты.Добавить("Красная Шапочка N4");

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

Индекс Значение элемента Тип элемента
0 «Снегурочка 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С 8.3
  1. Полагаю , что в примере сообщения будут немного другие
    //Ответ 4 — Красная Шапочка N3
    //Ответ 3 — Синяя птица N2
    //Ответ 2 – Баядерка N1
    //Ответ 1 – Снегурочка N0

    Ответить

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

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