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