При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает проблема, связанная с избыточностью данных при выводе информации. Рассмотрим ситуацию, когда один счет к оплате может содержать несколько заказов покупателя. В обычном «плоском» запросе такая связь приводит к тому, что сумма счета повторяется для каждого связанного заказа, что искажает итоговые показатели отчета.
Разберем, почему это происходит и какими методами мы можем устранить эту проблему, чтобы сумма счета отображалась корректно и не суммировалась ошибочно при расчете итогов.
Проблема кроется в способе соединения таблиц в SQL-запросе. Когда мы соединяем таблицу заказов с таблицей счетов через LEFT JOIN, мы получаем декартово произведение записей. Если к одному счету на сумму 100 рублей привязано 3 заказа, в выборку попадет три строки, где в каждой колонке «Сумма счета» будет стоять 100. При автоматическом суммировании СКД сложится 100 + 100 + 100, и мы получим 300 вместо фактических 100. Чтобы этого избежать, мы должны изменить подход к получению или выводу данных.
Самый простой и эффективный способ — отказаться от вывода детальных записей в пользу иерархических группировок. Разберем по шагам:
При такой структуре СКД будет считать сумму счета как атрибут самого счета, а заказы будут выступать как подчиненные элементы. Итоговые суммы при такой структуре будут считаться корректно, так как сумма счета станет ресурсом верхнего уровня и не будет дублироваться в детальных строках заказов.
Если нам необходимо видеть заказы в одном списке, мы можем использовать механизм связи наборов данных. Вместо одного общего запроса создадим два:
Затем в настройках связей наборов данных мы указываем, что набор данных с заказами связан с набором данных со счетами по полю Счет. СКД самостоятельно сопоставит данные, и сумма счета будет подтягиваться к заказу из уникальной выборки, исключая риск дублирования при расчете агрегатов.
Если структура запроса не позволяет разделить наборы данных, мы можем использовать ресурсы СКД и вычисляемые поля. Разберем использование функций ВычислитьВыражение.
Для корректного отображения суммы мы можем использовать следующее выражение в поле ресурса:
ВычислитьВыражение("СуммаСчета", , , "Первая")
Эта функция позволяет выводить значение суммы счета только для первой записи в группе, а для остальных строк возвращать NULL или 0. Это предотвращает суммирование одной и той же величины несколько раз. Важно правильно настроить Рассчитывать по для данного ресурса в параметрах СКД, чтобы итоги считались только по группировке счетов.
Проанализируем ситуацию: если вы работаете в конфигурации Управление торговлей, обратите внимание, что данные лучше получать не из самих документов, а из регистров накопления или регистров сведений. Часто правильнее получать данные из регистров, где связь между заказом и счетом уже зафиксирована в соответствующих измерениях. Это позволяет:
виртуальных таблиц.Работая с СКД, всегда стремитесь к тому, чтобы данные в ресурсах группировались на максимально высоком уровне логической структуры. Это не только решает проблему с дублированием сумм, но и значительно упрощает поддержку отчета в будущем.