При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда данные, которые должны выводиться одной строкой, "разваливаются" на несколько. Особенно часто это происходит при попытке посчитать количество документов (например, РеализацияТоваровУслуг) в разрезе дней. Основная причина кроется в специфике хранения типа Дата в 1С:Предприятие — она всегда содержит время с точностью до секунды. Разберем подробно, как решить эту проблему, правильно настроить ресурсы и оформить отчет в виде удобной таблицы.
Рассмотрим типичную ситуацию. В запросе выбираются поля Дата и Подразделение. На первый взгляд, если мы выставим формат даты "ДФ=dd.MM.yyyy", в отчете мы увидим только день, месяц и год. Однако СКД продолжает видеть время. Если один документ создан в 09:00:00, а другой в 15:30:00, для системы это разные значения группировки. В итоге мы получаем несколько строк на одну календарную дату.
Проанализируем пример неудачного запроса:
ВЫБРАТЬ
РеализацияТоваровУслуг.Дата КАК Дата,
РеализацияТоваровУслуг.Подразделение КАК Подразделение,
РеализацияТоваровУслуг.Ссылка КАК Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачало И &ДатаКонец
Даже если в настройках СКД мы укажем суммирование по полю Ссылка, записи не объединятся, пока значения в поле Дата не станут идентичными.
Самый надежный способ заставить СКД группировать данные по дням — это использование функции НАЧАЛОПЕРИОДА непосредственно в тексте запроса. Это гарантирует, что время во всех записях будет "обнулено" (установлено в 00:00:00), и система сможет корректно свернуть строки.
Скорректируем наш запрос:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, ДЕНЬ) КАК ДатаДень,
РеализацияТоваровУслуг.Подразделение КАК Подразделение,
РеализацияТоваровУслуг.Ссылка КАК Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачало И &ДатаКонец
Важный момент: если мы используем группировку СГРУППИРОВАТЬ ПО внутри самого запроса, нам также необходимо применить НАЧАЛОПЕРИОДА в блоке группировки:
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, ДЕНЬ),
РеализацияТоваровУслуг.Подразделение
Если мы не хотим менять текст запроса (например, когда поле Дата используется в других частях отчета с точностью до секунды), мы можем воспользоваться механизмом дополнения и расширения полей СКД. Разберем, как это сделать по шагам:
Дата.Дата, нажмем на "плюсик" рядом с ним и выберем Дата.НачалоДня.Чтобы получить итоговые цифры (например, количество документов за день), необходимо правильно настроить вкладку Ресурсы. Простое суммирование ссылок не сработает, так как ссылка — это не число.
Рассмотрим правильное выражение для ресурса:
Ссылка (или Количество, если оно создано в запросе).Количество(Различные Ссылка).Различные критически важно. Если в ваш запрос в будущем попадут табличные части (например, список товаров), обычное Количество посчитает строки товаров, а не уникальные документы. Различные гарантирует, что каждый документ будет учтен ровно один раз.Для достижения результата, как в вопросе автора (даты в строках, подразделения в колонках, на пересечении — количество), выполним следующие действия в настройках СКД:
Дата (не забываем про приведение к началу дня).Подразделение.Проанализируем, что получится: СКД создаст матрицу. По вертикали пойдут уникальные даты, по горизонтали — подразделения. На пересечении будет вызвана функция ресурса Количество(Различные Ссылка) для конкретной даты и конкретного подразделения. В конце таблицы автоматически добавятся колонки "Итого", которые просуммируют документы по горизонтали и вертикали.
Выясним причину, почему даже при правильной группировке отчет может выглядеть "грязным". Это часто связано с отображением времени. Чтобы отчет выглядел профессионально, выполним условное оформление:
В настройках поля Дата (на вкладке Наборы данных или непосредственно в настройках отчета) установим параметр Формат в значение ДФ=dd.MM.yyyy. Теперь, даже если в значении даты технически присутствуют нули времени (00:00:00), пользователь увидит только дату.
Полезный совет: Если вы хотите видеть в отчете пустые дни (дни, когда не было ни одной реализации), в настройках группировки по дате установите флаг Тип дополнения — "День". Тогда СКД автоматически "дорисует" недостающие даты в периоде и поставит в них нули, что очень удобно для анализа динамики продаж.
Для корректного суммирования количества документов по датам мы должны:
НАЧАЛОПЕРИОДА для избавления от влияния секунд времени.Количество(Различные ...).Такой подход обеспечивает точность данных и гибкость отчета при добавлении новых измерений или фильтров.