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

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

Как прервать выполнение процедуры в 1С программно

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

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

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

Оператор Возврат — основной способ выйти из процедуры

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

Процедура ПроверитьДокумент(Документ)

Если Документ.ПометкаУдаления Тогда

Возврат; // дальнейшая обработка не нужна

КонецЕсли;

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

ВыполнитьПроведение(Документ);

КонецПроцедуры

В функции оператор Возврат обязан содержать возвращаемое значение: Возврат Результат;. Если в функции нужно выйти досрочно, укажите значение по умолчанию:

Функция НайтиКонтрагента(ИНН)

Если Не ЗначениеЗаполнено(ИНН) Тогда

Возврат Неопределено;

КонецЕсли;

// поиск и возврат найденной ссылки

КонецФункции

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

Как прервать цикл: Прервать и Продолжить

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

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

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

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

КонецЕсли;

Если Строка.Сумма > Лимит Тогда

Прервать; // полностью остановить перебор

КонецЕсли;

КонецЦикла;

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

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

Аварийная остановка через исключения

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

Процедура ЗаписатьДанные(Параметры)

НачатьТранзакцию();

Попытка

ВыполнитьЗапись(Параметры);

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

ВызватьИсключение ОписаниеОшибки();

КонецПопытки;

КонецПроцедуры

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

Прерывание длительных операций по требованию пользователя

Долгие фоновые операции (загрузка данных, обмен, массовая обработка) пользователь может захотеть остановить. В фоновом задании нельзя «убить» код извне штатной командой языка, поэтому применяется проверка флага отмены внутри цикла обработки.

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

Для Каждого Элемент Из Коллекция Цикл

Если ТребуетсяОтмена() Тогда

ВызватьИсключение "Операция отменена пользователем";

КонецЕсли;

ОбработатьЭлемент(Элемент);

КонецЦикла;

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

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

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

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

Как остановить выполнение кода извне: отладка и администрирование

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

В режиме отладки выполнение можно остановить кнопкой «Остановить» в конфигураторе — отлаживаемый сеанс прерывается. Также в конфигураторе доступно прерывание выполнения по запросу: предмет отладки останавливается, и можно посмотреть стек вызовов и значения переменных.

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

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

Типичные ошибки и как проверить результат

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

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

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

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

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

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

Поведение после Возврат
Норма

Управление передано в точку вызова, код ниже Возврат не выполнялся

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

Выполнились строки, которые должны были быть пропущены

Состояние транзакции
Норма

Транзакция зафиксирована или отменена, блокировок нет

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

Ошибки «транзакция активна» или зависшие блокировки

Обработка исключения
Норма

Ошибка записана в журнал регистрации, пользователю выведено понятное сообщение

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

Ошибка проглочена молча или выдан технический текст без контекста

Часто задаваемые вопросы

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

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

Можно ли прервать выполнение кода 1С по нажатию клавиши, как Ctrl+Break в других средах?

В пользовательском режиме штатной «горячей клавиши» остановки нет. В конфигураторе при отладке выполнение останавливается кнопкой «Остановить» или командой прерывания отладки. Для длительных операций в прикладном решении реализуют кнопку «Отмена» с проверкой флага внутри цикла обработки.

Как выйти сразу из двух вложенных циклов?

Оператора «прервать внешний цикл» в языке нет. Используйте переменную-флаг: внутренний цикл устанавливает её и прерывается, внешний проверяет флаг в начале итерации и тоже прерывается. Альтернатива — вынести перебор в функцию и выйти из неё через Возврат.

Что произойдёт с транзакцией, если процедура прервалась исключением?

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

Как остановить фоновое задание, запущенное другим пользователем?

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

Нужно ли писать Возврат в конце процедуры?

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

Итог

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

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