К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как перейти на следующую итерацию цикла в 1С

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

Во встроенном языке 1С переход на следующую итерацию цикла выполняется оператором Продолжить (в английском синтаксисе — Continue). Когда интерпретатор встречает этот оператор, он немедленно прекращает выполнение текущего тела цикла и переходит к проверке условия или к следующему элементу коллекции, не выполняя оставшиеся строки до конца итерации.

Оператор работает одинаково во всех трёх видах циклов 1С: Для, Для Каждого и Пока. Он не завершает цикл полностью (для этого служит оператор Прервать), а лишь пропускает «хвост» текущей итерации. Это удобно, когда часть элементов коллекции нужно отфильтровать: например, пропустить помеченные на удаление документы, пустые строки табличной части или записи с нулевым количеством.

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

Синтаксис оператора Продолжить

Оператор записывается одним словом с точкой с запятой в конце и не принимает параметров. Он может находиться только внутри тела цикла — попытка использовать его вне цикла приведёт к ошибке компиляции модуля.

Для Каждого Строка Из ТаблицаТоваров Цикл

Если Строка.Количество = 0 Тогда

Продолжить; // переходим к следующей строке

КонецЕсли;

// этот код выполнится только для строк с ненулевым количеством

СуммаИтог = СуммаИтог + Строка.Количество * Строка.Цена;

КонецЦикла;

В английском варианте синтаксиса тот же код пишется с ключевым словом Continue. Оба варианта полностью эквивалентны, выбор зависит от настроек конфигуратора и принятого в проекте стандарта разработки. Смешивать русский и английский синтаксис в одном модуле технически возможно, но считается плохим стилем.

Как Продолжить работает в разных видах циклов

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

Цикл Для со счётчиком

В цикле Для Сч = 1 По 10 Цикл оператор Продолжить передаёт управление на увеличение счётчика и проверку границы. Счётчик инкрементируется автоматически, поэтому бесконечного цикла здесь возникнуть не может.

Для Инд = 0 По Массив.ВГраница() Цикл

Если Массив[Инд] = Неопределено Тогда

Продолжить;

КонецЕсли;

ОбработатьЗначение(Массив[Инд]);

КонецЦикла;

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

В цикле Для Каждого оператор передаёт управление механизму получения следующего элемента коллекции. Это самый частый сценарий использования: обход строк табличной части, выборки запроса, коллекции метаданных. Счётчика здесь нет, поэтому рисков зацикливания тоже нет.

Цикл Пока — зона риска

В цикле Пока Условие Цикл оператор Продолжить передаёт управление на проверку условия в заголовке цикла. Если изменение переменной, влияющей на условие, стоит в коде после оператора Продолжить, условие никогда не станет ложным — цикл зависнет. Это самая опасная ошибка при использовании оператора.

// ОШИБКА: бесконечный цикл

Сч = 0;

Пока Сч < 10 Цикл

Если Сч = 5 Тогда

Продолжить; // Сч больше никогда не изменится

КонецЕсли;

Сч = Сч + 1;

КонецЦикла;

Правильный вариант — сначала изменить счётчик, потом решать, пропускать ли остаток итерации:

Сч = 0;

Пока Сч < 10 Цикл

Сч = Сч + 1; // сначала изменяем

Если Сч = 5 Тогда

Продолжить; // теперь безопасно

КонецЕсли;

// обработка

КонецЦикла;

Типовые сценарии применения

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

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

bsl
Для Каждого Выборка Из РезультатЗапроса.Выбрать() Цикл
	Если Выборка.ПометкаУдаления Тогда
		Продолжить;
	КонецЕсли;
	Если Выборка.Остаток <= 0 Тогда
		Продолжить;
	КонецЕсли;
	ДобавитьСтрокуЗаказа(Выборка);
КонецЦикла;

Допустимо использовать несколько операторов Продолжить в одном цикле, если условий отсева несколько и они логически независимы. Однако когда отсев проверяет одно составное условие, лучше объединить его через ИЛИ в один блок — так проще отлаживать.

Отличие Продолжить от Прервать и Возврат

Новички часто путают три оператора, изменяющих ход выполнения. Их поведение принципиально различается, и подмена одного другим ломает логику программы.

ОператорЧто делаетКогда применять
ПродолжитьЗавершает текущую итерацию, цикл идёт дальшеЭлемент не подходит, но остальные нужно обработать
ПрерватьПолностью выходит из циклаНужное найдено, дальнейший перебор бессмыслен
ВозвратВыходит из всей процедуры или функцииДальнейшая работа процедуры не имеет смысла

Классическая пара: при поиске элемента используют Прервать после нахождения, а при фильтрации коллекции — Продолжить для пропуска лишнего. Если внутри цикла обнаружена критическая ошибка данных, корректнее использовать Возврат или вызвать исключение, а не продолжать перебор.

Сравнение вариантов

Продолжить

Подходит для фильтрации элементов внутри цикла. Ограничение: работает только внутри цикла, в цикле Пока требует осторожности со счётчиком.

Прервать

Подходит, когда после нахождения результата перебор не нужен. Не пропускает отдельные элементы — завершает цикл целиком.

Вложенное условие Если

Альтернатива без Продолжить: весь код оборачивается в Если. Подходит для коротких тел цикла, но при нескольких условиях даёт глубокую вложенность.

Типичные ошибки и как их избежать

Первая и главная ошибка — бесконечный цикл Пока, описанный выше. Признак проблемы: сеанс 1С «висит», процесс rphost или тонкий клиент потребляет процессор, отладчик останавливается всё время на одном и том же участке. Лечится переносом изменения счётчика до оператора Продолжить.

Вторая ошибка — код после Продолжить в том же ветвлении, который никогда не выполнится. Например, накопление итогов или закрытие менеджера записи, стоящие ниже оператора внутри того же Если. Конфигуратор не всегда подсвечивает такой недостижимый код, поэтому проверяйте логику вручную.

Третья ошибка — использование Продолжить вместо Прервать при поиске. Цикл продолжает перебирать тысячи элементов после того, как нужный уже найден, что заметно замедляет код на больших выборках. Четвёртая — попытка «продолжить» внешний цикл из вложенного: оператор всегда относится к ближайшему циклу, в котором записан, и механизма перехода к итерации внешнего цикла в 1С нет.

Типичные ошибки
01
Продолжить до изменения счётчика в цикле Пока — бесконечный цикл и зависание сеанса
02
Код после Продолжить в той же ветке — недостижимые строки, потерянные итоги или незакрытые ресурсы
03
Продолжить вместо Прервать при поиске — лишний перебор всей коллекции и потеря производительности
04
Ожидание, что Продолжить из вложенного цикла переключит внешний — оператор действует только на ближайший цикл

Проверка результата и отладка

Убедиться, что оператор работает как задумано, проще всего в отладчике конфигуратора. Поставьте точку останова на строке с Продолжить и на первой строке тела цикла: при срабатывании условия выполнение должно «перепрыгивать» с оператора сразу на начало следующей итерации, минуя промежуточный код.

Второй способ — контрольные счётчики. Добавьте временные переменные: сколько элементов всего, сколько пропущено, сколько обработано. После цикла сумма пропущенных и обработанных должна равняться общему количеству. Несовпадение — признак того, что часть элементов теряется или обрабатывается дважды.

Контрольные точки

Как проверить результат

Поведение в отладчике
Норма

После Продолжить выполнение переходит к следующей итерации

Тревожный признак

Выполнение возвращается на ту же итерацию или зависает

Сумма счётчиков
Норма

Пропущено + обработано = всего элементов

Тревожный признак

Сумма не сходится — элементы теряются

Время выполнения на большой выборке
Норма

Цикл завершается за предсказуемое время

Тревожный признак

Сеанс висит — вероятен бесконечный цикл Пока

Альтернативы оператору Продолжить

Не всегда пропуск итерации — лучшее решение. Если фильтрация касается данных из базы, правильнее отсечь лишние записи ещё в запросе через условие ГДЕ: это сокращает объём выборки и работает быстрее, чем пропуск в цикле. Оператор Продолжить оправдан, когда условие нельзя выразить в запросе или зависит от вычислений внутри итерации.

Для коротких тел цикла иногда читаемее обычное условие Если Подходит(Элемент) Тогда ... КонецЕсли без оператора вовсе. Выбор между стилями — вопрос вложенности: одно условие допустимо оформить блоком, три-четыре проверки подряд лучше оформить «сторожевыми» Продолжить.

Маршрут решения

Как выбрать действие

Условие отсева можно записать в запросеОтфильтруйте данные через ГДЕ — цикл получит уже чистую выборку
Условие зависит от вычислений внутри итерацииИспользуйте Продолжить в начале тела цикла
Цикл Пока с ручным счётчикомСначала изменяйте счётчик, потом вызывайте Продолжить
После нахождения элемента перебор не нуженИспользуйте Прервать вместо Продолжить
Итог

Что важно запомнить

Оператор Продолжить (Continue) пропускает остаток текущей итерации и запускает следующую. В циклах Для и Для Каждого он безопасен всегда, в цикле Пока требует изменения счётчика до оператора. Для полного выхода из цикла используйте Прервать, а фильтрацию на уровне данных по возможности выполняйте в запросе.

Частые вопросы

Чем Продолжить отличается от Прервать в 1С?

Продолжить завершает только текущую итерацию — цикл переходит к следующему элементу и работает дальше. Прервать полностью выходит из цикла, и управление передаётся на первую строку после КонецЦикла. Для фильтрации элементов нужен Продолжить, для прекращения поиска — Прервать.

Можно ли использовать Продолжить вне цикла?

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

Почему цикл Пока зависает после добавления Продолжить?

Потому что Продолжить передаёт управление на проверку условия, а переменная, влияющая на условие, изменяется ниже оператора и никогда не достигается. Перенесите изменение счётчика или признака выше строки с Продолжить.

Как пропустить итерацию внешнего цикла из вложенного?

Напрямую — никак: Продолжить действует только на ближайший цикл. Обходной приём — установить во вложенном цикле признак (булеву переменную), прервать вложенный цикл, а во внешнем проверить признак и вызвать Продолжить там.

Есть ли в 1С аналог Continue с меткой, как в других языках?

Нет, встроенный язык 1С не поддерживает метки и операторы перехода. Управлять вложенными циклами можно только через переменные-флаги и комбинацию Прервать и Продолжить в каждом уровне.

Влияет ли Продолжить на производительность?

Сам оператор практически бесплатен. На производительность влияет другое: если с его помощью фильтруется большая выборка из базы, быстрее отсечь лишнее условием ГДЕ в запросе, чтобы не перебирать ненужные записи вовсе.