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