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

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

При построении отчетов в Системе Компоновки Данных (СКД) часто возникает задача, когда формула для расчета ресурса в одной группировке должна использовать итог, рассчитанный для другой. Классический пример: в общем итоге по счету нужно использовать суммарный фонд оплаты труда (ФОТ), рассчитанный по каждому подразделению внутри этого счета. На первый взгляд, это кажется сложным, так как стандартные агрегатные функции вроде СУММА() работают в пределах своей текущей группировки.

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

Решение 1: Использование функций выражений СКД

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

Проанализируем ситуацию. Допустим, у нас есть отчет со структурой:

  1. Группировка по полю Счет.
  2. Вложенная группировка по полю Подразделение.

Нам нужно в итогах по Счету к какой-то сумме прибавить общую сумму ФОТ по всем подразделениям, входящим в этот счет. Прямая формула Сумма(Оборот) + Сумма(ФОТ) не сработает как надо, так как Сумма(ФОТ) будет просто общей суммой детальных записей, а не суммой итогов.

Правильная формула для ресурса на вкладке "Ресурсы" будет выглядеть так:

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

Разберем ее по шагам:

  1. ВычислитьВыражениеСГруппировкойМассив("Сумма(ФОТ)", "Подразделение"): Эта внутренняя часть — самое главное. Она говорит системе: "Для текущей родительской группировки (в нашем случае, для текущего Счета) найди все вложенные группировки с именем Подразделение. Для каждой из них вычисли выражение "Сумма(ФОТ)" и верни мне результаты в виде массива". Например, если в счете 26 есть "Бухгалтерия" с ФОТ 100 000 и "Администрация" с ФОТ 150 000, то функция вернет массив [100000, 150000].
  2. СУММА(...): Внешняя функция СУММА применяется уже к этому полученному массиву. Она просто суммирует все его элементы. В нашем примере СУММА([100000, 150000]) даст результат 250 000.

Таким образом, эта конструкция позволяет собрать итоги с дочерних группировок и агрегировать их на родительском уровне.

Важное отличие от ВычислитьВыражение()

Часто эту функцию путают с другой похожей — ВычислитьВыражение(). Важно понимать их разницу:

Для нашей задачи подходит именно второй вариант.

Решение 2: Подготовка данных в запросе

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

Идея метода:

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

Рассмотрим по шагам:

  1. Создаем вложенный запрос для расчета итогов.
    В конструкторе запроса создаем вложенный запрос или временную таблицу, которая будет считать сумму ФОТ по каждому подразделению.

    
    ВЫБРАТЬ
        ИсходныеДанные.Подразделение КАК Подразделение,
        СУММА(ИсходныеДанные.ФОТ) КАК ФОТПоПодразделению
    ИЗ
        РегистрНакопления.Начисления КАК ИсходныеДанные
    СГРУППИРОВАТЬ ПО
        ИсходныеДанные.Подразделение
    

    Этот запрос вернет нам таблицу вида: Подразделение | ФОТПоПодразделению.

  2. Присоединяем итоги к основному запросу.
    Теперь в основном запросе мы соединяем наши детальные данные с этой таблицей итогов по полю Подразделение.

    
    ВЫБРАТЬ
        ДетальныеДанные.Счет,
        ДетальныеДанные.Подразделение,
        ДетальныеДанные.СуммаОборот,
        ИтогиФОТ.ФОТПоПодразделению
    ИЗ
        РегистрНакопления.Начисления КАК ДетальныеДанные
            ЛЕВОЕ СОЕДИНЕНИЕ (
                ВЫБРАТЬ
                    ИсходныеДанные.Подразделение КАК Подразделение,
                    СУММА(ИсходныеДанные.ФОТ) КАК ФОТПоПодразделению
                ИЗ
                    РегистрНакопления.Начисления КАК ИсходныеДанные
                СГРУППИРОВАТЬ ПО
                    ИсходныеДанные.Подразделение
        ) КАК ИтогиФОТ
        ПО ДетальныеДанные.Подразделение = ИтогиФОТ.Подразделение
    
  3. Настраиваем ресурс в СКД.
    После выполнения такого запроса в наборе данных СКД появится новое поле ФОТПоПодразделению, которое для каждой строки будет содержать уже посчитанный итог по ее подразделению. Теперь формула для ресурса в СКД становится очень простой. Например, если нам нужно просто вывести этот итог, формула будет СУММА(РАЗЛИЧНЫЕ ФОТПоПодразделению), чтобы избежать задвоения сумм при группировке.

Преимущества этого подхода:

Выводы и рекомендации

Оба метода являются рабочими и имеют свои области применения.

Используйте выражения СКД (ВычислитьВыражениеСГруппировкойМассив), когда:

Используйте подготовку данных в запросе, когда:

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

← На главную