Как в СКД рассчитать показатель на основе итогов других ресурсов?

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

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

Почему нельзя просто сослаться на имя ресурса?

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

Решение через использование вычисляемых полей

Если логика расчета ресурса является громоздкой (содержит много условий ВЫБОР КОГДА), хорошей практикой будет вынесение промежуточных вычислений в вычисляемые поля. Это делает структуру отчета более читаемой и упрощает отладку.

Рассмотрим пример создания вычисляемого поля ЗначениеПоказатель, которое вычисляет агрегат в зависимости от параметра:


ВычислитьВыражение("Выбор
    Когда СпособАгрегации = &СпособСреднее Тогда Среднее(Значение)
    Когда СпособАгрегации = &СпособСумма Тогда Сумма(Значение)
    Когда СпособАгрегации = &СпособМинимум Тогда Минимум(Значение)
    Когда СпособАгрегации = &СпособМаксимум Тогда Максимум(Значение)
Конец", "Показатель")

После того как мы определили вычисляемое поле, мы можем использовать его в ресурсах, комбинируя с функциями Максимум() или Сумма() для корректного обращения к данным группировки.

Применение функции ВычислитьВыражениеСГруппировкойМассив

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

Эта функция позволяет получить массив значений ресурса по указанной группировке, после чего мы можем применить к нему агрегатную функцию (например, Сумма()). Это незаменимый инструмент, когда нужно просуммировать сложные результаты, полученные путем деления или иного пересчета.

Пример реализации сложного расчета с итогом:


Сумма(ВычислитьВыражениеСГруппировкойМассив("
    Выбор
        Когда ... (условие) ...
        Иначе ... (расчет) ...
    Конец * Максимум(ВесовойКоэффициент)
", "Показатель"))

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

При работе с подобными «многоэтажными» конструкциями всегда помните о следующих моментах:

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

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

← На главную