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