Добавить в корзинуПозвонить
Найти в Дзене

23. Инструкция "Для Каждого Цикл" / Life hack (хитрость) 3

Ранее знакомились с инструкцией Цикл, которая позволяет многократно выполнять некоторый набор инструкций и часто используется при
работе с коллекциями, например, чтобы перебрать все элементы коллекции и
выполнить с ними какие-то действия.
Например, напишем массив с названиями дней недели. Выберем из него только будние дни и скопируем их в новый массив.
С помощью цикла это можно выполнить в соответствии с листингом 3.55: БудниеДни = Новый Массив();
Для Индекс = 0 По ДниНедели.ВГраница() Цикл
ТекущийЭлемент = ДниНедели[Индекс];
Если ТекущийЭлемент = "Суббота" ИЛИ ТекущийЭлемент = "Воскресенье" Тогда
Продолжить;
Иначе
БудниеДни.Добавить(ТекущийЭлемент);
КонецЕсли;
КонецЦикла; Допишите этот пример к имеющемуся массиву и посмотрите как он работает в пользовательском режиме.
Сначала создаём новый массив, в который будут помещаться будние дни. После
этого последовательно, от нуля до последнего индекса, перебираем все элементы массива.
Значение текущего элемента получаем по его индексу с помо

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

БудниеДни = Новый Массив();
Для Индекс = 0 По ДниНедели.ВГраница() Цикл
ТекущийЭлемент = ДниНедели[Индекс];
Если ТекущийЭлемент = "Суббота" ИЛИ ТекущийЭлемент = "Воскресенье" Тогда
Продолжить;
Иначе
БудниеДни.Добавить(ТекущийЭлемент);
КонецЕсли;
КонецЦикла;

Допишите этот пример к имеющемуся массиву и посмотрите как он работает в пользовательском режиме.
Сначала создаём новый массив, в который будут помещаться будние дни. После
этого последовательно, от нуля до последнего индекса, перебираем все элементы массива.
Значение текущего элемента получаем по его индексу с помощью операции «квадратные скобки». Если это значение Суббота или Воскресенье, то ничего не делаем и переходим к следующей итерации цикла, то есть к его началу. Для этого используем новую инструкцию
Продолжить.
Во всех других случаях добавим название буднего дня в свой заранее созданный массив.
Сделаем этот пример в своей конфигурации и в режиме отладки и посмотрим по шагам, как он работает. В том числе посмотрим, как работает инструкция
Продолжить.
Такие задачи, когда нужно перебрать все элементы коллекции, встречаются очень часто, поэтому во встроенном языке существует специальная форма инструкции
Цикл, обозначаемая Для Каждого Цикл. И тот же самый пример с её использованием будет выглядеть как в листинге 3.56:

БудниеДни = Новый Массив();
Для Каждого ТекущийЭлемент Из ДниНедели Цикл
Если ТекущийЭлемент = "Суббота" ИЛИ ТекущийЭлемент = "Воскресенье" Тогда
Продолжить;
Иначе
БудниеДни.Добавить(ТекущийЭлемент);
КонецЕсли;
КонецЦикла;

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

БудниеДни = Новый Массив();
Для Каждого ТекущийЭлемент Из ДниНедели Цикл
Если ТекущийЭлемент = "Суббота" ИЛИ ТекущийЭлемент = "Воскресенье" Тогда
Продолжить;
Иначе
БудниеДни.Добавить(ТекущийЭлемент);
КонецЕсли;
КонецЦикла;
БудниеДни = Новый Массив();
Для Индекс = 0 По ДниНедели.ВГраница() Цикл
ТекущийЭлемент = ДниНедели[Индекс];
Если ТекущийЭлемент = "Суббота" ИЛИ ТекущийЭлемент = "Воскресенье" Тогда
Продолжить;
Иначе
БудниеДни.Добавить(ТекущийЭлемент);
КонецЕсли;
КонецЦикла;

Инструкцию Для Каждого Цикл используют тогда, когда порядок обхода коллекции не важен. А важно лишь перебрать все элементы, которые есть в коллекции.
Проверьте в конфигурации, как работает второй вариант этого примера.
В инструкции
Продолжить, с которой познакомились в этом примере, нет ничего сложного. Она используется внутри циклов и только для такой задачи, как в этом примере, когда нужно перейти к очередной итерации цикла, не выполняя операторы, следующие далее.
Кроме
Продолжить внутри цикла может использоваться инструкция Прервать, которая без всяких условий прекращает исполнение цикла и переходит к инструкции, расположенной после КонецЦикла. Инструкция Прервать может понадобиться тогда, когда точно известно, что перебирать коллекцию дальше нет смысла. Например, в массиве дни недели всегда расположены в правильном порядке. Поэтому, если перебираем их с начала и доходим
до субботы, то понятно, что дальше их перебирать нет смысла, так как следующий за субботой день тоже будет выходной. Значит, в условии
Если можно написать Если ТекущийЭлемент = "Суббота" Тогда , затем — Прервать.
Небольшое пояснение. Фрагмент, показанный в листинге 3.56, вряд ли можно встретить в реальной программе, он может быть фрагментом в процессе разработки, когда по очереди прописываются алгоритмы для каждой ветки условия. И, чтобы была возможность проверить написанное, в ветке, которая ещё не готова, пропускается весь цикл.
На самом деле этот фрагмент обычно выглядит иначе. Как именно, узнаете, выполнив задания к этому разделу.
Другое небольшое пояснение касается инструкции
Прервать.Именно в цикле Для Каждого эта инструкция используется редко, так как порядок обхода элементов в таком цикле не определён.
Гораздо чаще эта инструкция используется в циклах, которые имеют определённый порядок обхода. Такой пример можно апробировать также в одном из заданий к этому разделу.


Задание 3.40
Используйте массив ДниНедели:

Добавьте к нему листинг 3.56.
Теперь представьте, что для будних дней нужно не просто выполнить одну строку
БудниеДни.Добавить(ТекущийЭлемент), а реализовать в этом месте
большой и сложный алгоритм. Прятать такой алгоритм внутрь условия
Если
нехорошо и неудобно.
В этом случае обычно поступают следующим образом. В начале цикла сразу
же определяют, подходит очередной день для выполнения алгоритма или нет.
Если не подходит (выходной), то просто переходят к следующей итерации цикла.
Больше никаких проверок не делают. В результате получается, что инструкции,
написанные после
Если, будут выполняться только для подходящих элементов.
Измените листинг 3.56 так, чтобы он соответствовал этой стратегии. С помощью
пошаговой отладки посмотрите, как работает цикл.


Задание 3.41
Используйте массив ДниНедели, показанный на рисунке выше. Добавьте к нему
листинг 3.56.
Обратная ситуация. Алгоритм, который нужно выполнить для будних дней,
небольшой и несложный.
В этом случае с помощью инструкции
Если отбирают только те элементы, которые подходят для этого алгоритма, и выполняют алгоритм. Получается, что
после
Если нет никаких инструкций, и для неподходящих элементов ничего не
выполняется.
Измените листинг 3.56 так, чтобы он соответствовал этой стратегии. С помощью
пошаговой отладки посмотрите, как работает цикл.


Задание 3.42
Используйте массив ДниНедели, показанный на рисунке 3.162. Добавьте к нему
листинг 3.55, в котором используется инструкция Для По Цикл.
Дни недели расположены в массиве в правильном порядке. Вы обходите их в
цикле в том же правильном порядке. Вы точно знаете, что после субботы будет
воскресенье, которое вам не нужно.
Измените листинг так, чтобы не анализировались те дни, которые вам заведомо
не нужны. С помощью пошаговой отладки посмотрите, как работает цикл.

Задание 3.43
Создайте массив и в цикле заполните его годами с 2000 по 2020. Затем из этого массива отберите только високосные годы и поместите их в другой массив.
Високосным считается год, который делится на 4 без остатка.
Объясните, почему вы использовали ту или иную инструкцию цикла. Посмотрите в конфигураторе, сколько високосных лет у вас получилось.