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