Перейти к содержанию

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

Кратко

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

Идентификаторы

Поле Значение
Код правила BSL148
Совместимый псевдоним AllFunctionPathMustHaveReturn
Серьёзность ERROR
Включено по умолчанию Да
Реализовано Да
Теги error-handling, correctness

Поведение

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

Настройка и подавление

Код BSL### — основной стабильный идентификатор. Совместимый псевдоним принимается в select, ignore и совместимых блоковых комментариях.

[tool.onec-hbk-bsl]
select = ["BSL148"]
ignore = ["AllFunctionPathMustHaveReturn"]

Все три семейства подавлений работают для текущей строки и диапазона. Если открывающий комментарий стоит после кода, он действует только на эту строку. Используйте любой один вариант:

  • noqa:
Значение = "пример";  // noqa: BSL148
  • bsl-disable (совместимый вариант):
Значение = "пример";  // bsl-disable: BSL148
  • совместимый BSLLS-вариант:
Значение = "пример";  // BSLLS:AllFunctionPathMustHaveReturn-off

Если тот же открывающий комментарий стоит на отдельной строке, он начинает диапазон. Закройте его парным маркером того же семейства:

// noqa: BSL148
// код без этой диагностики
// noqa-enable: BSL148

// bsl-disable: BSL148
// код без этой диагностики
// bsl-enable: BSL148

// BSLLS:AllFunctionPathMustHaveReturn-off
// код без этой диагностики
// BSLLS:AllFunctionPathMustHaveReturn-on

Чтобы отключить правило до конца файла, не добавляйте закрывающий noqa-enable, bsl-enable или BSLLS:…-on.

Открывающий и закрывающий маркеры должны принадлежать одному семейству.

Описание диагностики

Каждая функция в языке 1С имеет в самом конце неявный оператор "Возврат Неопределено". Если управление доходит до конца функции, то функция возвращает неопределено.

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

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

Примеры

Неправильно

// если ставка заполнена, но не равна НДС20 и не равна НДС10 - вернется Неопределено
// это может быть, как запланированное поведение,
// так и ошибка проверки прочих вариантов.
Функция ОпределитьСтавкуНДС(Знач Ставка)
    Если Ставка = Перечисления.СтавкиНДС.НДС20 Тогда
        Возврат 20;
    ИначеЕсли Ставка = Перечисления.СтавкиНДС.НДС10 Тогда
        Возврат 10;
    ИначеЕсли Не ЗначениеЗаполнено(Ставка) Тогда
        Возврат Константы.СтавкаНДСПоУмолчанию.Получить();
    КонецЕсли;

    // здесь будет неявный возврат Неопределено
КонецФункции

Правильно

// явно указать намерение вернуть результат в конце функции.
Функция ОпределитьСтавкуНДС(Знач Ставка)
    Если Ставка = Перечисления.СтавкиНДС.НДС20 Тогда
        Возврат 20;
    ИначеЕсли Ставка = Перечисления.СтавкиНДС.НДС10 Тогда
        Возврат 10;
    ИначеЕсли Не ЗначениеЗаполнено(Ставка) Тогда
        Возврат Константы.СтавкаНДСПоУмолчанию.Получить();
    КонецЕсли;

    // Явно декларируем намерение вернуть Неопределено
    Возврат Неопределено;
КонецФункции

Еще пример ошибочного кода:

Функция СуммаСкидки(Знач КорзинаЗаказа)
    Если КорзинаЗаказа.Строки.Количество() > 10 Тогда
        Возврат Скидки.СкидкаНаКрупнуюКорзину(КорзинаЗаказа);
    ИначеЕсли КорзинаЗаказа.ЕстьКартаЛояльности Тогда
        // функция возвращает непредусмотренное значение Неопределено
        Скидки.СкидкаПоКартеЛояльности(КорзинаЗаказа);
    Иначе
        Возврат 0;
    КонецЕсли;
КонецФункции