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