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