При разработке отчетов в Системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартные механизмы агрегации данных выводят лишнюю информацию. Общие итоги в конце таблицы или промежуточные суммы по группировкам могут перегружать интерфейс и мешать восприятию данных пользователем. В этой статье мы подробно разберем все способы управления итогами, начиная от простых настроек интерфейса и заканчивая программными методами управления расчетами.
Самый простой и быстрый метод — использование стандартных параметров вывода. Рассмотрим, как это сделать в конструкторе СКД. Проанализируем ситуацию: если нам нужно полностью скрыть итоговые строки и колонки, не меняя структуру самих данных, мы воспользуемся закладкой «Другие настройки».
Разберем по шагам последовательность действий:
Нет. Это отключит вывод итогов для группировок.Нет.Важно понимать, что при таком подходе СКД продолжает рассчитывать эти значения в памяти. Если ваш отчет работает с миллионами строк, такое «скрытие» не увеличит скорость формирования, так как процессорное время все равно будет затрачено на агрегацию Сумма() или Количество().
Если мы хотим не просто скрыть итоги, но и оптимизировать отчет, либо убрать итоги только для определенных полей, нам нужно поработать с закладкой «Ресурсы». Посмотрим на ситуацию глубже: когда мы добавляем поле в ресурсы, СКД автоматически пытается рассчитать его по всем доступным группировкам и для общего итога. Для наглядного освоения этой механики можно использовать пример настройки ресурсов и создания табличного отчета в СКД.
Выясним, как ограничить этот расчет. В колонке «Рассчитывать по...» можно точно указать, в каких разрезах нам нужны итоги:
Контрагент), то итог будет рассчитан только для этого уровня, а общие итоги по всему отчету останутся пустыми.Проанализируем пример: нам нужно видеть сумму по каждой накладной, но общая сумма по всем документам в конце отчета нам не нужна. В этом случае в настройке ресурса СуммаДокумента в поле «Рассчитывать по...» мы выбираем Накладная, но не выбираем «Все уровни» или «Общий итог».
Стоит отметить сообщение об ошибке, которое часто возникает у новичков (как упоминалось в Сообщении 8): если вы оставите выражение ресурса пустым, система выдаст исключение. Выражение должно содержать агрегатную функцию, например:
Сумма(Продажи.СуммаОборот)
Но управляя колонкой «Рассчитывать по», вы гибко определяете, где эта функция будет исполняться.
Иногда самым эффективным решением будет вообще отказаться от использования механизма ресурсов для конкретных данных. Посмотрим на ситуацию: если поле Цена добавлено в ресурсы с функцией Среднее, СКД обязательно выведет среднюю цену в итогах. Если нам нужно видеть цену только в строках товаров, сделаем следующее:
Цена.Цена добавлена.В этом случае поле будет отображаться как обычная текстовая или числовая информация в детальных записях, и система даже не попытается создать для него итоговую ячейку. Это значительно упрощает структуру отчета и исключает появление бессмысленных сумм (например, суммы цен или суммы курсов валют).
Рассмотрим ситуацию, когда стандартные настройки не позволяют добиться нужного результата (например, в сложных кросс-таблицах). Мы можем прибегнуть к визуальному скрытию значений с помощью «Условного оформления». Это «хитрый» способ, который позволяет оставить структуру таблицы неизменной, но сделать цифры невидимыми.
Выполним следующие шаги:
Текст = "" (пустая строка) или Видимость = Ложь.В результате СКД сформирует ячейку итога, но она будет выглядеть пустой. Этот метод незаменим, когда нужно сохранить границы таблицы или специфическую заливку фона, не показывая при этом сами расчеты.
Проанализируем возможность программного управления выводом через выражения ресурсов. В СКД можно использовать условия прямо в формуле расчета ресурса. Это позволяет выводить данные выборочно, основываясь на уровне группировки.
Рассмотрим пример кода в выражении ресурса:
Выбор
Когда ВычислитьВыражение("СистемныеПоля.Уровень", , "ОбщийИтог") > 1
Тогда Сумма(Количество)
Иначе 0
Конец
Или более простой вариант с использованием системных полей для определения текущего уровня иерархии. Это позволяет, например, выводить 0 или пустую строку вместо итога, если расчет происходит на уровне «Общего итога» (уровень 0).
Работа с таблицами в СКД отличается от работы со списками. Здесь итоги делятся на вертикальные и горизонтальные. Выясним причину путаницы: часто программисты отключают итоги в «Других настройках», но они остаются в колонках. Для таблиц нужно проверять специфические параметры:
Если вы хотите оставить итоги по строкам (например, общие продажи по магазину), но убрать итоги по колонкам (общие продажи всех магазинов за день), вы можете гибко комбинировать эти параметры, устанавливая один в значение Конец, а другой в Нет. Для более точечной настройки отображения в кросс-таблицах можно использовать способ вывода ресурса в СКД только в одной колонке.
Проанализируем важный аспект, упомянутый в обсуждении: влияет ли отключение итогов на скорость?
Запомните правило: параметры в «Других настройках» (Расположение итогов = Нет) влияют только на визуализацию. Компоновщик макета все равно генерирует запрос к базе данных с использованием агрегатных функций. Если вы боретесь за скорость выполнения тяжелого отчета, единственный верный путь — удаление полей из закладки «Ресурсы» или жесткое ограничение их расчета через «Рассчитывать по...». Только в этом случае в генерируемом SQL-запросе исчезнут лишние SUM(), GROUP BY и операции агрегации, что реально ускорит получение данных из СУБД.
Таким образом, мы рассмотрели комплексный подход к управлению итогами в СКД. Выбор конкретного метода зависит от вашей задачи: нужно ли вам просто «подправить» внешний вид или оптимизировать производительность системы.