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