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

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

Как выйти из функции в 1С: оператор Возврат и типичные сценарии

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

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

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

Базовый синтаксис оператора Возврат

Функция в 1С объявляется ключевым словом Функция и обязана вернуть значение. Возврат выполняется так:

Функция ПолучитьСуммуСНДС(Сумма, СтавкаНДС)

Результат = Сумма + Сумма * СтавкаНДС / 100;

Возврат Результат;

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

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

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

Досрочный выход из функции по условию

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

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

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

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

КонецЕсли;

// дальше основной поиск

...

Возврат НайденнаяСсылка;

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

Такой стиль называют «ранним выходом» (early return). Он уменьшает вложенность условных блоков и делает логику линейной: сначала отсекаются все некорректные ситуации, затем выполняется основной алгоритм. Признак хорошего результата — в функции нет вложенных друг в друга трёх-четырёх Если...Тогда, а каждая ветка завершается понятным Возвратом.

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

Два стиля выхода из функции

Ранние выходы (early return)

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

Единый Возврат в конце

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

Выход из процедуры

Процедура не возвращает значение, поэтому оператор Возврат в ней пишется без выражения:

Процедура ЗаполнитьТаблицу(Документ)

Если Документ.Товары.Количество() = 0 Тогда

Возврат; // просто выходим, заполнять нечего

КонецЕсли;

// основная обработка

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

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

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

Выход из функции внутри цикла

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

Функция НайтиСтрокуПоАртикулу(ТаблицаТоваров, Артикул)

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

Если Строка.Артикул = Артикул Тогда

Возврат Строка;

КонецЕсли;

КонецЦикла;

Возврат Неопределено; // ничего не нашли

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

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

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

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

Возврат при возникновении исключений

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

Типовой шаблон безопасной функции выглядит так:

Функция ПрочитатьДанные(Ссылка)

Попытка

Объект = Ссылка.ПолучитьОбъект();

Возврат Объект.Сумма;

Исключение

ЗаписьЖурналаРегистрации("Ошибка чтения", ...);

Возврат 0;

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

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

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

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

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

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

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

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

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

Все ветки функции возвращают значение
Норма

При любых входных данных срабатывает один из операторов Возврат

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

Есть сценарий, где функция доходит до КонецФункции без Возврата

Нет недостижимого кода
Норма

После Возврата нет исполняемых строк

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

Проверка модуля сообщает о недостижимом коде

Тип возвращаемого значения единообразен
Норма

Во всех Возвратах значения совместимых типов

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

В одной ветке число, в другой строка — вызывающий код ломается

Частые вопросы о выходе из функции 1С

Что вернёт функция, если не написать оператор Возврат?

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

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

Возврат завершает всю функцию или процедуру. Прервать завершает только текущий цикл, выполнение продолжается после КонецЦикла. Продолжить переходит к следующей итерации цикла, пропуская оставшуюся часть тела цикла. Вне цикла Прервать и Продолжить использовать нельзя.

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

Напрямую — нет, оператор Возврат принимает одно значение. Обходные пути: вернуть Структуру с несколькими полями, Массив или передавать параметры по ссылке (Знач), изменяя их внутри функции. Наиболее читаемый вариант — Структура с именованными полями.

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

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

Работает ли Возврат в модуле формы и в обработчиках событий?

Да, оператор работает одинаково во всех модулях: формы, объекта, общих модулях. В обработчиках событий (например, ПередЗаписью) досрочный Возврат просто завершает обработчик; чтобы отменить само действие, дополнительно устанавливают параметр Отказ = Истина.

Что вернуть из функции, если данные не найдены?

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

Итог

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

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