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