Как в СКД рассчитать сумму максимумов группировок по периодам?

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

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

Метод 1: Разделение наборов данных (Архитектурный подход)

Одним из самых надежных и понятных способов является разделение исходных данных. Если в отчете требуется отобразить как детальные данные (потребление по квартирам), так и агрегаты (потребление по ОПУ), которые считаются иначе, правильнее разнести их в разные наборы данных.

  1. Создадим два набора данных: Первый набор будет содержать детальные данные с полной расшифровкой до уровня квартир. Второй набор — это агрегированные данные «ПотреблениеПоОПУ» в разрезе строений и периодов без детализации по квартирам.
  2. Настроим связи: В настройках наборов данных укажем связи по полям Строение и Период. Это позволит СКД корректно сопоставить агрегированные показатели с детальными данными.
  3. Настроим ресурсы: Теперь в настройках ресурсов мы можем использовать обычную Сумма как для ПотреблениеПоФакту, так и для ПотреблениеПоОПУ. Так как во втором наборе у нас уже лежат правильные максимумы, нам не потребуется писать сложные формулы, что значительно ускорит работу отчета и сделает его более стабильным.

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

Метод 2: Использование функции ВычислитьВыражениеСГруппировкойМассив

Если по каким-то причинам вы не можете разделить данные на разные наборы, воспользуйтесь мощным инструментом — функцией ВычислитьВыражениеСГруппировкойМассив. Основная ошибка при использовании этой функции заключается в неправильном указании группировок для вычисления.

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

Попробуйте следующую формулу для ресурса:


Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(ПотреблениеПоОПУ)", "Строение, ПериодМесяц"))

Почему это работает:

Когда вы указываете Строение, ПериодМесяц, вы фактически говорите системе: «Сначала сгруппируй данные по строению и месяцу, внутри каждой такой группы найди максимум, а затем, на уровне группировки Строение, просуммируй результаты этих максимумов». Если упустить ПериодМесяц из параметров функции, система вычислит «глобальный максимум» за все время существования строения, что приведет к неверным итогам.

Рекомендации по настройке ресурсов

При настройке ресурсов в СКД обязательно учитывайте следующие моменты:

Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(Объем)", "Объем"))

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

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

← На главную