Ошибка 1С: Функция не возвращает значение через Возврат — Решение
- Синтаксическая ошибка при проверке конфигурации или обновлении информационной базы.
- Диагностика:
{Обработка.Имя(Строка)}: Функция не возвращает значение через оператор Возврат. - Аварийное завершение работы сеанса при вызове функции, если выполнение дошло до конца тела функции (
КонецФункции) без передачи результата.
1. Принцип работы функций во встроенном языке 1С
В соответствии с архитектурой платформы 1С:Предприятие 8, конструкция Функция ... КонецФункции обязана вернуть значение любого типа во всех возможных ветвлениях алгоритма (Если - ИначеЕсли - Иначе, Попытка - Исключение).
Если поток управления доходит до ключевого слова КонецФункции, не встретив оператор Возврат <Значение>, платформа генерирует критическое исключение.
2. Типовые антипаттерны и их исправление
Антипаттерн 1: Пропущенный Возврат в ветке Иначе
// НЕПРАВИЛЬНО:
Функция ПолучитьСтатусЗаказа(Заказ)
Если Заказ.Проведен Тогда
Возврат "Проведен";
ИначеЕсли Заказ.ПометкаУдаления Тогда
Возврат "Удален";
КонецЕсли;
// Если заказ не проведен и не помечен — функция упадет!
КонецФункции
// ПРАВИЛЬНО (Единая точка выхода или дефолтный возврат):
Функция ПолучитьСтатусЗаказа(Заказ)
Результат = "Не определен";
Если Заказ.Проведен Тогда
Результат = "Проведен";
ИначеЕсли Заказ.ПометкаУдаления Тогда
Результат = "Удален";
КонецЕсли;
Возврат Результат; // Гарантированный возврат
КонецФункцииАнтипаттерн 2: Отсутствие Возврата в блоке Исключение
Функция ВыполнитьРасчет(Данные)
Попытка
// Вычисления
Возврат Результат;
Исключение
ЗаписьЖурналаРегистрации("Ошибка расчета", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат Неопределено; // ОБЯЗАТЕЛЬНО возвращать значение из блока Исключение!
КонецПопытки;
КонецФункцииАнтипаттерн 3: Путаница между Процедурой и Функцией
Если подпрограмма не должна возвращать значение, замените ключевые слова на Процедура ... КонецПроцедуры. В процедурах оператор Возврат используется без аргументов только для досрочного выхода.
Частые вопросы (FAQ)
Можно ли написать в функции просто 'Возврат;' без указания значения?
Нет, оператор 'Возврат;' без параметров допустим только внутри Процедур. Внутри Функции оператор Возврат обязан содержать возвращаемое выражение (например, 'Возврат Истина;' или 'Возврат Неопределено;').
Как стандарт разработки 1С рекомендует организовывать возврат из функций?
Стандарты разработки 1С рекомендуют инициализировать переменную 'Результат' в первой строке функции и иметь ровно один оператор 'Возврат Результат;' в самом конце тела функции.
Что произойдет, если в цикле Пока...Цикл есть Возврат, но цикл не выполнился ни разу?
Если условие цикла изначально ложно (или коллекция пуста), управление перейдет за пределы цикла к концу функции. Если там нет финального оператора Возврат, возникнет ошибка.
Проверяет ли конфигуратор наличие Возврата во всех ветках при синтакс-проверке?
Да, встроенный статический анализатор кода и синтаксическая проверка конфигуратора (Ctrl+F7) мгновенно подсвечивают функции, где управление может дойти до КонецФункции.