Как вывести несколько периодов для сравнения в отчете СКД

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

При разработке аналитических отчетов в 1С на базе Схемы компоновки данных (СКД) часто возникает задача сравнения показателей за разные временные интервалы. Например, необходимо вывести продажи за 2016 и 2017 годы в соседних колонках. При этом хочется избежать усложнения исходного запроса с помощью дублирования подзапросов или конструкций ОБЪЕДИНИТЬ ВСЕ, так как при добавлении очередного периода отчет придется переписывать.

Рассмотрим несколько эффективных способов решения этой задачи средствами платформы 1С.

Способ 1. Использование встроенной структуры «Таблица» в настройках СКД

Самый простой и правильный путь, предусмотренный разработчиками платформы 1С, — это использование структуры группировки Таблица на вкладке «Настройки» схемы компоновки данных.

Разберем по шагам, как настроить такой вывод:

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

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

Способ 2. Связывание с временной таблицей периодов в запросе

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

Рассмотрим пример построения схемы с временной таблицей ВТ_Периоды:


ВЫБРАТЬ
	1 КАК N,
	"2016 год" КАК Представление,
	&Начало2016 КАК Начало,
	&Конец2016 КАК Окончание
ПОМЕСТИТЬ ВТ_Периоды

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2,
	"2017 год",
	&Начало2017,
	&Конец2017
;

ВЫБРАТЬ
	ОсновнаяТаблица.Номенклатура КАК Номенклатура,
	ВТ_Периоды.Представление КАК ПериодПредставление,
	ОсновнаяТаблица.Сумма КАК Сумма
ИЗ
	ВТ_ОсновнаяТаблица КАК ОсновнаяТаблица
	ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Периоды КАК ВТ_Периоды
		ПО ОсновнаяТаблица.Период >= ВТ_Периоды.Начало
		И ОсновнаяТаблица.Период <= ВТ_Периоды.Окончание

В настройках СКД выводим поле ПериодПредставление в колонки кросс-таблицы. При таком подходе основная бизнес-логика получения данных ВТ_ОсновнаяТаблица не усложняется фильтрами по конкретным датам, а связывание происходит по попаданию даты движения в интервал.

Способ 3. Использование набора данных «Объединение» на уровне СКД

Выясним, как решить задачу без изменения языка SQL в тексте запроса. В СКД можно создать набор данных типа Объединение, внутрь которого помещаются несколько независимых наборов данных типа Запрос:

  1. Создаем первый набор данных-запрос для Первого периода, где в параметрах виртуальной таблицы указываем &Период1Начало и &Период1Конец. В выборку добавляем вычисляемое текстовое поле: "Период 1" КАК ИдентификаторПериода.
  2. Создаем второй набор данных-запрос с аналогичной структурой полей для Второго периода с параметрами &Период2Начало и &Период2Конец, указывая поле "Период 2" КАК ИдентификаторПериода.
  3. Помещаем оба запроса в набор данных Объединение.
  4. В настройках отчета выводим кросс-таблицу, где группировкой колонок станет поле ИдентификаторПериода.

Способ 4. Расчет абсолютных и относительных отклонений

При сравнении периодов часто требуется вывести не только значения, но и прирост (дельту) между ними. Для этого можно использовать функции языка выражений СКД в вычисляемых полях или ресурсах.

Функция ВычислитьВыражение() позволяет обращаться к значениям из соседних колонок кросс-таблицы:

ВычислитьВыражение("Сумма(Сумма)", "ПериодПредставление", "Предыдущая")

С помощью этого выражения мы можем легко получить разницу между текущим и предыдущим периодом без изменения самого запроса 1С.

← На главную