Циклы
4 мин
Определение
Циклы используются, когда нужно выполнить одинаковые действия множество раз. Представим себе, что нужно вывести на экран числа от 1 до 10. Мы могли бы 10 раз написать Сообщить(), но гораздо удобнее автоматизировать этот процесс и использовать цикл.
Например:
Для Индекс = 1 по 10 Цикл
Сообщить(Индекс);
КонецЦикла;
Во встроенном языке 3 вида циклов, рассмотрим каждый из них:
Используется если заранее известно количество повторений (итераций)
Описание:
Для <Имя переменной> = <Выражение 1> По <Выражение 2> Цикл
// Операторы
КонецЦикла
<Имя переменной> - переменная, именуемая счетчиком
увеличивается на 1 при каждом повторении пока не достигнет конечного значения
<Выражение 1> - начальное значение счетчика
<Выражение 2> - конечное значение счетчика, при его достижении выход из цикла
<Выражение 1>, <Выражение 2> - выражения результатом которого будет число, или само число
В примере,
Индекс - счетчик цикла,
Индекс = 1 - счет начинается с 1,
по 10 - выполнение повторяющихся действий (цикла) закончится когда Индекс будет равен 10,
Каждое действие (итерацию) к значению счетчика будет прибавляться 1
Для Индекс = -1 по 1 Цикл
Сообщить(Индекс);
КонецЦикла;
Цикл будет выполняться 3 раза (3 итерации цикла). В таблице ниже значение переменной Индекс в различных итерациях
Итерация | Индекс |
---|---|
1 | -1 |
2 | 0 |
3 | 1 |
Внутри цикла возможно выполнять действия со счетчиком
Для Индекс = -1 по 1 Цикл
Индекс = 1;
Сообщить(Индекс);
КонецЦикла;
Итерация | Индекс |
---|---|
1 | 1 |
Используется если количество элементов заранее не известно
Описание:
Для каждого <Имя переменной 1> Из <Имя переменной 2> Цикл
// Операторы
КонецЦикла;
<Имя переменной 1> - При каждой повторении присваивается значение следующего элемента коллекции
<Имя переменной 2> - Коллекция, элементы которой будут в <Имя переменной 1>
Цикл закончится когда все элементы будут перебраны
Пример:
Сотрудники = Новый Массив;
Сотрудники.Добавить("Иванов");
Сотрудники.Добавить("Петров");
Для Каждого Фамилия Из Сотрудники Цикл
Сообщить(Фамилия);
КонецЦикла;
Используется если известно условие окончание цикла
Описание:
Пока <Логическое выражение> Цикл
// Операторы
КонецЦикла;
Цикл выполняется пока <Логическое выражение> истинно
Сч = 3;
Пока Сч > 0 Цикл
Сч = Сч - 1;
КонецЦикла;
Часто цикл Пока используется в выборке, с которой познакомимся позднее
Выборка = Справочники.НаименованияТоваров.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
У циклов итерацию можно принудительно:
- продолжить - управление переходит в начало цикла,
- прервать - цикл прерывается в любой точке.
Например:
Сотрудники = Новый Массив;
Сотрудники.Добавить("Иванов");
Сотрудники.Добавить("Петров");
Сотрудники.Добавить("Сидоров");
Для каждого Фамилия Из Сотрудники Цикл
Если Фамилия = "Иванов" Тогда
Продолжить;
КонецЕсли;
Сообщить(Фамилия);
КонецЦикла;
Сч = 0;
Пока Истина Цикл
Сч = Сч + 1;
Сообщить(Сч);
Если Сч > 10 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Не оправданные действия со счетчиком и присутствие не достижимого условия выхода могут привести к бесконечному циклу:
Для Индекс = -1 по 1 Цикл
Индекс = -1;
Сообщить(Индекс);
КонецЦикла;
ЗагрузитьДанныеСервера();
КонецЦикла;
Внутри циклов может быть сколько угодно других циклов
ТелефоныРогаИКопыта = Новый Соответствие();
ТелефоныРогаИКопыта.Вставить("111-11111", "Директор");
ТелефоныРогаИКопыта.Вставить("222-11111", "ГлавныйБухгалтер");
ТелефоныРомашка = Новый Соответствие();
ТелефоныРомашка.Вставить("333-11111", "Директор");
ТелефоныРомашка.Вставить("444-11111", "ГлавныйБухгалтер");
Организации = Новый Структура;
Организации.Вставить("РогаИКопыта", ТелефоныРогаИКопыта);
Организации.Вставить("Ромашка", ТелефоныРомашка);
Для Каждого Организация Из Организации Цикл
Сообщить("Организация " + Организация.Ключ);
Для Каждого Телефон Из Организация.Значение Цикл
Должность = Телефон.Значение;
НомерТелефона =Телефон.Ключ;
Сообщить(Должность + ": " + НомерТелефона);
КонецЦикла;
КонецЦикла;
Примеры:
- Цикл для соответствия или структуры
Телефоны.Вставить("111-11111", "Директор");
Телефоны.Вставить("222-11111", "Бухгалтер");
Для Каждого КлючЗначение Из Телефоны Цикл
Сообщить("Должность: " + КлючЗначение.Значение + ", номер телефона: "
+ КлючЗначение.Ключ);
КонецЦикла;
- Обратный цикл
Сотрудники.Добавить("Иванов");
Сотрудники.Добавить("Петров");
Сотрудники.Добавить("Сидоров");
КоличествоСотрудников = Сотрудники.Количество();
Для Индекс = 1 По КоличествоСотрудников Цикл
ТекЭлемент = Сотрудники[КоличествоСотрудников - Индекс];
Сообщить(ТекЭлемент);
КонецЦикла;
- Перебрать строку символов
Для Индекс = 1 По СтрДлина(Строка) Цикл
Сообщить(Сред(Строка, Индекс, 1));
КонецЦикла;
Подробнее о СтрДлина(), Сред() и тп. в Работа со строками
Задачи на эту тему:
- Сумма цифр числа
- Создание таблицы значений из массива структур
- Матрица
- Расчет скидки на сумму
- Максимальное число
- Рост сбережений
- Конвертер температур
- Проверка на простоту
- Расчет процента
- Простейший цикл Для По
- Факториал числа
- Таблица умножения
- Кратные числа
- Кратные числа в обратном порядке
- Массив структур
- Инфляция
- Средняя продолжительность рабочего дня
- Заполнить номера
- Проверка диапазона на простоту