Как реализовать отчет для сравнения данных за разные периоды в 1С?

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

Одной из наиболее востребованных задач в аналитической отчетности является сравнение показателей за разные периоды времени. Например, бизнес-аналитикам часто требуется сопоставить продажи текущего месяца с аналогичным периодом прошлого года или сравнить выполнение плана в текущем квартале относительно предыдущего. В системе компоновки данных (СКД) 1С существует несколько подходов к решению этой задачи: от простого объединения запросов до использования сложных функций вычисления выражений. Рассмотрим подробнее каждый из методов, разберем их преимущества и проанализируем примеры реализации.

Метод 1. Объединение запросов с использованием разных параметров периода

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

Проанализируем пример запроса, в котором мы выбираем данные за основной период и за период сравнения:


ВЫБРАТЬ
    ОтгрузкаОбороты.Номенклатура КАК Номенклатура,
    ОтгрузкаОбороты.СуммаОборот КАК СуммаОборот,
    ОтгрузкаОбороты.Период КАК Период
ИЗ
    РегистрНакопления.Отгрузка.Обороты(&Нач, &Кон, Месяц, ) КАК ОтгрузкаОбороты

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

ВЫБРАТЬ
    ОтгрузкаОбороты.Номенклатура,
    ОтгрузкаОбороты.СуммаОборот,
    ОтгрузкаОбороты.Период
ИЗ
    РегистрНакопления.Отгрузка.Обороты(&Нач2, &Кон2, Месяц, ) КАК ОтгрузкаОбороты

В данном примере мы используем две пары параметров: &Нач/&Кон для первого периода и &Нач2/&Кон2 для второго. Это позволяет вывести данные в одну таблицу. Чтобы в СКД данные за разные периоды не перемешивались, а выводились в разные колонки, рекомендуется добавить в запрос поле-признак (например, "ТекущийПериод" и "ПрошлыйПериод") и использовать его в настройках группировки колонок.

Метод 2. Использование временных таблиц и нормализация дат

При построении диаграмм или графиков часто возникает проблема: если мы просто объединим данные за январь 2023 и январь 2024 года, СКД воспримет их как разные точки на оси времени, так как значения дат отличаются. Чтобы "наложить" один период на другой на графике, необходимо выполнить нормализацию дат — привести их к единому "виртуальному" году.

Разберем по шагам, как это реализовать с помощью временных таблиц и функции ДОБАВИТЬКДАТЕ:

  1. Сначала выберем данные за прошлый период во временную таблицу.
  2. В основном запросе выберем данные за текущий период.
  3. При объединении к датам прошлого периода добавим ровно один год, чтобы они совпали с датами текущего периода для системы компоновки.

Посмотрим на пример реализации такого подхода:


ВЫБРАТЬ
    ПродажиОбороты.СуммаОборот КАК СуммаОборот,
    ПродажиОбороты.ПериодМесяц КАК МесяцПродаж,
    ПродажиОбороты.ПериодГод КАК ПериодГод
ПОМЕСТИТЬ ДанныеПрошлогоГода
ИЗ
    РегистрНакопления.Продажи.Обороты(
        ДОБАВИТЬКДАТЕ(&ОтчНачалоПериода, ГОД, -1), 
        ДОБАВИТЬКДАТЕ(&ОтчКонецПериода, ГОД, -1), 
        Авто, ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиОбороты.СуммаОборот КАК СуммаОборот,
    ПродажиОбороты.ПериодМесяц КАК МесяцПродаж,
    ПродажиОбороты.ПериодГод КАК ПериодГод
ИЗ
    РегистрНакопления.Продажи.Обороты(&ОтчНачалоПериода, &ОтчКонецПериода, Авто, ) КАК ПродажиОбороты

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

ВЫБРАТЬ
    ДанныеПрошлогоГода.СуммаОборот,
    ДОБАВИТЬКДАТЕ(ДанныеПрошлогоГода.МесяцПродаж, ГОД, 1),
    ДанныеПрошлогоГода.ПериодГод
ИЗ
    ДанныеПрошлогоГода КАК ДанныеПрошлогоГода

Важный момент: использование функции ДОБАВИТЬКДАТЕ(ПериодМесяц, ГОД, 1) во второй части запроса позволяет нам вывести данные за прошлый год в тех же точках диаграммы, что и данные текущего года. При этом в качестве серии диаграммы мы будем использовать поле ПериодГод, чтобы разделить линии графиков.

Метод 3. Связь наборов данных в СКД

Если текст запроса слишком сложен (как в примере из сообщения №16), использование ОБЪЕДИНИТЬ ВСЕ может сделать код нечитаемым. В таких случаях мы можем использовать механизм связи нескольких наборов данных внутри самой СКД.

Рассмотрим алгоритм настройки такого отчета:

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

Этот метод позволяет избежать дублирования условий в запросе и делает разработку более модульной. Вы сможете легко добавлять новые периоды для сравнения, просто добавляя новые наборы данных.

Метод 4. Вычисляемые поля и функция "ВычислитьВыражение"

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

Проанализируем использование функции ВычислитьВыражение в ресурсах отчета. Чтобы получить значение ресурса за предыдущий период в текущей строке, можно использовать следующую конструкцию:

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

Этот подход позволяет динамически рассчитывать отклонения (абсолютные и процентные) прямо в настройках отчета, не усложняя структуру временных таблиц в БД. Однако стоит помнить, что этот метод требователен к памяти, так как системе приходится держать в кэше больший объем данных.

Практические советы по настройке параметров

Чтобы отчет был удобен для конечного пользователя, выясним причину, по которой иногда параметры заполняются некорректно. Часто программисты оставляют выбор всех дат на откуп пользователю, что приводит к ошибкам. Рекомендуется:

Использование вышеописанных методик позволит вам создавать качественные аналитические отчеты, которые помогут бизнесу эффективно отслеживать динамику показателей в разных временных разрезах.

← На главную