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