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

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

Как прервать выполнение текущей итерации цикла в 1С

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

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

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

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

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

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

Для Каждого Строка Из ТаблицаЗначений Цикл

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

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

КонецЕсли;

// основная обработка строки

КонецЦикла;

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

bsl
Для Инд = 1 По 10 Цикл
	Если Инд % 2 = 0 Тогда
		Продолжить; // пропускаем чётные числа
	КонецЕсли;
	Сообщить(Инд); // выведет 1, 3, 5, 7, 9
КонецЦикла;

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

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

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

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

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

Цикл Пока

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

Примеры практического применения

Типовая задача — обработка табличной части документа с пропуском неподходящих строк. Например, нужно пересчитать суммы только по строкам с заполненной номенклатурой и ненулевым количеством:

Для Каждого СтрокаТовары Из Объект.Товары Цикл

Если Не ЗначениеЗаполнено(СтрокаТовары.Номенклатура) Тогда

Продолжить;

КонецЕсли;

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

Продолжить;

КонецЕсли;

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

КонецЦикла;

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

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

Во встроенном языке 1С есть три оператора, изменяющих ход выполнения цикла, и их часто путают. Разница принципиальна: Продолжить пропускает только текущую итерацию, Прервать полностью выходит из цикла и выполнение продолжается со строки после КонецЦикла, а Возврат завершает всю процедуру или функцию целиком, включая код после цикла.

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

Продолжить

Пропускает остаток текущей итерации и запускает следующую. Подходит для фильтрации отдельных элементов коллекции.

Прервать

Полностью завершает цикл. Подходит, когда искомый элемент найден и дальнейший перебор бессмыслен.

Возврат

Завершает всю процедуру или функцию. Подходит, когда при обнаружении условия дальнейшая обработка вообще не требуется.

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

Вложенные циклы и ограничения оператора

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

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

Пропуск итерации внешнего цикла
  1. 1
    Объявите переменную-флаг (например, ПропуститьСтроку = Ложь) перед вложенным циклом
  2. 2
    Во вложенном цикле при выполнении условия установите флаг в Истина и выполните Прервать
  3. 3
    После вложенного цикла проверьте флаг: Если ПропуститьСтроку Тогда Продолжить
  4. 4
    Проверьте на тестовых данных, что внешний цикл корректно пропускает нужные элементы

Типичные ошибки и отладка

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

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

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

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

Обработанные элементы
Норма

Количество обработанных строк равно общему минус пропущенные по условию

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

Обработано меньше, чем ожидалось — условие пропуска слишком широкое

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

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

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

Цикл завершается полностью — вероятно, использован Прервать вместо Продолжить

Время выполнения цикла Пока
Норма

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

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

Сеанс зависает — условие выхода недостижимо из-за пропуска изменения переменной

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

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

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

Работает ли Продолжить в цикле Для Каждого по выборке запроса?

Да, оператор корректно работает в цикле Для Каждого по выборке из результата запроса: при его выполнении из выборки берётся следующая строка. Однако если строки отсеиваются по простому условию, эффективнее перенести отбор в секцию ГДЕ запроса.

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

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

Что будет, если поставить Продолжить вне цикла?

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

Есть ли в 1С аналог Продолжить для английского синтаксиса?

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

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

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

Итог

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

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