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