Как правильно обработать незаполненный стандартный период в выражениях и условном оформлении СКД?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов в системе компоновки данных (СКД) часто возникает задача управления видимостью колонок или строк в зависимости от выбранного пользователем периода. Нередко разработчики пытаются декомпозировать составной тип СтандартныйПериод на отдельные даты через выражения на вкладке Параметры, однако сталкиваются с тем, что проверка на пустую дату вида &СтПериод.ДатаОкончания = ДАТАВРЕМЯ(1,1,1) не срабатывает. Разберем причины такого поведения и рассмотрим корректные способы решения задачи.

Почему не работает прямое сравнение с пустой датой

Проанализируем ситуацию: если параметр типа СтандартныйПериод не заполнен пользователем или отключен флажком в пользовательских настройках, обращение к его вложенным полям (&СтПериод.ДатаОкончания) возвращает не базовую пустую дату 0001-01-01 00:00:00, а значение NULL или Неопределено. В результате логическое выражение сравнения возвращает Ложь, и ветка условия по умолчанию не выполняется.

Кроме того, при установке периода через диалоговое окно дата окончания автоматически включает время 23:59:59, что также следует учитывать при составлении условий.

Способ 1. Проверка заполненности в условном оформлении (оптимальный)

Если параметры периода создаются исключительно для оформления (например, чтобы скрыть колонки, не входящие в выбранный интервал), нет необходимости создавать промежуточные параметры дат и писать громоздкие формулы. Перенесем логику проверки непосредственно в отбор элемента условного оформления.

Разберем по шагам, как это настроить:

  1. Перейдем на вкладку Настройки и откроем Условное оформление.
  2. Добавим элемент условного оформления, указав оформляемые поля и требуемое оформление (например, свойство Видимость = Ложь или установка минимальной ширины).
  3. В условии отбора элемента оформления добавим проверку: СтПериодПрошлыйГод Заполнено.
  4. Вторым условием добавим проверку соответствия даты колонки границам выбранного интервала.

Когда пользователь оставляет период пустым, условие оформления автоматически игнорируется, и в отчете корректно отображаются все колонки без искажения итогов.

Способ 2. Корректное выражение через функцию ЗначениеЗаполнено()

Если раздельные параметры ДатаНачала и ДатаОкончания все же необходимы для вычислений или передачи в другие механизмы, исправим формулу в поле Выражение на вкладке Параметры.

Вместо прямого сравнения с ДАТАВРЕМЯ(1,1,1) используем встроенную функцию языка выражений СКД ЗначениеЗаполнено(), которая корректно обрабатывает пустые даты, значения NULL и Неопределено:


ВЫБОР 
    КОГДА ЗначениеЗаполнено(&СтПериодПрошлыйГод.ДатаОкончания) 
        ТОГДА &СтПериодПрошлыйГод.ДатаОкончания 
    ИНАЧЕ ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59) 
КОНЕЦ

Для даты начала выражение настраивается аналогичным образом:


ВЫБОР 
    КОГДА ЗначениеЗаполнено(&СтПериодПрошлыйГод.ДатаНачала) 
        ТОГДА &СтПериодПрошлыйГод.ДатаНачала 
    ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1) 
КОНЕЦ

Способ 3. Комплексная проверка на NULL и Неопределено

Если требуется строго контролировать типы данных в выражении СКД без использования функции ЗначениеЗаполнено(), применим развернутую конструкцию проверки:


ВЫБОР 
    КОГДА &СтПериодПрошлыйГод.ДатаОкончания ЕСТЬ NULL 
       ИЛИ &СтПериодПрошлыйГод.ДатаОкончания = НЕОПРЕДЕЛЕНО 
       ИЛИ &СтПериодПрошлыйГод.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1) 
        ТОГДА ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59) 
    ИНАЧЕ &СтПериодПрошлыйГод.ДатаОкончания 
КОНЕЦ

Рекомендации по настройке доступности параметров

Чтобы исключить конфликты при редактировании настроек пользователем, выполним следующие действия на вкладке Параметры схемы компоновки данных:

  1. Для управляющего параметра СтПериодПрошлыйГод установим свойство Использование в значение Всегда и включим его в пользовательские настройки.
  2. Для производных параметров ДатаНачалаПрошлыйПериод и ДатаОкончанияПрошлыйПериод включим флажок Ограничение доступности. Это скроет их от пользователя и гарантирует расчет значений строго по заданным выражениям.
← На главную