Одной из наиболее востребованных задач в аналитической отчетности является сравнение показателей за разные периоды времени. Например, бизнес-аналитикам часто требуется сопоставить продажи текущего месяца с аналогичным периодом прошлого года или сравнить выполнение плана в текущем квартале относительно предыдущего. В системе компоновки данных (СКД) 1С существует несколько подходов к решению этой задачи: от простого объединения запросов до использования сложных функций вычисления выражений. Рассмотрим подробнее каждый из методов, разберем их преимущества и проанализируем примеры реализации.
Самый очевидный и часто используемый способ — это создание нескольких запросов к регистрам накопления и их объединение с помощью оператора ОБЪЕДИНИТЬ ВСЕ. В этом случае для каждой части объединения мы задаем свои параметры начала и конца периода. Рассмотрим ситуацию, когда нам нужно сравнить отгрузки за два разных месяца.
Проанализируем пример запроса, в котором мы выбираем данные за основной период и за период сравнения:
ВЫБРАТЬ
ОтгрузкаОбороты.Номенклатура КАК Номенклатура,
ОтгрузкаОбороты.СуммаОборот КАК СуммаОборот,
ОтгрузкаОбороты.Период КАК Период
ИЗ
РегистрНакопления.Отгрузка.Обороты(&Нач, &Кон, Месяц, ) КАК ОтгрузкаОбороты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ОтгрузкаОбороты.Номенклатура,
ОтгрузкаОбороты.СуммаОборот,
ОтгрузкаОбороты.Период
ИЗ
РегистрНакопления.Отгрузка.Обороты(&Нач2, &Кон2, Месяц, ) КАК ОтгрузкаОбороты
В данном примере мы используем две пары параметров: &Нач/&Кон для первого периода и &Нач2/&Кон2 для второго. Это позволяет вывести данные в одну таблицу. Чтобы в СКД данные за разные периоды не перемешивались, а выводились в разные колонки, рекомендуется добавить в запрос поле-признак (например, "ТекущийПериод" и "ПрошлыйПериод") и использовать его в настройках группировки колонок.
При построении диаграмм или графиков часто возникает проблема: если мы просто объединим данные за январь 2023 и январь 2024 года, СКД воспримет их как разные точки на оси времени, так как значения дат отличаются. Чтобы "наложить" один период на другой на графике, необходимо выполнить нормализацию дат — привести их к единому "виртуальному" году.
Разберем по шагам, как это реализовать с помощью временных таблиц и функции ДОБАВИТЬКДАТЕ:
Посмотрим на пример реализации такого подхода:
ВЫБРАТЬ
ПродажиОбороты.СуммаОборот КАК СуммаОборот,
ПродажиОбороты.ПериодМесяц КАК МесяцПродаж,
ПродажиОбороты.ПериодГод КАК ПериодГод
ПОМЕСТИТЬ ДанныеПрошлогоГода
ИЗ
РегистрНакопления.Продажи.Обороты(
ДОБАВИТЬКДАТЕ(&ОтчНачалоПериода, ГОД, -1),
ДОБАВИТЬКДАТЕ(&ОтчКонецПериода, ГОД, -1),
Авто, ) КАК ПродажиОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиОбороты.СуммаОборот КАК СуммаОборот,
ПродажиОбороты.ПериодМесяц КАК МесяцПродаж,
ПродажиОбороты.ПериодГод КАК ПериодГод
ИЗ
РегистрНакопления.Продажи.Обороты(&ОтчНачалоПериода, &ОтчКонецПериода, Авто, ) КАК ПродажиОбороты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДанныеПрошлогоГода.СуммаОборот,
ДОБАВИТЬКДАТЕ(ДанныеПрошлогоГода.МесяцПродаж, ГОД, 1),
ДанныеПрошлогоГода.ПериодГод
ИЗ
ДанныеПрошлогоГода КАК ДанныеПрошлогоГода
Важный момент: использование функции ДОБАВИТЬКДАТЕ(ПериодМесяц, ГОД, 1) во второй части запроса позволяет нам вывести данные за прошлый год в тех же точках диаграммы, что и данные текущего года. При этом в качестве серии диаграммы мы будем использовать поле ПериодГод, чтобы разделить линии графиков.
Если текст запроса слишком сложен (как в примере из сообщения №16), использование ОБЪЕДИНИТЬ ВСЕ может сделать код нечитаемым. В таких случаях мы можем использовать механизм связи нескольких наборов данных внутри самой СКД.
Рассмотрим алгоритм настройки такого отчета:
Номенклатура или Контрагент).ДобавитьКДате(&НачалоПериода, "Месяц", -1)).Этот метод позволяет избежать дублирования условий в запросе и делает разработку более модульной. Вы сможете легко добавлять новые периоды для сравнения, просто добавляя новые наборы данных.
Для продвинутых пользователей СКД существует возможность сравнивать периоды вообще без изменения текста запроса. Мы можем выбрать данные за один большой интервал (например, весь прошлый и текущий год) и использовать функции языка выражений СКД.
Проанализируем использование функции ВычислитьВыражение в ресурсах отчета. Чтобы получить значение ресурса за предыдущий период в текущей строке, можно использовать следующую конструкцию:
ВычислитьВыражение("Сумма(СуммаОборот)", , , "Предыдущая", "Период")
Этот подход позволяет динамически рассчитывать отклонения (абсолютные и процентные) прямо в настройках отчета, не усложняя структуру временных таблиц в БД. Однако стоит помнить, что этот метод требователен к памяти, так как системе приходится держать в кэше больший объем данных.
Чтобы отчет был удобен для конечного пользователя, выясним причину, по которой иногда параметры заполняются некорректно. Часто программисты оставляют выбор всех дат на откуп пользователю, что приводит к ошибкам. Рекомендуется:
СтандартныйПериод).&Нач2, &Кон2) от пользователя, устанавливая флаг "Ограничение доступности".&НачалоПрошлогоПериода в колонке "Выражение" укажите ДОБАВИТЬКДАТЕ(&ПериодОтчета.ДатаНачала, "ГОД", -1).Использование вышеописанных методик позволит вам создавать качественные аналитические отчеты, которые помогут бизнесу эффективно отслеживать динамику показателей в разных временных разрезах.