Циклы являются одной из основных управляющих конструкций во многих языках программирования, в том числе и во встроенном языке 1С. Они предназначены для повторяющегося (циклического) выполнения одного и того же фрагмента кода, до тех пор, пока соблюдаются некоторые условия.
В 1С существует три вида циклов – “Для”, “Для каждого” и “Пока”. В статье рассмотрены основные приемы работы с циклами, и распространенные варианты использования циклов в программном коде 1С.
Содержание
Общий синтаксис
Все циклы представляют собой конструкции вида
Цикл
// Операторы
[Прервать;][Продолжить;]КонецЦикла;
Внутри этой управляющей конструкции размещается тело цикла – это код, который должен повторно выполняться в соответствии с условием цикла. У всех циклов есть возможность принудительного выхода из цикла при помощи оператора Прервать, и принудительного перехода к следующей итерации(так называется проход тела цикла с начала) при помощи оператора Продолжить.
Цикл Для
Оператор цикла Для используется для выполнения некоторого кода заданное количество повторений. Для этого используется счетчик. Синтаксис цикла выглядит так:
Для Итератор = Выражение1 по Выражение2 Цикл
КонецЦикла;
Итератор – это переменная, которая принимает значения в диапазоне чисел Выражение1 – Выражение2. Каждый обход цикла значение счетчика автоматически увеличивается на единицу.
Выражение1 – это начальное значение счетчика, которое присваивается при первой итерации цикла.
Выражение2 – это максимальное значение счетчика.
Выражение1 и Выражение2 могут быть заданы как непосредственно числами, так и переменными, или результатом выполнения функции. Оба выражения вычисляются только один раз – при первом проходе цикла
// Выведем табличный документ
// у которого в первой колонке заполнены первые 10 строк цифрами 1...10
ТабДок = Новый ТабличныйДокумент;
Для СчетчикСтрок = 1 По 10 Цикл
ТабДок.Область(СчетчикСтрок,1).Текст = СчетчикСтрок;
КонецЦикла;
ТабДок.Показать();
Цикл Для удобно использовать для выполнения кода нужное количество раз. Например, выполнить код столько раз, сколько колонок (или строк) содержится в табличном документе.
Цикл Пока
Данный тип цикла предназначен для циклического выполнения тела цикла до тех пор, пока выполняется условие.
Синтаксис цикла выглядит так:
Пока Условие Цикл
КонецЦикла;
Условием может быть любое выражение на встроенном языке, которое может быть приведено к типу Булево.
//Посчитаем, за сколько итераций дойдем до нужной суммы
НакопленныйИтог = 0;
КолвоШагов = 0;
ДлинаШага = 22;
Пока НакопленныйИтог <= 1000 Цикл
НакопленныйИтог = НакопленныйИтог + ДлинаШага;
КолвоШагов = КолвоШагов + 1;
КонецЦикла;
Сообщить(СтрШаблон("Дошли до 1000 с шагом %2 за %1 шагов", КолвоШагов, ДлинаШага));
Цикл Для Каждого
Данный цикл служит для циклического обхода элементов какой-нибудь коллекции – массива, структуры, таблицы значений, и т.д. Как правило, при этом в теле цикла производятся какие-то действия с каждым полученным элементом.
//Обработаем каждый элемент структуры и выведем сообщение
КоллекцияДляОбработки = Новый Структура("Иванов, Петров, Сидоров");
Для Каждого ЭлементКоллекции Из КоллекцияДляОбработки Цикл
КоллекцияДляОбработки[ЭлементКоллекции.Ключ] = СтрЗаменить(ЭлементКоллекции.Ключ,"ов","");
Сообщить(СтрШаблон("%1 %2", ЭлементКоллекции.Ключ, КоллекцияДляОбработки[ЭлементКоллекции.Ключ]));
КонецЦикла
Вложенные циклы
Циклы могут помещаться внутрь других циклов, при этом количество уровней вложенности платформой не ограничивается. Вложенные циклы, в частности, используются для обхода каждой ячейки табличного документа – например, внешний цикл по строкам, и вложенный – по колонкам.
//Выведем табличный документ с заполненной сеткой ячеек 10 на 10
ТабДок = Новый ТабличныйДокумент;
ИтоговыйСчетчик = 1;
Для СчетчикСтрок = 1 По 10 Цикл
Для СчетчикКолонок = 1 По 10 Цикл
ТабДок.Область(СчетчикСтрок, СчетчикКолонок).Текст = ИтоговыйСчетчик;
ИтоговыйСчетчик = ИтоговыйСчетчик + 1;
КонецЦикла;
КонецЦикла;
ТабДок.Показать();
Бесконечные циклы
Циклы Пока могут выполняться бесконечное количество раз, в том случае когда условие исполнения цикла всегда является истинным. Бесконечный цикл может быть как ошибкой в коде, так и специально использоваться разработчиком в некоторых случаях.
Часто бесконечный цикл применяется в следующих случаях:
1. Ожидается, что в теле цикла условие будет изменено на ложное при выполнении каких-то других условий.
2. Ожидается, что в теле цикла будет вызван оператор Прервать при выполнении каких-то условий
//Ждем пока пользователь не прервет цикл, но не дольше 1000000 повторений
КонтрольныйСчетчик = 1000000;
Сч = 0;
Пока Истина Цикл
ОбработкаПрерыванияПользователя();
Если Сч >= КонтрольныйСчетчик Тогда
Сообщить("не дождались пользователя, прерываем!");
Прервать;
КонецЕсли;
Сч = Сч + 1;
КонецЦикла;
Обратный цикл
Распространенный прием в случае, когда нужно удалить некоторые элементы коллекции по условию. В этом случае необходимо обойти эту коллекцию (массив, таблицу значений, список) снизу вверх.
Массив = Новый Массив;
Массив.Добавить("это");
Массив.Добавить("говорит");
Массив.Добавить("Йода");
Счетчик = Массив.ВГраница();
Пока Счетчик >= 0 Цикл
Сообщить(Массив[Счетчик]); // Йода говорит это
Счетчик = Счетчик - 1;
КонецЦикла;