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