Как в отчете на СКД вывести дни, по которым не было продаж?

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

При формировании аналитических отчетов по продажам часто возникает ситуация, когда за определенные даты движений не происходило. По умолчанию запрос к виртуальной таблице регистра продаж возвращает только те периоды, в которых фактически были обороты. В итоге отчет выводит не непрерывную временную шкалу, а разрозненные даты (например, 1, 3, 7 и 10 число), пропуская остальные дни. Разберем, как вывести все дни заданного интервала и заполнить пропуски нулями.

Почему простое левое соединение с календарем может не работать

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

Проанализируем распространенные ошибки при построении запроса с календарем:

  1. Условия в секции ГДЕ: Если фильтрация по номенклатуре, складу или самому периоду регистра наложена в секции ГДЕ общего запроса, то для дней без продаж поля правой таблицы содержат NULL. Любая проверка вида ГДЕ Продажи.Номенклатура = &Номенклатура отсекает строки со значением NULL, превращая левое соединение во внутреннее. Чтобы этого избежать, условия по полям регистра необходимо переносить в параметры виртуальной таблицы или в условие соединения ПО.
  2. Глобальные отборы СКД: Если пользователь задает отбор на вкладке «Настройки» СКД, платформа по умолчанию дописывает условие в секцию ГДЕ результирующего запроса. В таком случае строки календаря без продаж снова отсекаются.

Способ 1. Использование штатного механизма дополнения периода в СКД

В системе компоновки данных предусмотрен встроенный инструмент, позволяющий автоматически дополнять периоды без необходимости соединять таблицы с календарем в тексте запроса. Рассмотрим по шагам, как его правильно настроить.

Шаг 1. Настройка роли поля периода

Перейдем на вкладку «Наборы данных». Если дата выбирается из виртуальной таблицы с периодичностью «Авто», СКД обычно определяет роль автоматически. Если же поле даты рассчитывается вручную или выбирается из физической таблицы, проверим колонку «Роль» для поля даты. В открывшемся окне установим флажок Период, укажем его уровень и порядок.

Шаг 2. Настройка группировки в структуре отчета

Механизм дополнения работает исключительно для группировок и не применяется к детальным записям. Перейдем на вкладку «Настройки» и выполним следующие действия:

  1. Выберем группировку по полю периода (например, ПериодДень).
  2. Откроем свойства этой группировки и перейдем к разделу дополнения периода.
  3. В поле Тип дополнения выберем значение День.
  4. В полях Начальная дата и Конечная дата укажем параметры отчета, например &НачалоПериода и &КонецПериода.

Если начальная и конечная даты не будут заданы, СКД выполнит дополнение только между первой и последней фактической датой продажи, а дни до первой продажи и после последней останутся пропущенными.

Шаг 3. Замена пустых значений на нули

Для дней, добавленных механизмом дополнения, значения ресурсов будут отсутствовать (значение NULL). Чтобы вместо пустых ячеек в отчете отображался ноль, перейдем на вкладку «Ресурсы» и отредактируем выражение расчета ресурса с использованием функции ЕСТЬNULL:

ЕСТЬNULL(Сумма(СуммаОборот), 0)

Способ 2. Использование связей наборов данных

Рассмотрим еще один надежный вариант, который позволяет избежать проблем с отборами в запросе — разделение выборки на два набора данных.

  1. Первый набор данных (Календарь): Запрос выбирает непрерывный список дат за период отчета из производственного календаря.
  2. Второй набор данных (Продажи): Запрос выбирает фактические обороты из регистра сведений или накопления с группировкой по дням.
  3. Связи наборов: На вкладке «Связи наборов данных» свяжем источник Календарь с приемником Продажи по полю даты. В качестве ведущего набора выступает календарь. В параметрах связи передадим нужные условия.

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

← На главную