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

BSL047 - Магические даты

Кратко

Магические даты

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

Поле Значение
Код правила BSL047
Совместимый псевдоним MagicDate
Серьёзность INFORMATION
Без конфигурации Да
BSLLS JSON, режим ON без переопределений Да
Флаг реестра implemented Да
Теги design, date-time

Флаг implemented отражает реестр и не подтверждает проверенное совпадение с BSLLS.

Поведение

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

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

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

[tool.onec-hbk-bsl]
select = ["BSL047"]
ignore = ["MagicDate"]

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

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

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

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

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

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

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

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

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

Магическая дата - это любая дата в вашем коде, которая не очевидна без погружения в контекст.

Примеры

Плохо

Если текДата < '20151021' Тогда
    ХоверБордБудетИзобретен = Неопределено;
КонецЕсли;

Хорошо

ПредсказаннаяДата = '20151021';
Если текДата < ПредсказаннаяДата Тогда
    ХоверБордБудетИзобретен = Неопределено;
КонецЕсли;

Также хорошим решением является использование специального метода с говорящим названием, который возвращает дату-константу

Функция ДатаИзобретенияХовера()
    Возврат '20151021';
КонецФункции

Если текДата < ДатаИзобретенияХовера() Тогда
    ХоверБордБудетИзобретен = Неопределено;
КонецЕсли;

Исключения

Магические даты, используемые в структурах и соответствиях, не считаются ошибками, так как они используются в качестве ключей или значений в структурах данных, где контекст понятен:

// Операция Вставить структуры - нет ошибки
Структура = Новый Структура;
Структура.Вставить("ДатаНачала", '20250101'); // Нет ошибки
Структура.Вставить("ДатаОкончания", '20251231'); // Нет ошибки
Структура.Вставить("МаксимальнаяДата", '39991231235959'); // Нет ошибки

// Конструктор структуры - нет ошибки
Структура2 = Новый Структура("ДатаНачала, ДатаОкончания", '20250101', '20251231'); // Нет ошибки

// Прямое присваивание свойству структуры - нет ошибки
СтруктураСПолями = Новый Структура("ДатаНачала, ДатаОкончания");
СтруктураСПолями.ДатаНачала = '20250101'; // Нет ошибки
СтруктураСПолями.ДатаОкончания = '20251231'; // Нет ошибки

// Фиксированная структура - нет ошибки
ФиксированнаяСтруктура = Новый ФиксированнаяСтруктура("Значение", '20240101'); // Нет ошибки

// Соответствие - нет ошибки (как ключ, так и значение)
Соответствие = Новый Соответствие;
Соответствие.Вставить("Код", '20230101'); // Нет ошибки
Соответствие.Вставить('19800101', "Олимпиада в Москве"); // Нет ошибки