Разработка и Конфигурация · 13 мин
Как остановить процедуру в 1С: способы прерывания выполнения кода
Как остановить процедуру в 1С: оператор Возврат, прерывание цикла, отладка, исключения и остановка фоновых заданий. Примеры кода и типичные ошибки.
Остановить процедуру в 1С можно несколькими способами в зависимости от задачи: досрочно завершить выполнение оператором Возврат, прервать цикл операторами Прервать или Продолжить, сгенерировать исключение через ВызватьИсключение либо остановить уже запущенный процесс — фоновое задание, сеанс пользователя или отладку. Выбор способа определяется тем, что именно нужно прекратить: выполнение текущего кода, итерацию цикла или работу целого сеанса.
Чаще всего под «остановкой процедуры» понимают досрочный выход из неё при невыполнении условий: например, когда обязательный параметр не заполнен или документ не проведён. Для этого во встроенном языке 1С предусмотрен оператор Возврат, который немедленно прекращает выполнение процедуры или функции и передаёт управление вызывающему коду.
Важно различать остановку на уровне кода и остановку на уровне системы. Если процедура выполняется в фоновом задании или в сеансе пользователя, прервать её извне можно через консоль заданий или административные инструменты кластера серверов 1С. Ниже разобраны все сценарии с примерами кода и ограничениями.
Досрочный выход из процедуры оператором Возврат
Оператор Возврат — основной способ остановить выполнение процедуры в 1С. Как только интерпретатор встречает этот оператор, выполнение процедуры немедленно прекращается, а управление возвращается в точку вызова. Код, расположенный после Возврат в той же ветке, выполнен не будет.
Типичный сценарий — проверка входных условий в начале процедуры (так называемый «защитный блок»). Если условия не выполнены, процедура завершается сразу, не выполняя основную логику:
Процедура ПровестиДокументы(Период, Организация) Экспорт
Если Не ЗначениеЗаполнено(Организация) Тогда
Сообщить("Не указана организация");
Возврат; // досрочная остановка процедуры
КонецЕсли;
// основная логика выполняется только при заполненной организации
ВыполнитьПроведение(Период, Организация);
КонецПроцедуры
В функции оператор Возврат работает так же, но обычно сопровождается возвращаемым значением: Возврат Ложь; или Возврат Неопределено;. Если написать Возврат без значения внутри функции, она вернёт Неопределено, что может привести к ошибкам в вызывающем коде, ожидающем конкретный тип данных.
Прерывание цикла внутри процедуры
Если остановить нужно не всю процедуру, а только цикл внутри неё, используются операторы Прервать и Продолжить. Оператор Прервать полностью прекращает выполнение цикла и передаёт управление на первую строку после него. Оператор Продолжить прерывает только текущую итерацию и переходит к следующей.
Для Каждого Строка Из ТаблицаДокументов Цикл
Если Строка.ПометкаУдаления Тогда
Продолжить; // пропускаем помеченные, идём к следующей строке
КонецЕсли;
Если Строка.Сумма > ЛимитСуммы Тогда
Прервать; // достигнут лимит — цикл останавливается полностью
КонецЕсли;
ОбработатьСтроку(Строка);
КонецЦикла;
Важно понимать: Прервать останавливает только тот цикл, внутри которого он написан. При вложенных циклах внешний цикл продолжит работу. Если нужно остановить обработку целиком из вложенного цикла, правильнее использовать Возврат (если дальнейший код процедуры не нужен) или ввести флаг-признак, который проверяется во внешнем цикле.
Остановка с передачей ошибки: ВызватьИсключение
Когда процедуру нужно не просто остановить, а сообщить вызывающему коду о критической ошибке, применяется оператор ВызватьИсключение. Он прекращает выполнение текущего кода и передаёт управление ближайшему блоку Попытка...Исключение выше по стеку вызовов. Если обработчика нет, выполнение всей цепочки вызовов завершится с сообщением об ошибке.
Процедура ЗаписатьДанные(Документ) Экспорт
Если Документ.Проведен Тогда
ВызватьИсключение "Нельзя изменять проведённый документ";
КонецЕсли;
// запись данных
КонецПроцедуры
Ключевое отличие от Возврат: исключение «пробрасывается» через все уровни вызовов, пока не встретит обработчик, а Возврат завершает только текущую процедуру. Поэтому ВызватьИсключение используют для ошибок, которые делают дальнейшую работу невозможной, а Возврат — для штатных ситуаций, когда просто нечего делать.
Если код выполняется в транзакции, исключение без корректной обработки может привести к откату транзакции. При обработке исключения внутри транзакции следует явно вызывать ОтменитьТранзакцию(), иначе система выдаст ошибку о незавершённой транзакции.
Сравнение способов остановки кода
Штатный досрочный выход из процедуры или функции. Вызывающий код продолжает работу. Не подходит для сигнализации об ошибках.
Управление циклом: полная остановка цикла или пропуск итерации. Работают только внутри циклов.
Аварийная остановка с передачей ошибки выше по стеку. Требует обработки через Попытка...Исключение, иначе прерывает всю операцию.
Остановка выполнения при отладке
Во время разработки остановить выполняющуюся процедуру можно интерактивно через конфигуратор. Для этого используются точки останова: установите курсор на нужную строку и нажмите F9 или кликните по левому полю редактора модуля. При запуске отладки (F5) выполнение остановится на этой строке, и вы сможете просмотреть значения переменных через табло (Shift+F9) или окно «Вычислить выражение».
После остановки доступны пошаговые команды: F11 — шаг с заходом в процедуры, F10 — шаг без захода, Shift+F11 — выполнить до выхода из текущей процедуры, Shift+F10 — выполнить до текущей позиции курсора. Чтобы полностью прекратить отлаживаемый процесс, нажмите Shift+F5 («Остановить») — выполнение кода прервётся, а предприятие закроет текущую операцию.
Есть и программный способ: если в настройках конфигуратора включён режим «Остановка по ошибке», выполнение автоматически приостановится в точке возникновения исключения. Кроме того, в коде можно использовать метод ОстановитьВыполнение() в управляемых формах для прерывания обработчиков ожидания, но для прямой остановки произвольной процедуры он не предназначен.
- 1Откройте конфигуратор и установите точку останова (F9) на нужной строке модуля
- 2Запустите отладку клавишей F5 и выполните действие, вызывающее процедуру
- 3Дождитесь остановки на точке и проанализируйте переменные через табло
- 4Для полного прекращения выполнения нажмите Shift+F5
Как остановить уже запущенный процесс
Остановка фонового задания
Длительные процедуры в 1С часто выполняются как фоновые задания — например, обработки загрузки данных или регламентные операции. Прервать такое задание из кода можно методом Отменить() объекта «ФоновоеЗадание», полученного через ФоновыеЗадания.НайтиПоУникальномуИдентификатору(). Учтите, что отмена происходит не мгновенно: система прерывает задание в ближайшей точке, где это возможно.
В файловой базе фоновое задание можно остановить через типовую обработку «Консоль заданий» (входит в состав БСП, раздел «Администрирование → Обслуживание») или закрыв сеанс, в котором оно выполняется. В клиент-серверном варианте используется консоль кластера серверов 1С: найдите нужный сеанс и удалите его — задание будет аварийно завершено.
Завершение зависшего сеанса
Если процедура выполняется в интерактивном сеансе пользователя и клиентское приложение зависло (например, из-за бесконечного цикла), остановить его можно через диспетчер задач Windows — завершением процесса 1cv8.exe или 1cv8c.exe. В клиент-серверном режиме предпочтительнее завершить сеанс через консоль кластера: это корректнее освобождает ресурсы сервера и снижает риск «зависших» блокировок.
При аварийном завершении сеанса незавершённые транзакции откатываются СУБД автоматически, однако управляемые блокировки могут удерживаться некоторое время до тайм-аута. Если после завершения сеанса пользователи жалуются на блокировки, проверьте список активных сеансов и при необходимости удалите «мертвые» соединения.
Типичные ошибки и как их избежать
Самая распространённая ошибка — использование Возврат вместо исключения при реальной ошибке. Вызывающий код не узнает о проблеме и продолжит работу с некорректными данными. Обратная ситуация тоже вредна: генерация исключения в штатной ситуации (например, «ничего не найдено») усложняет код и замедляет отладку, так как срабатывает остановка по ошибке.
Вторая частая проблема — «мёртвый код» после безусловного Возврат. Конфигуратор не всегда предупреждает об этом, и разработчик может ошибочно полагать, что строки выполняются. Проверяйте логику ветвлений: после безусловного возврата не должно быть исполняемых операторов.
Третья ошибка — попытка прервать фоновое задание установкой переменной-флага из другого сеанса. Фоновые задания выполняются в отдельном сеансе и не видят изменений переменных чужого сеанса. Для управляемой отмены используйте метод Отменить() или организуйте проверку признака через базу данных (например, запись в константу или регистр, которую задание периодически читает).
Как проверить, что остановка сработала
После добавления оператора Возврат проверьте поведение в отладчике: установите точку останова на строку после вызова процедуры и убедитесь, что управление вернулось именно туда, а код после Возврат внутри процедуры не выполнился. Для функций дополнительно проверьте возвращаемое значение в табло.
При отмене фонового задания проверьте его состояние: метод ФоновыеЗадания.НайтиПоУникальномуИдентификатору() должен вернуть объект со свойством Состояние = СостояниеФоновогоЗадания.Отменено или ЗавершеноАварийно. В журнале регистрации при этом фиксируется событие отмены задания.
Как проверить результат
Управление возвращается в вызывающий код, действия после Возврат не выполняются
Выполняются строки после Возврат или вызывающий код получает неожиданное Неопределено
Состояние = Отменено, в журнале регистрации есть запись об отмене
Задание продолжает висеть в состоянии Активно
Сеанс исчез из списка, блокировки освобождены
Сеанс числится спящим, пользователи жалуются на конфликт блокировок
Частые вопросы
Чем отличается Возврат от ВызватьИсключение?
Возврат — штатное завершение процедуры, после которого вызывающий код продолжает работу. ВызватьИсключение — аварийная остановка, которая пробрасывает ошибку вверх по стеку вызовов до ближайшего блока Попытка...Исключение, а при его отсутствии прерывает всю операцию с сообщением пользователю.
Можно ли остановить процедуру из другой процедуры?
Напрямую прервать чужую процедуру нельзя — выполнение кода в 1С последовательное в рамках одного сеанса. Вы можете либо передать в процедуру параметр-флаг и проверять его внутри, либо использовать ВызватьИсключение, которое прервёт всю цепочку вызовов до обработчика.
Как прервать длительный цикл, чтобы пользователь мог отменить операцию?
В толстом клиенте и при работе с длительными операциями используйте метод ПрерватьОбработкуПроведения не подходит — правильный путь: внутри цикла периодически вызывать ОбработкаПрерыванияПользователя(), которая позволяет прервать выполнение по Esc (в обычных формах), либо выносить обработку в фоновое задание с возможностью отмены через интерфейс длительных операций БСП.
Почему после Отменить() фоновое задание продолжает работать?
Отмена фонового задания не мгновенна: система прерывает его в ближайшей безопасной точке, а если задание выполняет длительный запрос к СУБД — только после завершения запроса. Подождите несколько секунд и повторно проверьте состояние задания.
Что произойдёт с данными при аварийном завершении сеанса?
Незавершённые транзакции будут откачены СУБД, поэтому частично записанных данных в рамках одной транзакции не останется. Однако если процедура записывала данные несколькими отдельными транзакциями, часть изменений сохранится — после аварийной остановки стоит проверить целостность обработанных данных.
Как остановить регламентное задание навсегда?
Откройте консоль заданий (в конфигурациях на БСП: Администрирование → Обслуживание → Регламентные и фоновые задания), найдите нужное задание и снимите флаг «Использование» либо удалите расписание. Простая отмена текущего выполнения не помешает заданию запуститься снова по расписанию.
Что важно запомнить
Для штатной остановки процедуры используйте Возврат, для циклов — Прервать и Продолжить, для ошибок — ВызватьИсключение. Запущенные процессы останавливаются через Отменить() для фоновых заданий или консоль кластера для сеансов. Аварийное завершение — крайняя мера, после которой нужно проверить данные и блокировки.