Почему в отчетах СКД при добавлении ресурса суммы удваиваются и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Часто при разработке отчетов на системе компоновки данных (СКД) разработчики сталкиваются с ситуацией, когда простая группировка данных дает корректный результат, но при добавлении того же поля в качестве Ресурса итоговые суммы увеличиваются вдвое. Давайте разберем, почему так происходит и как привести расчеты к правильному виду.

Разберемся в причинах дублирования данных

Основная причина кроется в том, как СКД обрабатывает данные при расчете итогов. Когда вы объявляете поле ресурсом, система автоматически добавляет агрегатные функции и выполняет соединения наборов данных. Если в выборке присутствуют дублирующиеся строки или некорректно настроены связи, СКД при попытке просуммировать значения может учитывать одни и те же записи несколько раз.

Чаще всего это происходит по двум причинам:

  1. Неверная работа с регистрами накопления: Вы пытаетесь получить итоговую сумму из физической таблицы регистра, где одна запись является «Приходом», а другая — «Расходом». Если отчет выводит обе записи, сумма удваивается.
  2. Избыточность связей: Если в схеме компоновки данных настроены связи наборов данных, которые приводят к декартову произведению строк.

Шаг 1: Правильная работа с регистрами накопления

Первым делом проанализируем структуру ваших данных. Если вы используете регистр накопления, например РасчетыСКлиентамиПланОплат, работать с его физической таблицей напрямую для получения остатков — неверная практика. В регистре могут существовать записи, которые в сумме дают ноль (например, приход планируемой оплаты и ее погашение), но в отчете они могут отражаться как две отдельные строки.

Вместо этого мы рекомендуем использовать виртуальные таблицы остатков. Это позволит получать именно ту сумму, которая актуальна на текущую дату, избегая «мусорных» записей.

Рассмотрим правильный пример запроса:


ВЫБРАТЬ
    Регистр.ДокументПлан КАК ДокументПлан,
    Регистр.КОплатеОстаток КАК КОплате
ИЗ
    РегистрНакопления.РасчетыСКлиентамиПланОплат.Остатки(&Дата, ) КАК Регистр

Использование виртуальной таблицы Остатки автоматически избавляет от необходимости вручную фильтровать записи по видам движения, так как система сама производит свертку по измерениям.

Шаг 2: Диагностика запроса через инструменты разработчика

Если вы уверены, что используете остатки, но суммы всё равно двоятся, необходимо увидеть, какой именно запрос отправляет СКД к базе данных. Для этого воспользуйтесь Консолью компоновки данных.

В этом инструменте вы сможете:

Шаг 3: Корректное использование агрегатных функций

Иногда возникает соблазн использовать «костыли», например, сложные выражения вроде Сумма(МАССИВ(ТаблицаЗначений(...))). Мы настоятельно не рекомендуем такие методы. Они скрывают проблему, а не решают ее, и могут привести к непредсказуемым результатам при изменении данных в базе.

Если вам нужно управлять тем, как именно СКД считает сумму внутри группировок, лучше воспользоваться встроенной функцией ВычислитьВыражение. Рассмотрим пример:

ВычислитьВыражение("Сумма(КОплате)", , , "Первая", "Последняя")

Это выражение позволяет явно указать СКД способ агрегации данных внутри группировок, что помогает избежать дублирования при расчете итогов. Тем не менее, всегда старайтесь исправлять архитектуру данных в запросе, а не корректировать последствия на уровне настроек ресурсов.

Рекомендации по итогам анализа

Чтобы отчет работал стабильно, придерживайтесь следующих правил:

Проанализировав эти шаги, вы сможете быстро найти причину двоения сумм и исправить отчет без использования ненадежных приемов.

← На главную