Циклы 1с 8 — описание с примерами

В статье будут описаны циклы 1с 8: их разновидности, назначение и применение. А также рассмотрены примеры их использования для конкретных задач. Цикл в 1с, как и в других языках программирования, предназначен для многократного повторения операторов, находящихся внутри него.

В 1с существует три вида циклов:

 Вид цикла  Описание
Пока Цикл осуществляющий повторения, пока выполняется условие.
Для Цикл осуществляющий заданное количество повторений.
Для каждого Цикл для обхода коллекций. Обходит каждую строку заданной коллекции.

Цикл Пока

Данный цикл предназначен для осуществления повторений, пока выполняется условие. Синтаксис цикла выглядит так:

Пока <Логическое выражение> Цикл
    // Операторы
КонецЦикла;

Для выполнения очередного повторения Логическое выражение должно возвращать значение Истина. Это работает следующим образом:

  1. Вычисляем значение Логического выражения. Если оно Ложь, цикл завершается. Если Истина:
  2. Выполняем операторы цикла;
  3. Возвращаемся на п. 1.

Пример 1. При помощи сообщения вывести пользователю цифры от 1 до 10.

Цифра = 1;
Пока Цифра <= 10 Цикл
		
    Сообщить(Цифра);
    Цифра = Цифра + 1;
		
КонецЦикла;

Таким образом в цикле Пока нам необходимо не только выполнить требуемое действие, но и изменить переменную участвующую в проверке его условия. Если забыть это сделать, можно получить бесконечный цикл, который приведет к зависанию системы.

Пример 2. А теперь только не четные, в интервале от 1 до 100, в обратном порядке.

Цифра = 100;
Пока Цифра >= 1 Цикл
		
    Если Цифра % 2 = 1 Тогда	
	Сообщить(Цифра);
    КонецЕсли;
		
    Цифра = Цифра - 1;
		
КонецЦикла;

В примере используется операция %. Она получает остаток от деления одного числа на другое.

При помощи цикла Пока можно обойти массив или любую другую коллекцию в обратном порядке. Это необходимо не часто, но реализовать такой механизм при помощи других циклов проблематично. Рассмотрим такой механизм в примере 3.

Массив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(3);
	
Индекс = Массив.Количество();
Пока Индекс > 0 Цикл
		
    ЭлементМассива = Массив[Индекс - 1];
    Сообщить(ЭлементМассива);
		
    Индекс = Индекс - 1;
		
КонецЦикла;

Также цикл Пока часто используется для обхода выборки из результата запроса. У выборки для этого есть специальный метод Следующий(). Он осуществляет переход на следующую строку и возвращает Истина, если такая строка есть. Если же следующая строка отсутствует в выборке, метод возвращает Ложь. Нельзя забывать, что работу с запросом можно осуществлять только в серверной процедуре (или функции).

Пример 4. При помощи запроса выбрать всех пользователей, кроме недействительных. Обойти выборку циклом Пока.

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    Пользователи.Ссылка КАК Ссылка
|ИЗ
|    Справочник.Пользователи КАК Пользователи
|ГДЕ
|    НЕ Пользователи.Недействителен";
	
Выборка = Запрос.Выполнить().Выбрать();
	
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Ссылка);
КонецЦикла;

Цикл Для

Предназначен для осуществления заданного количества повторений, это так называемый цикл со счетчиком.

Для <Счетчик> = <Выражение1> По <Выражение2> Цикл
    // Операторы
КонецЦикла;

При каждом проходе цикл увеличивает значение в переменной Счетчик на 1. Начальное значение счетчика указывается в Выражение1, конечное в Выражение2.

Пример 5. Воспользуемся заданием из первого примера и выведем числа от 1 до 10.

Для Счетчик = 1 По 10 Цикл
    Сообщить(Счетчик);
КонецЦикла;

Таким образом в начале выполнения, переменная счетчик будет содержать значение 1. При каждом следующем повторении значение счетчика будет увеличиваться также на единицу, пока не достигнет 10. Повторение со значением счетчика 10, будет последним.

Пример 6. Вывести посимвольно строку «Привет мир!».

Текст = "Привет мир!";
ДлинаСтроки = СтрДлина(Текст);
	
Для НомерСимвола = 1 По ДлинаСтроки Цикл
		
    Символ = Сред(Текст, НомерСимвола, 1);
    Сообщить(Символ);
		
КонецЦикла;

То есть при помощи цикла Для мы обходим номера символов строки. А внутри цикла получаем символ по его номеру.

Цикл Для Каждого

Используется для обхода коллекций. Может обходить таблицы значений, массивы, структуры, списки значений (и любые другие коллекции).

Для каждого <Переменная1> Из <Переменная2> Цикл
    // Операторы
КонецЦикла;

В Переменная2 указывается коллекция, а в Переменная1 на каждом проходе цикла будет содержаться элемент коллекции. Контролировать количество элементов при этом не нужно, это делается автоматически. То есть цикл закончит выполняться, как только закончатся элементы коллекции.

Пример 7. Получить сумму элементов числового массива.

Массив = Новый Массив;
Массив.Добавить(100);
Массив.Добавить(-5);
Массив.Добавить(3.4);
Массив.Добавить(0);
Массив.Добавить(3);
	
СуммаЭлементов = 0;
	
Для Каждого ЭлементМассива Из Массив Цикл
    СуммаЭлементов = СуммаЭлементов + ЭлементМассива;
КонецЦикла;
	
Сообщить(СуммаЭлементов);

В переменной ЭлементМассива при каждом повторении цикла содержится число. Сложив их все, получаем: 101,4.

Цикл Для Каждого часто используется для обхода таблиц значений. В этом случае при каждом повторении цикла переменная элемента коллекции будет содержать не конкретное значение, а строку таблицы. В частности таблицу значений можно получить при выгрузке результата запроса (метод Выгрузить()).

Пример 8. При помощи запроса выбрать всех пользователей. Выгрузить результат в таблицу значений, обойти ее и вывести пользователей с заполненным физическим лицом.

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    Пользователи.Ссылка КАК Пользователь,
|    Пользователи.ФизическоеЛицо КАК ФизическоеЛицо
|ИЗ
|    Справочник.Пользователи КАК Пользователи";
	
Таблица = Запрос.Выполнить().Выгрузить();
	
Для Каждого СтрокаТаблицы Из Таблица Цикл
		
    Если ЗначениеЗаполнено(СтрокаТаблицы.ФизическоеЛицо) Тогда
        Сообщить(СтрокаТаблицы.Пользователь);
    КонецЕсли;
		
КонецЦикла;

В примере видно, что переменная СтрокаТаблицы на каждом проходе цикла, содержит очередную строку таблицы. Доступ к ее полям осуществляется через «точку».

Специальные операторы циклов

Циклы 1с могут использовать специальные операторы Продолжить и Прервать. Они предназначены для предварительного завершения итерации и всего цикла соответственно.

Оператор Продолжить завершает текущее повторение цикла, не дожидаясь выполнения следующих за ним операторов. То есть с его помощью мы можем пропускать не нужные действия внутри цикла.

Пример 9. Немного модифицируем код из предыдущего примера, и напишем его с использованием оператора Продолжить.

Для Каждого СтрокаТаблицы Из Таблица Цикл
		
    Если Не ЗначениеЗаполнено(СтрокаТаблицы.ФизическоеЛицо) Тогда
        Продолжить;	
    КонецЕсли;
		
    Сообщить(СтрокаТаблицы.Пользователь);
		
КонецЦикла;

Завершаем проход цикла, если физическое лицо не заполнено. Метод Сообщить будет выполняться, только при условии наличия физлица.

С оператором Прервать все еще проще, он завершает выполнение цикла. Вне зависимости от того, сколько повторений еще должно было выполниться.

Пример 10. Рассмотрим задачу из самого первого примера. Выведем числа от 1 до 10 циклом Пока. Но при этом модифицируем программный код.

Цифра = 1;
Пока Истина Цикл
		
    Если Цифра > 10 Тогда
	Прервать;
    КонецЕсли;
		
    Сообщить(Цифра);
    Цифра = Цифра + 1;
		
КонецЦикла;

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

Также вы можете скачать обработку со всеми рассмотренными примерами Циклы 1с — примеры. Обработка написана под управляемое приложение, в качестве конфигурации для запросов использовалась демо-база БСП 3.1.

Циклы 1с 8 - примеры

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

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