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

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

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

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

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

Оператор работает одинаково во всех видах циклов встроенного языка: Для ... Цикл, Для Каждого ... Из ... Цикл и Пока ... Цикл. Он не имеет параметров и не возвращает значения — это просто команда управления потоком выполнения, аналогичная continue в других языках программирования.

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

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

Оператор записывается внутри тела цикла, как правило — внутри условной конструкции, и завершается точкой с запятой:

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

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

Продолжить; // пропускаем строки без количества

КонецЕсли;

// обработка строки

КонецЦикла;

В английском варианте синтаксиса тот же код выглядит так:

For Each Row In GoodsTable Do

If Row.Quantity = 0 Then

Continue;

EndIf;

EndDo;

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

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

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

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

Для Сч = 1 По 10 Цикл

Если Сч % 2 = 0 Тогда

Продолжить; // чётные числа пропускаем

КонецЕсли;

Сообщить(Сч); // выведутся только нечётные: 1, 3, 5, 7, 9

КонецЦикла;

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

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

Цикл Пока с условием

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

Практические примеры использования

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

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

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

Продолжить;

КонецЕсли;

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

Продолжить;

КонецЕсли;

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

КонецЦикла;

Другой пример — обход выборки из запроса с пропуском помеченных на удаление элементов:

Пока Выборка.Следующий() Цикл

Если Выборка.ПометкаУдаления Тогда

Продолжить;

КонецЕсли;

// обработка записи

КонецЦикла;

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

Как добавить пропуск итерации в свой код
  1. 1
    Определите условие, при котором элемент обрабатывать не нужно
  2. 2
    Поставьте проверку этого условия в начале тела цикла
  3. 3
    Внутри условия напишите оператор Продолжить с точкой с запятой
  4. 4
    Убедитесь, что переменная условия цикла изменяется до оператора (для цикла Пока)
  5. 5
    Проверьте модуль на синтаксические ошибки и выполните тестовый запуск на копии данных

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

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

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

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

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

Продолжить

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

Прервать

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

Возврат

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

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

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

Для Каждого Документ Из СписокДокументов Цикл

Для Каждого Строка Из Документ.Товары Цикл

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

Продолжить; // переход к следующей СТРОКЕ, а не к следующему документу

КонецЕсли;

КонецЦикла;

КонецЦикла;

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

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

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

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

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

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

Как проверить корректность работы

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

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

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

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

Количество обработанных элементов
Норма

Совпадает с числом элементов, удовлетворяющих условию

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

Обработаны все элементы или меньше ожидаемого

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

Цикл завершается за конечное число итераций

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

Сеанс зависает, цикл не заканчивается

Итоговые суммы и счётчики
Норма

Учитывают все нужные элементы

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

Часть данных потеряна из-за кода после Продолжить

FAQ: частые вопросы

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

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

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

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

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

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

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

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

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

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

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

Нет, язык запросов не содержит циклов и операторов управления потоком. Фильтрация записей там выполняется декларативно — через условия в секции ГДЕ, что исключает необходимость пропуска итераций.

Итог

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

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