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

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

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

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

Использование функции ВычислитьВыражениеСГруппировкойМассив

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

Рассмотрим пример, когда нам нужно вычислить разницу между двумя типами штрафов, которые разделены по полю ШтрафыВПрочихДоходахИРасходах. Если это поле имеет числовой идентификатор (1 — доходы, 2 — расходы), формула в ресурсах будет выглядеть следующим образом:


Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(ВсегоПр)", "ШтрафыВПрочихДоходахИРасходах", "ШтрафыВПрочихДоходахИРасходах = 1")) 
- 
Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(ВсегоПр)", "ШтрафыВПрочихДоходахИРасходах", "ШтрафыВПрочихДоходахИРасходах = 2"))

Разберем, что происходит в этом выражении. Функция ВычислитьВыражениеСГруппировкойМассив принимает три основных параметра:

  1. Выражение: То, что мы хотим посчитать (в данном случае сумма по полю ВсегоПр).
  2. Группировки: Имя группировки, по которой собираются данные.
  3. Отбор: Условие, по которому данные попадают в массив для расчета.

Таким образом, мы сначала получаем сумму только по «первой» категории, затем сумму только по «второй» и вычитаем их друг из друга непосредственно в итоговой ячейке.

Проблема строковых отборов и типов данных

Часто программисты сталкиваются с тем, что расчет по числовому коду (= 1) работает, а по строковому наименованию — нет. Выясним причину этой особенности. В языке выражений СКД строковые литералы должны заключаться в двойные кавычки. Если вы пишете выражение внутри строки кода или в сложном выражении, количество кавычек может сбивать с толку.

Если поле ШтрафыВПрочихДоходахИРасходах является ссылочным типом (например, перечисление или справочник), прямое сравнение со строкой может выдать ошибку или пустой результат. В таких ситуациях проанализируем и применим следующие подходы:

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

Обработка пустых значений и NULL

При вычитании сумм разных групп крайне важно учитывать возможность отсутствия данных в одной из них. Проанализируем ситуацию: если по группе «Расходы» за выбранный период нет записей, функция вернет NULL. В математике 1С операция Число - NULL всегда дает NULL, в результате чего вся итоговая ячейка в отчете окажется пустой.

Чтобы избежать этой ошибки, каждое слагаемое или вычитаемое необходимо оборачивать в функцию ЕСТЬNULL. Посмотрим на доработанный пример кода:


ЕСТЬNULL(Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(ВсегоПр)", "ВидШтрафа", "ВидШтрафа = 1")), 0) 
- 
ЕСТЬNULL(Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(ВсегоПр)", "ВидШтрафа", "ВидШтрафа = 2")), 0)

Такой подход гарантирует, что даже при отсутствии данных по одной из сторон расчета, вы получите корректное числовое значение.

Альтернатива: Настройка макетов оформления

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

Пошагово разберем этот процесс:

  1. Перейдем на закладку «Макеты» в схеме компоновки данных.
  2. Добавим «Макет группировки» или «Макет области итогов».
  3. В созданном макете укажем тип области (Заголовок, Подвал, Итог).
  4. В ячейках макета можно использовать параметры, которые вычисляются по сложным формулам, или даже вызывать функции общих модулей.

Использование макетов дает полный контроль над оформлением, однако делает отчет менее гибким при изменении структуры пользователем в режиме «1С:Предприятие».

Использование функций «Первая» и «Последняя» для расчетов

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

Рассмотрим пример вычисления значения из первой строки для всех строк отчета:

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

Это позволяет зафиксировать значение в контексте и использовать его как базу для сравнения в каждой строке итогов.

Ограничения производительности

Проанализируем производительность описанных методов. Функции семейства ВычислитьВыражение... выполняются на стороне сервера приложений 1С в процессе компоновки результата, а не в SQL-запросе. Если ваш отчет оперирует сотнями тысяч строк, использование массивных вычислений в каждой строке может существенно замедлить формирование отчета.

В случае работы с большими данными, рекомендуется перенести логику расчета разниц на уровень набора данных «Запрос». Сформируйте необходимые итоги с помощью временных таблиц и объединений (UNION ALL) в самом тексте запроса, а СКД используйте только для финальной визуализации.

Заключение

Реализация нестандартных итогов в СКД требует понимания контекста вычисления выражений. Использование функции ВычислитьВыражениеСГруппировкойМассив в сочетании с ЕСТЬNULL является наиболее гибким способом получения разницы между группами. Для задач со сложным визуальным представлением лучше подходят макеты оформления. Выбирая метод, всегда учитывайте объем данных и необходимость сохранения возможности пользовательской настройки отчета.

← На главную