Используйте инструкцию «Для Каждого … Цикл»
страницаИспользуйте инструкцию «Для Каждого … Цикл»
Вот третий «секрет». Ранее вы уже познакомились с инструкцией Цикл. Она позволяет многократно выполнять некоторый набор инструкций. Цикл часто используется при работе с коллекциями. Например, для того чтобы перебрать все элементы коллекции и выполнить с ними какие-то действия.
Чтобы не усложнять, напишите самый простой пример. У вас есть массив с названиями дней недели. Вам нужно выбрать из него только будние дни и скопировать их в новый массив.
С помощью цикла это можно выполнить следующим образом (листинг 7.14).
Листинг **7.**14. Перебор элементов коллекции в цикле
БудниеДни = Новый Массив();
Для Индекс = 0 По ДниНедели.ВГраница() Цикл
ТекущийЭлемент = ДниНедели[Индекс];
Если ТекущийЭлемент = "Суббота" ИЛИ ТекущийЭлемент = "Воскресенье" Тогда
Продолжить;
Иначе
БудниеДни.Добавить(ТекущийЭлемент);
КонецЕсли;
КонецЦикла;
Можете дописать этот пример к своему массиву и посмотреть с помощью отладки, как он работает. Особенно наглядно вы увидите это в панели Переменные (рис. 7.178).

Рис. 7.17****8. Пример в панели «Переменные»
Сначала вы создаете новый массив, в который будете помещать будние дни. После этого последовательно, от нуля до последнего индекса, перебираете все элементы массива.
Значение текущего элемента вы получаете по его индексу с помощью операции «квадратные скобки». Если это значение Суббота или Воскресенье, то вы ничего не делаете и переходите к следующей итерации цикла. То есть к его началу. Для этого используется новая для вас инструкция Продолжить.
А во всех других случаях вы добавляете название буднего дня в свой заранее созданный массив.
Сделайте этот пример в своей конфигурации и в режиме отладки посмотрите по шагам, как он работает. В том числе посмотрите, как работает инструкция Продолжить.
Такие задачи, когда нужно перебрать все элементы коллекции, встречаются очень часто. Поэтому во встроенном языке существует специальная форма инструкции Цикл. Она обозначается Для Каждого Цикл. И тот же самый пример с ее использованием будет выглядеть так (листинг 7.15).
Листинг **7.**15. Инструкция «Для Каждого Цикл»
БудниеДни = Новый Массив();
Для Каждого ТекущийЭлемент Из ДниНедели Цикл
Если ТекущийЭлемент = "Суббота" ИЛИ ТекущийЭлемент = "Воскресенье" Тогда
Продолжить;
Иначе
БудниеДни.Добавить(ТекущийЭлемент);
КонецЕсли;
КонецЦикла;
Вы видите, что выглядит этот пример проще и читается легче.
Если сравнить оба примера, то видно, что по сути инструкция Для Каждого Цикл заменила собой сразу две строки, которые были в вашем старом примере (рис. 7.179).

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