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