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