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