Как в СКД вывести в общий итог разность между группировками

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

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

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

Выясним причину поведения СКД и варианты решения

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

Для решения задачи подходят следующие методы:

  1. Разделение расчета ресурса по уровням группировки (колонка Рассчитывать по... на вкладке Ресурсы) с применением функции ВычислитьВыражение или ВычислитьВыражениеСГруппировкойМассив.
  2. Учет знака операции прямо в тексте запроса или условным вычислением в ресурсе.
  3. Использование собственных макетов оформления на вкладке Макеты.

Способ 1. Настройка ресурса с указанием границы «Рассчитывать по...»

Разберем по шагам наиболее универсальный вариант настройки на вкладке Ресурсы схемы компоновки данных.

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

  1. Перейдем на вкладку Ресурсы.
  2. Добавим первую строку для ресурса Сумма:

    В колонке Выражение укажем обычную формулу:

    Сумма(Сумма)

    В колонке Рассчитывать по... выберем конкретные дочерние группировки (например, группировку по виду операции или организации).

  3. Добавим вторую строку для этого же ресурса Сумма:

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

    Пример выражения для общего итога с использованием функции ВычислитьВыражениеСГруппировкойМассив:

    
    ЕСТЬNULL(Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(Сумма)", "ВидДвижения", "ВидДвижения = ""Поступление""")), 0) - ЕСТЬNULL(Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(Сумма)", "ВидДвижения", "ВидДвижения = ""Выплата""")), 0)
    

    В колонке Рассчитывать по... укажем значение ОбщийИтог.

Важно: Всегда обворачивайте слагаемые в функцию ЕСТЬNULL(..., 0). Если за выбранный период данные по одной из группировок отсутствуют (например, не было выплат), выражение без проверки вернет NULL, и в итоговой ячейке отобразится пустое поле.

Способ 2. Учет знака выплат на уровне запроса

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

В тексте запроса для записей выплат задается отрицательный знак суммы:


ВЫБРАТЬ
    "Поступление" КАК ВидДвижения,
    Поступления.Сумма КАК Сумма
ИЗ
    РегистрНакопления.ПоступленияДС КАК Поступления

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Выплата" КАК ВидДвижения,
    -Выплаты.Сумма КАК Сумма
ИЗ
    РегистрНакопления.ВыплатыДС КАК Выплаты

В этом случае на вкладке Ресурсы достаточно стандартной формулы Сумма(Сумма) для всех уровней. В подчиненных группировках сумма выплат выведется со знаком минус (или модуль суммы можно оформить через формат/условное оформление), а в строке ОбщийИтог платформа автоматически рассчитает верную разность.

Способ 3. Использование условных сумм в ресурсах

Если изменять знак в запросе неудобно, можно прописать логику условного суммирования непосредственно в формуле ресурса на вкладке Ресурсы:

Сумма(ВЫБОР КОГДА ВидДвижения = "Поступление" ТОГДА Сумма ИНАЧЕ -Сумма КОНЕЦ)

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

Способ 4. Оформление через произвольный макет

Посмотрим на альтернативный вариант — создание собственного макета оформления на вкладке Макеты:

  1. Перейдем на вкладку Макеты и добавим Макет поля или Макет группировки для общего итога.
  2. Укажем область ячеек и зададим параметр, в который выводится итоговое значение.
  3. В свойствах параметра укажем выражение для расчета требуемой разницы.

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

← На главную