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