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