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