Как в СКД сравнить показатели аналогичных месяцев разных лет и рассчитать процент отклонения

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

Сравнительный анализ данных по периодам — одна из самых частых задач при построении управленческой отчетности. Типичный пример: необходимо вывести таблицу продаж, где рядом стоят показатели января 2018 и января 2019 года, а следом — процент их разницы. Сложность заключается в том, что стандартный механизм вывода периодов в Системе компоновки данных (СКД) обычно выводит периоды линейно (хронологически), что затрудняет расчет отклонений между "соседними" годами внутри одного месяца.

В этой статье мы разберем несколько подходов к решению этой задачи: от изменения структуры настроек до использования мощных встроенных функций языка выражений СКД.

Метод 1: Настройка структуры колонок в кросс-таблице

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

Рассмотрим по шагам, как настроить структуру колонок:

  1. Подготовка данных в запросе: В запросе необходимо получить два измерения: номер месяца (число от 1 до 12 или его название) и год.
    
    ВЫБРАТЬ
        МЕСЯЦ(Продажи.Период) КАК НомерМесяца,
        ГОД(Продажи.Период) КАК Год,
        Продажи.СуммаОборот КАК Сумма
    ИЗ
        РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Месяц, ) КАК Продажи
    
  2. Настройка иерархии в СКД: Перейдем на закладку "Настройки". Вместо того чтобы просто добавить поле Период в колонки, создадим вложенную структуру:
    • Верхний уровень колонок: Группировка по полю НомерМесяца.
    • Вложенный уровень колонок: Группировка по полю Год.

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

Метод 2: Использование функции ВычислитьВыражение()

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

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


(Сумма(Сумма) - ВычислитьВыражение("Сумма(Сумма)", "Год", "Группировка", "Предыдущая")) 
/ ВычислитьВыражение("Сумма(Сумма)", "Год", "Группировка", "Предыдущая") * 100

Разберем параметры функции:

Важно помнить о проверке деления на ноль. В реальном отчете выражение должно выглядеть более безопасно:


ВЫБОР 
    КОГДА ЕстьNull(ВычислитьВыражение("Сумма(Сумма)", "Год", "Группировка", "Предыдущая"), 0) = 0 
    ТОГДА 0 
    ИНАЧЕ (Сумма(Сумма) - ВычислитьВыражение("Сумма(Сумма)", "Год", "Группировка", "Предыдущая")) 
          / ВычислитьВыражение("Сумма(Сумма)", "Год", "Группировка", "Предыдущая") * 100 
КОНЕЦ

Метод 3: Использование вычисляемых полей и связи наборов данных

Выясним причину, по которой иногда предыдущие методы не подходят: например, если данных за прошлый год в базе нет совсем, и колонка просто не создается, что мешает расчету. В этом случае эффективным решением будет создание двух наборов данных в СКД.

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

Теперь в одном наборе данных (результирующем) у нас в каждой строке (для каждого месяца) есть две разные колонки: СуммаТекущая и СуммаПрошлая. Расчет процента в "Вычисляемых полях" становится тривиальным:

(СуммаТекущая - СуммаПрошлая) / СуммаПрошлая * 100

Этот метод гарантирует, что даже если в текущем году продаж в январе не было, а в прошлом были, мы все равно увидим корректную строку в отчете.

Особенности оформления и сортировки

Чтобы отчет выглядел профессионально, воспользуемся советами из обсуждения на форуме. Для вывода названий месяцев вместо чисел (1, 2, 3...) можно использовать поле выражения в вычисляемых полях или прямо в запросе:


ВЫБОР 
    КОГДА МЕСЯЦ(Период) = 1 ТОГДА "Январь"
    КОГДА МЕСЯЦ(Период) = 2 ТОГДА "Февраль"
    ...
КОНЕЦ КАК ИмяМесяца

Обратите внимание: если вы используете текстовые названия месяцев, сортировка может нарушиться (Апрель станет первым по алфавиту). Чтобы этого избежать, на закладке "Наборы данных" для поля ИмяМесяца укажите в колонке "Выражение упорядочивания" числовое поле НомерМесяца.

Рассмотренные подходы позволяют гибко настраивать аналитические отчетов типа "Year-over-Year". Использование функции ВычислитьВыражение является наиболее современным и рекомендуемым методом для платформы 1С 8.3, так как оно минимизирует объем данных, передаваемых из БД, и перекладывает расчеты на мощный движок компоновки данных.

← На главную