При формировании аналитических отчетов по продажам часто возникает ситуация, когда за определенные даты движений не происходило. По умолчанию запрос к виртуальной таблице регистра продаж возвращает только те периоды, в которых фактически были обороты. В итоге отчет выводит не непрерывную временную шкалу, а разрозненные даты (например, 1, 3, 7 и 10 число), пропуская остальные дни. Разберем, как вывести все дни заданного интервала и заполнить пропуски нулями.
Первая идея, которая часто приходит в голову разработчику, — создать таблицу производственного календаря и связать ее с регистром продаж через ЛЕВОЕ СОЕДИНЕНИЕ по полю даты. Однако нередко отчет все равно продолжает выводить только даты с продажами. Выясним причину такого поведения.
Проанализируем распространенные ошибки при построении запроса с календарем:
ГДЕ: Если фильтрация по номенклатуре, складу или самому периоду регистра наложена в секции ГДЕ общего запроса, то для дней без продаж поля правой таблицы содержат NULL. Любая проверка вида ГДЕ Продажи.Номенклатура = &Номенклатура отсекает строки со значением NULL, превращая левое соединение во внутреннее. Чтобы этого избежать, условия по полям регистра необходимо переносить в параметры виртуальной таблицы или в условие соединения ПО.ГДЕ результирующего запроса. В таком случае строки календаря без продаж снова отсекаются.В системе компоновки данных предусмотрен встроенный инструмент, позволяющий автоматически дополнять периоды без необходимости соединять таблицы с календарем в тексте запроса. Рассмотрим по шагам, как его правильно настроить.
Шаг 1. Настройка роли поля периода
Перейдем на вкладку «Наборы данных». Если дата выбирается из виртуальной таблицы с периодичностью «Авто», СКД обычно определяет роль автоматически. Если же поле даты рассчитывается вручную или выбирается из физической таблицы, проверим колонку «Роль» для поля даты. В открывшемся окне установим флажок Период, укажем его уровень и порядок.
Шаг 2. Настройка группировки в структуре отчета
Механизм дополнения работает исключительно для группировок и не применяется к детальным записям. Перейдем на вкладку «Настройки» и выполним следующие действия:
ПериодДень).День.&НачалоПериода и &КонецПериода.Если начальная и конечная даты не будут заданы, СКД выполнит дополнение только между первой и последней фактической датой продажи, а дни до первой продажи и после последней останутся пропущенными.
Шаг 3. Замена пустых значений на нули
Для дней, добавленных механизмом дополнения, значения ресурсов будут отсутствовать (значение NULL). Чтобы вместо пустых ячеек в отчете отображался ноль, перейдем на вкладку «Ресурсы» и отредактируем выражение расчета ресурса с использованием функции ЕСТЬNULL:
ЕСТЬNULL(Сумма(СуммаОборот), 0)
Рассмотрим еще один надежный вариант, который позволяет избежать проблем с отборами в запросе — разделение выборки на два набора данных.
Календарь с приемником Продажи по полю даты. В качестве ведущего набора выступает календарь. В параметрах связи передадим нужные условия.При таком подходе календарная сетка формируется гарантированно, а пользовательские отборы по полям второго набора не исключают пустые даты из итогового отчета.