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

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

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

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

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

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

Оператор Возврат — основной способ прервать функцию

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

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

Функция ПолучитьЦену(Номенклатура, Дата) Экспорт

Если Не ЗначениеЗаполнено(Номенклатура) Тогда

Возврат 0; // досрочное прерывание функции

КонецЕсли;

// основная логика получения цены

Возврат ЦенаИзРегистра;

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

Такой приём называют «защитным программированием»: все проверки сгруппированы в начале, а основная логика не обрастает лишними уровнями Если...КонецЕсли. Это снижает количество ошибок и упрощает чтение кода при доработках.

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

bsl
Функция НайтиДокумент(Номер) Экспорт
	Если ПустаяСтрока(Номер) Тогда
		Возврат Неопределено;
	КонецЕсли;
	// поиск...
	Возврат СсылкаНаДокумент;
КонецФункции

Прерывание циклов: Прервать и Продолжить

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

Функция ЕстьОтрицательныйОстаток(ТаблицаОстатков)

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

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

Возврат Истина; // прерываем и цикл, и функцию

КонецЕсли;

КонецЦикла;

Возврат Ложь;

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

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

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

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

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

Процедура ПровестиДокумент(ДокументСсылка) Экспорт

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

ВызватьИсключение "Нельзя провести помеченный на удаление документ";

КонецЕсли;

// дальнейшая логика проведения

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

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

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

Особенности прерывания в клиент-серверном режиме

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

Для длительных операций, выполняемых асинхронно (фоновые задания, длительные операции БСП), простое прерывание функции недоступно извне. Отмена фонового задания выполняется через метод ОтменитьВыполнение менеджера фоновых заданий, а внутри самого задания следует периодически проверять условие отмены и завершаться штатно через Возврат.

Отладка: как остановить выполнение в конфигураторе

При поиске причин ошибки прервать выполнение можно интерактивно. Точка останова (F9 на строке кода) приостанавливает выполнение в отладчике; команда «Остановить» завершает отлаживаемый сеанс принудительно. Кроме того, в дереве вызовов доступна команда «Шагнуть из» текущей функции — она доводит функцию до конца и останавливается в точке возврата, что удобно, когда нужно быстро выйти из вложенного вызова.

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

Типичные ошибки
01
ВызватьИсключение вместо Возврат для штатных ситуаций — засоряет журнал регистрации ложными ошибками и пугает пользователей
02
Функция без Возврат в одной из веток — результат Неопределено приводит к ошибкам в вызывающем коде
03
Прервать во вложенном цикле с расчётом на выход из обоих — внешний цикл продолжает работу с некорректным состоянием
04
ВызватьИсключение внутри транзакции без ОтменитьТранзакцию — ошибка СУБД и блокировки
05
Перехват исключения пустым блоком Исключение...КонецПопытки — реальная ошибка теряется, диагностика невозможна

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

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

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

Как выбрать действие

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

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

Итог

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

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

Частые вопросы

Чем отличается Возврат в процедуре от Возврат в функции?

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

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

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

Можно ли прервать выполнение чужой функции из своего кода?

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

Что произойдёт, если исключение нигде не перехвачено?

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

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

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