|
| 1 | +# Все возможные пути выполнения функции должны содержать оператор Возврат (AllFunctionPathMustHaveReturn) |
| 2 | + |
| 3 | +| Тип | Поддерживаются<br>языки | Важность | Включена<br>по умолчанию | Время на<br>исправление (мин) | Теги | |
| 4 | +|:-------------:|:-----------------------------:|:--------:|:------------------------------:|:-----------------------------------:|:------------------------------------------------------------:| |
| 5 | +| `Дефект кода` | `BSL`<br>`OS` | `Важный` | `Да` | `1` | `unpredictable`<br>`badpractice`<br>`suspicious` | |
| 6 | + |
| 7 | +## Параметры |
| 8 | + |
| 9 | + |
| 10 | +| Имя | Тип | Описание | Значение<br>по умолчанию | |
| 11 | +|:--------------------------:|:--------:|:------------------------------------------------------------------------------------------------------------------------------------------------------:|:------------------------------:| |
| 12 | +| `loopsExecutedAtLeastOnce` | `Булево` | `Считать, что циклы выполняются, как минимум, один раз.` | `true` | |
| 13 | +| `ignoreMissingElseOnExit` | `Булево` | `Игнорировать блоки Если-ИначеЕсли, которые не имеют ветки Иначе. Отключите, если нужно детектировать выход из метода по ложному условию в ИначеЕсли.` | `false` | |
| 14 | +<!-- Блоки выше заполняются автоматически, не трогать --> |
| 15 | +## Описание диагностики |
| 16 | +Каждая функция в языке 1С имеет в самом конце неявный оператор "Возврат Неопределено". Если управление доходит до конца функции, то функция возвращает неопределено. |
| 17 | + |
| 18 | +Как правило, это не является штатным функционированием, программист должен явно описать все возвращаемые значения функции. Однако, довольно легко пропустить ситуацию, при которой управление дойдет до строки КонецФункции и вернется непредусмотренное значение Неопределено. |
| 19 | + |
| 20 | +Данная диагностика проверяет, что все возможные пути выполнения функции имеют явный оператор Возврат и функция не возвращает непредвиденных значений. |
| 21 | + |
| 22 | +## Примеры |
| 23 | + |
| 24 | +### Неправильно |
| 25 | + |
| 26 | +```bsl |
| 27 | +// если ставка заполнена, но не НДС10 и не НДС10 - вернется Неопределено |
| 28 | +// это может быть, как запланированное поведение, |
| 29 | +// так и ошибка проверки прочих вариантов. |
| 30 | +Функция ОпределитьСтавкуНДС(Знач Ставка) |
| 31 | + Если Ставка = Перечисления.СтавкиНДС.НДС20 Тогда |
| 32 | + Возврат 20; |
| 33 | + ИначеЕсли Ставка = Перечисления.СтавкиНДС.НДС10 Тогда |
| 34 | + Возврат 10; |
| 35 | + ИначеЕсли Не ЗначениеЗаполнено(Ставка) Тогда |
| 36 | + Возврат Константы.СтавкаНДСПоУмолчанию.Получить(); |
| 37 | + КонецЕсли; |
| 38 | + |
| 39 | + // здесь будет неявный возврат Неопределено |
| 40 | +КонецФункции |
| 41 | +``` |
| 42 | + |
| 43 | +### Правильно |
| 44 | + |
| 45 | +``` |
| 46 | +// явно указать намерение вернуть результат в конце функции. |
| 47 | +Функция ОпределитьСтавкуНДС(Знач Ставка) |
| 48 | + Если Ставка = Перечисления.СтавкиНДС.НДС20 Тогда |
| 49 | + Возврат 20; |
| 50 | + ИначеЕсли Ставка = Перечисления.СтавкиНДС.НДС10 Тогда |
| 51 | + Возврат 10; |
| 52 | + ИначеЕсли Не ЗначениеЗаполнено(Ставка) Тогда |
| 53 | + Возврат Константы.СтавкаНДСПоУмолчанию.Получить(); |
| 54 | + КонецЕсли; |
| 55 | + |
| 56 | + // Явно декларируем намерение вернуть Неопределено |
| 57 | + Возврат Неопределено; |
| 58 | +КонецФункции |
| 59 | +``` |
| 60 | + |
| 61 | +### Еще пример ошибочного кода: |
| 62 | + |
| 63 | +```bsl |
| 64 | +Функция СуммаСкидки(Знач КорзинаЗаказа) |
| 65 | + Если КорзинаЗаказа.Строки.Количество() > 10 Тогда |
| 66 | + Возврат Скидки.СкидкаНаКрупнуюКорзину(КорзинаЗаказа); |
| 67 | + ИначеЕсли КорзинаЗаказа.ЕстьКартаЛояльности Тогда |
| 68 | + // функция возвращает непредусмотренное значение Неопределено |
| 69 | + Скидки.СкидкаПоКартеЛояльности(КорзинаЗаказа); |
| 70 | + Иначе |
| 71 | + Возврат 0; |
| 72 | + КонецЕсли; |
| 73 | +КонецФункции |
| 74 | +``` |
| 75 | + |
| 76 | +## Сниппеты |
| 77 | + |
| 78 | +<!-- Блоки ниже заполняются автоматически, не трогать --> |
| 79 | +### Экранирование кода |
| 80 | + |
| 81 | +```bsl |
| 82 | +// BSLLS:AllFunctionPathMustHaveReturn-off |
| 83 | +// BSLLS:AllFunctionPathMustHaveReturn-on |
| 84 | +``` |
| 85 | + |
| 86 | +### Параметр конфигурационного файла |
| 87 | + |
| 88 | +```json |
| 89 | +"AllFunctionPathMustHaveReturn": { |
| 90 | + "loopsExecutedAtLeastOnce": true, |
| 91 | + "ignoreMissingElseOnExit": false |
| 92 | +} |
| 93 | +``` |
0 commit comments