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

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

Как работает оператор Возврат в 1С

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

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

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

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

Синтаксис оператора Возврат

Оператор записывается ключевым словом Возврат (в англоязычном синтаксисе — Return), после которого может следовать выражение. Строка завершается точкой с запятой:

Функция ПолучитьСкидку(СуммаПокупки)

Если СуммаПокупки > 10000 Тогда

Возврат 10;

Иначе

Возврат 0;

КонецЕсли;

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

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

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

Возврат в функциях: передача значения

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

ЦенаСоСкидкой = РассчитатьЦену(Цена, ПроцентСкидки);

Функция РассчитатьЦену(Цена, Скидка)

Возврат Цена - Цена * Скидка / 100;

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

Если функция завершилась по достижении КонецФункции, ни разу не выполнив Возврат, она вернёт значение Неопределено. Конфигуратор при проверке модуля выдаёт предупреждение о том, что функция может не вернуть значение, — игнорировать его не следует.

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

Возврат в процедурах: досрочное завершение

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

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

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

Возврат;

КонецЕсли;

// основная логика проведения

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

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

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

Типовые сценарии применения

Защитные проверки параметров

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

Выход из цикла при нахождении результата

Когда функция ищет элемент в коллекции, нет смысла дочитывать цикл до конца после того, как нужное значение найдено:

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

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

Возврат из блока Попытка/Исключение

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

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

Частые ошибки при использовании Возврата

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

Вторая типичная проблема — «дырявые» ветки условий. Разработчик возвращает значение в ветке Если, но забывает про Иначе или про случай, когда ни одно из условий ИначеЕсли не сработало. Функция молча возвращает Неопределено, а вызывающий код падает уже в другом месте — например, при попытке сложить Неопределено с числом.

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

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

Возврат и обработчики событий

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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если Не ПроверкаПройдена() Тогда

Отказ = Истина;

Возврат;

КонецЕсли;

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

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

Как проверить результат работы функции

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

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

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

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

Проверка модуля в конфигураторе
Норма

Нет предупреждений о недостижимом коде и о функции без возврата значения

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

Предупреждения «функция может не вернуть значение» или «недостижимый код»

Все ветки условий
Норма

Каждая ветка завершается Возвратом с осмысленным значением

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

Есть ветки, где выполнение доходит до КонецФункции без Возврата

Типы возвращаемых значений
Норма

Во всех ветках возвращаются значения одного смыслового типа

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

В одной ветке число, в другой строка, в третьей Неопределено без необходимости

Вызывающий код
Норма

Результат проверяется на Неопределено перед использованием

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

Результат сразу участвует в вычислениях без проверки

FAQ

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

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

Можно ли использовать Возврат вне процедуры и функции, в теле модуля?

Да, оператор допустим в основном теле модуля (например, в модуле формы или объекта) — он прерывает выполнение кода модуля. На практике такой приём встречается редко, поскольку инициализационный код модуля обычно короткий и линейный.

Чем Возврат отличается от ВызватьИсключение?

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

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

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

Работает ли Возврат по-разному на клиенте и на сервере?

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

Что произойдёт, если написать Возврат со значением в процедуре?

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

Итог

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

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