Работа с системой компоновки данных (СКД) часто преподносит сюрпризы, когда дело доходит до расчета итогов. Типичная ситуация: вы создали вычисляемое поле, прописали формулу, и в детальных записях (строках) все считается идеально. Однако, как только взгляд опускается на строку «Итого», цифры перестают поддаваться логике. В этой статье мы подробно разберем, почему так происходит, и как заставить СКД считать итоги правильно, используя ресурсы и вычисляемые поля.
Давайте проанализируем ситуацию, с которой столкнулся автор темы. Основная ошибка заключается в непонимании того, как СКД применяет формулу ресурса к итоговой строке. Рассмотрим классический пример расчета средней цены или себестоимости отклонения.
Если в поле Ресурсы вы указываете формулу вида:
Сумма(Стоимость) / Сумма(Количество) * Сумма(Отклонение)
СКД для итоговой строки выполнит следующие действия:
Это дает нам средневзвешенный показатель по всему отчету. Однако чаще всего заказчик хочет видеть в итоге просто сумму значений, которые он видит в каждой строке. Как справедливо заметили участники обсуждения, в математике сумма дробей не равна дроби сумм:
(A1/B1) + (A2/B2) != (A1+A2) / (B1+B2)
Чтобы получить в общих итогах именно сумму строк, нам нужно изменить подход к написанию формулы в ресурсах. Вместо того чтобы агрегировать каждое поле по отдельности, мы должны обернуть всю формулу в функцию Сумма(). Таким образом, СКД сначала вычислит выражение для каждой детальной записи, а затем сложит результаты.
Рассмотрим пример правильной формулы для ресурса:
Сумма(Выбор Когда КоличествоФ = 0 Тогда 0 Иначе Стоимость / Количество * ((КоличествоФ / КоличествоУпаковок) - КоличествоП) * КоличествоУпаковок Конец)
В этом случае система произведет расчет для каждой строки данных, и итоговая строка будет представлять собой математически верную сумму этих результатов.
В СКД на вкладке Ресурсы есть возможность указать, для каких группировок рассчитывается тот или иной ресурс. Это мощный инструмент, который позволяет гибко управлять итогами.
Разберем алгоритм действий:
Сумма(ИмяВашегоПоля).Благодаря этому приему в строках будет работать сложная логика с делением и условиями, а в самом низу отчета СКД просто сложит все числа, которые она вывела выше.
В сообщениях форума прозвучала важная мысль: не стоит в формулах ресурсов ссылаться на другие вычисляемые поля. Почему это считается плохой практикой? Дело в порядке расчета.
СКД сначала вычисляет значения в «Вычисляемых полях» для детальных записей. Когда дело доходит до ресурсов, система может запутаться в последовательности вычислений, особенно если вычисляемое поле само зависит от какого-то агрегатного значения. Проанализируем правильный подход: в ресурсах лучше всегда дублировать «чистую» математическую формулу, используя только поля из наборов данных (те поля, что пришли напрямую из запроса).
Вместо:
Сумма(МоеВычисляемоеПолеЦена * МоеВычисляемоеПолеКолво)
Используйте:
Сумма(Цена * Количество)
Это гарантирует предсказуемость результата и упрощает отладку отчета.
Часто итоги «плывут» из-за наличия пустых значений (NULL) в исходных данных. Если в формуле участвует поле, которое в некоторых строках не заполнено, весь результат выражения для этой строки может стать NULL, и сумма в итоге будет меньше ожидаемой.
Проанализируем пример безопасного выражения в СКД:
Сумма(ЕстьNull(Стоимость, 0)) / Выбор Когда Сумма(ЕстьNull(Количество, 0)) = 0 Тогда 1 Иначе Сумма(ЕстьNull(Количество, 0)) Конец
Важные моменты:
ЕстьNull() для числовых полей, участвующих в расчетах.ВЫБОР КОГДА внутри функции Сумма(), если логика расчета строки зависит от условий.Если ваша задача еще сложнее (например, нужно рассчитать итог как «среднее от сумм группировок»), на помощь приходит функция ВычислитьВыражение(). Рассмотрим ситуацию, когда нам нужно получить сумму максимумов по каждой группе.
Пример использования в ресурсах:
Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(Цена)", "Номенклатура"))
Эта функция позволяет сначала собрать данные (например, максимальные цены) в массив по определенной группировке, а затем применить к этому массиву агрегатную функцию (например, сложить их). Это незаменимый инструмент для сложных аналитических отчетов, где стандартные итоги не справляются.
Подводя итог, можно сказать: если у вас не сходятся итоги в СКД — проверьте, как именно агрегируются данные. Скорее всего, вам нужно перенести формулу внутрь функции Сумма() или настроить раздельный расчет для детальных записей и общих итогов на вкладке ресурсов.