Разработка и Конфигурация · 10 мин
Как прервать выполнение текущей итерации цикла в 1С
Как прервать текущую итерацию цикла в 1С с помощью оператора Продолжить: синтаксис, примеры кода, отличия от Прервать и Возврат, типичные ошибки и FAQ.
Во встроенном языке 1С для пропуска текущей итерации цикла используется оператор Продолжить (английский синоним — Continue). Когда интерпретатор встречает этот оператор, он немедленно прекращает выполнение тела цикла и переходит к следующей итерации: в цикле Для счётчик увеличивается, в цикле Для Каждого берётся следующий элемент коллекции, в цикле Пока заново проверяется условие.
Оператор работает одинаково во всех трёх видах циклов встроенного языка и доступен как на сервере, так и на клиенте, в толстом, тонком и веб-клиенте. Это базовая конструкция, которая встречается практически в любом коде обработки данных: при фильтрации строк табличной части, обходе выборки из запроса, пропуске «пустых» или уже обработанных элементов.
Важно не путать Продолжить с оператором Прервать: первый пропускает только текущую итерацию и цикл продолжает работать, второй полностью завершает выполнение цикла. Выбор между ними определяется логикой задачи — об этом подробно ниже.
Синтаксис оператора Продолжить
Оператор пишется как отдельная инструкция и завершается точкой с запятой. Обычно он помещается внутрь условного блока Если ... Тогда, потому что безусловный Продолжить в начале тела цикла сделает весь последующий код недостижимым.
Для Каждого Строка Из ТаблицаЗначений Цикл
Если Строка.Количество = 0 Тогда
Продолжить; // переходим к следующей строке
КонецЕсли;
// основная обработка строки
КонецЦикла;
Платформа 1С поддерживает два синтаксических варианта встроенного языка: русский и английский. Операторы Продолжить и Continue полностью взаимозаменяемы, их можно даже смешивать в одном модуле, хотя на практике так делать не стоит — единый стиль упрощает чтение кода.
Для Инд = 1 По 10 Цикл
Если Инд % 2 = 0 Тогда
Продолжить; // пропускаем чётные числа
КонецЕсли;
Сообщить(Инд); // выведет 1, 3, 5, 7, 9
КонецЦикла;Как Продолжить работает в разных видах циклов
Цикл Для (со счётчиком)
В цикле Для ... По ... Цикл после выполнения Продолжить счётчик увеличивается на единицу, проверяется условие выхода за верхнюю границу, и если предел не достигнут — начинается новая итерация. Код, расположенный после оператора внутри тела цикла, в текущей итерации не выполняется.
Цикл Для Каждого
В цикле Для Каждого ... Из ... Цикл оператор Продолжить заставляет платформу взять следующий элемент коллекции: следующую строку таблицы значений, следующий элемент массива, следующую строку выборки из результата запроса. Это самый частый сценарий применения оператора — например, пропуск строк табличной части документа с нулевым количеством или отменённых записей.
Цикл Пока
В цикле Пока ... Цикл после Продолжить управление передаётся на проверку условия цикла. Здесь есть важный подводный камень: если переменная, влияющая на условие, изменяется в коде после оператора Продолжить, то при срабатывании пропуска она не изменится — и цикл может стать бесконечным. Всегда изменяйте управляющие переменные до точки возможного пропуска итерации.
Примеры практического применения
Типовая задача — обработка табличной части документа с пропуском неподходящих строк. Например, нужно пересчитать суммы только по строкам с заполненной номенклатурой и ненулевым количеством:
Для Каждого СтрокаТовары Из Объект.Товары Цикл
Если Не ЗначениеЗаполнено(СтрокаТовары.Номенклатура) Тогда
Продолжить;
КонецЕсли;
Если СтрокаТовары.Количество = 0 Тогда
Продолжить;
КонецЕсли;
СтрокаТовары.Сумма = СтрокаТовары.Количество * СтрокаТовары.Цена;
КонецЦикла;
Второй распространённый сценарий — обход выборки из запроса с фильтрацией уже проведённых или помеченных на удаление элементов. Хотя такую фильтрацию правильнее выполнять на уровне самого запроса, встречаются ситуации, когда условие пропуска невозможно выразить в запросе (например, зависит от результата функции), и тогда Продолжить — оправданное решение.
Отличия Продолжить от Прервать и Возврат
Во встроенном языке 1С есть три оператора, изменяющих ход выполнения цикла, и их часто путают. Разница принципиальна: Продолжить пропускает только текущую итерацию, Прервать полностью выходит из цикла и выполнение продолжается со строки после КонецЦикла, а Возврат завершает всю процедуру или функцию целиком, включая код после цикла.
Сравнение операторов
Пропускает остаток текущей итерации и запускает следующую. Подходит для фильтрации отдельных элементов коллекции.
Полностью завершает цикл. Подходит, когда искомый элемент найден и дальнейший перебор бессмыслен.
Завершает всю процедуру или функцию. Подходит, когда при обнаружении условия дальнейшая обработка вообще не требуется.
Типичный признак того, что нужен именно Прервать, а не Продолжить: вы ищете одно конкретное значение в коллекции, и после его нахождения перебирать остальные элементы незачем. Обратный признак: элементов для обработки много, отсеивается лишь часть — тогда нужен Продолжить.
Вложенные циклы и ограничения оператора
Оператор Продолжить действует только на тот цикл, в теле которого он непосредственно расположен. Если он находится во вложенном цикле, будет пропущена итерация именно вложенного цикла, а внешний продолжит работу в обычном порядке. Во встроенном языке 1С нет механизма меток или конструкции вида «продолжить внешний цикл».
Если требуется пропустить итерацию внешнего цикла по условию, выявленному во вложенном, используйте флаговую переменную: установите признак во вложенном цикле, прервите его, а затем во внешнем цикле проверьте флаг и выполните Продолжить. Альтернатива — вынести вложенный перебор в отдельную функцию, которая вернёт признак, и обрабатывать его во внешнем цикле.
- 1Объявите переменную-флаг (например, ПропуститьСтроку = Ложь) перед вложенным циклом
- 2Во вложенном цикле при выполнении условия установите флаг в Истина и выполните Прервать
- 3После вложенного цикла проверьте флаг: Если ПропуститьСтроку Тогда Продолжить
- 4Проверьте на тестовых данных, что внешний цикл корректно пропускает нужные элементы
Типичные ошибки и отладка
Самая частая ошибка — недостижимый код: разработчик ставит Продолжить безусловно или в ветке, которая выполняется всегда, и удивляется, что цикл «ничего не делает». Вторая по распространённости — путаница между Продолжить и Прервать, из-за которой обрабатывается только часть коллекции или, наоборот, поиск не останавливается после нахождения результата.
Для отладки логики пропусков используйте конфигуратор: поставьте точку останова на строке с условием и на строке сразу после Продолжить, запустите отладку и проследите, какие элементы отсеиваются. Полезно временно добавить вывод в журнал регистрации или через Сообщить с указанием причины пропуска — так проще проверить корректность условия на реальных данных.
Как проверить результат
Количество обработанных строк равно общему минус пропущенные по условию
Обработано меньше, чем ожидалось — условие пропуска слишком широкое
После Продолжить выполнение переходит к следующему элементу коллекции
Цикл завершается полностью — вероятно, использован Прервать вместо Продолжить
Цикл завершается за предсказуемое время
Сеанс зависает — условие выхода недостижимо из-за пропуска изменения переменной
Частые вопросы
Чем Продолжить отличается от Прервать в 1С?
Продолжить пропускает только текущую итерацию: цикл берёт следующий элемент и работает дальше. Прервать полностью завершает цикл, и выполнение переходит к коду после КонецЦикла. Для фильтрации отдельных элементов нужен Продолжить, для остановки поиска после нахождения результата — Прервать.
Работает ли Продолжить в цикле Для Каждого по выборке запроса?
Да, оператор корректно работает в цикле Для Каждого по выборке из результата запроса: при его выполнении из выборки берётся следующая строка. Однако если строки отсеиваются по простому условию, эффективнее перенести отбор в секцию ГДЕ запроса.
Можно ли пропустить итерацию внешнего цикла из вложенного?
Напрямую нет — оператор действует только на ближайший цикл, в теле которого находится. Используйте переменную-флаг: установите её во вложенном цикле, прервите его, а затем во внешнем цикле проверьте флаг и выполните Продолжить.
Что будет, если поставить Продолжить вне цикла?
Это синтаксическая ошибка: конфигуратор при проверке модуля выдаст сообщение о том, что оператор Продолжить может использоваться только внутри цикла. Модуль с такой ошибкой не будет сохранён и скомпилирован.
Есть ли в 1С аналог Продолжить для английского синтаксиса?
Да, это оператор Continue. Он полностью эквивалентен русскому варианту Продолжить, оба ключевых слова распознаются компилятором независимо от варианта синтаксиса, выбранного в настройках конфигурации.
Почему цикл Пока с оператором Продолжить зависает?
Почти всегда причина в том, что переменная, влияющая на условие цикла, изменяется в коде после оператора Продолжить. При срабатывании пропуска это изменение не выполняется, условие остаётся истинным, и цикл становится бесконечным. Перенесите изменение управляющей переменной до точки возможного пропуска.
Что важно запомнить
Оператор Продолжить пропускает текущую итерацию и переводит цикл на следующий элемент; он работает в циклах Для, Для Каждого и Пока, действует только на ближайший цикл и отличается от Прервать тем, что не завершает цикл целиком. В цикле Пока следите за тем, чтобы управляющая переменная изменялась до точки пропуска, иначе получите бесконечный цикл.