При разработке отчетов в системе компоновки данных (СКД) часто возникает задача управления видимостью колонок или строк в зависимости от выбранного пользователем периода. Нередко разработчики пытаются декомпозировать составной тип СтандартныйПериод на отдельные даты через выражения на вкладке Параметры, однако сталкиваются с тем, что проверка на пустую дату вида &СтПериод.ДатаОкончания = ДАТАВРЕМЯ(1,1,1) не срабатывает. Разберем причины такого поведения и рассмотрим корректные способы решения задачи.
Проанализируем ситуацию: если параметр типа СтандартныйПериод не заполнен пользователем или отключен флажком в пользовательских настройках, обращение к его вложенным полям (&СтПериод.ДатаОкончания) возвращает не базовую пустую дату 0001-01-01 00:00:00, а значение NULL или Неопределено. В результате логическое выражение сравнения возвращает Ложь, и ветка условия по умолчанию не выполняется.
Кроме того, при установке периода через диалоговое окно дата окончания автоматически включает время 23:59:59, что также следует учитывать при составлении условий.
Если параметры периода создаются исключительно для оформления (например, чтобы скрыть колонки, не входящие в выбранный интервал), нет необходимости создавать промежуточные параметры дат и писать громоздкие формулы. Перенесем логику проверки непосредственно в отбор элемента условного оформления.
Разберем по шагам, как это настроить:
Видимость = Ложь или установка минимальной ширины).СтПериодПрошлыйГод Заполнено.Когда пользователь оставляет период пустым, условие оформления автоматически игнорируется, и в отчете корректно отображаются все колонки без искажения итогов.
Если раздельные параметры ДатаНачала и ДатаОкончания все же необходимы для вычислений или передачи в другие механизмы, исправим формулу в поле Выражение на вкладке Параметры.
Вместо прямого сравнения с ДАТАВРЕМЯ(1,1,1) используем встроенную функцию языка выражений СКД ЗначениеЗаполнено(), которая корректно обрабатывает пустые даты, значения NULL и Неопределено:
ВЫБОР
КОГДА ЗначениеЗаполнено(&СтПериодПрошлыйГод.ДатаОкончания)
ТОГДА &СтПериодПрошлыйГод.ДатаОкончания
ИНАЧЕ ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59)
КОНЕЦ
Для даты начала выражение настраивается аналогичным образом:
ВЫБОР
КОГДА ЗначениеЗаполнено(&СтПериодПрошлыйГод.ДатаНачала)
ТОГДА &СтПериодПрошлыйГод.ДатаНачала
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
КОНЕЦ
Если требуется строго контролировать типы данных в выражении СКД без использования функции ЗначениеЗаполнено(), применим развернутую конструкцию проверки:
ВЫБОР
КОГДА &СтПериодПрошлыйГод.ДатаОкончания ЕСТЬ NULL
ИЛИ &СтПериодПрошлыйГод.ДатаОкончания = НЕОПРЕДЕЛЕНО
ИЛИ &СтПериодПрошлыйГод.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1)
ТОГДА ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59)
ИНАЧЕ &СтПериодПрошлыйГод.ДатаОкончания
КОНЕЦ
Чтобы исключить конфликты при редактировании настроек пользователем, выполним следующие действия на вкладке Параметры схемы компоновки данных:
СтПериодПрошлыйГод установим свойство Использование в значение Всегда и включим его в пользовательские настройки.ДатаНачалаПрошлыйПериод и ДатаОкончанияПрошлыйПериод включим флажок Ограничение доступности. Это скроет их от пользователя и гарантирует расчет значений строго по заданным выражениям.