Как в СКД вывести общий итог (план месяца) в каждой строке группировки без привязки к измерениям?

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

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

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

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

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

Рассмотрим алгоритм настройки:

  1. Перейдем на вкладку Вычисляемые поля в схеме компоновки данных.
  2. Добавим новое поле, например, ПланОтделаОбщий.
  3. В колонке «Выражение» напишем следующую конструкцию: ВычислитьВыражение("Сумма(ПолеПлана)", "ОбщийИтог")
  4. В данном случае ключевое слово "ОбщийИтог" указывает системе, что суммирование должно произойти по всему набору данных, игнорируя то, что мы сейчас находимся в строке конкретного контрагента.

Проанализируем ситуацию: если нам нужно получить итог не по всему отчету, а, скажем, по конкретному подразделению, в которое входят менеджеры, мы можем использовать третий параметр — "Группировка". Это позволит «заморозить» значение плана на уровне отдела и дублировать его в каждой строке сотрудника этого отдела.

Метод 2: Работа с несколькими наборами данных и связями

Иногда плановые показатели и фактические остатки приходят из разных источников (например, разные регистры или даже внешние данные). В этом случае мы используем два набора данных: НаборДанныхФакт и НаборДанныхПлан. Проблема часто заключается в неправильной настройке связей.

Выясним причину ошибки, когда данные «пропадают» или суммируются некорректно. Если мы свяжем наборы по полям Подразделение и Менеджер, то план будет выводиться только там, где менеджер указан в обоих наборах. Если в наборе с планом менеджеров нет (план общий на отдел), то при связи по менеджеру значения обнулятся.

Разберем правильную настройку связи по шагам:

  1. Вкладка Связи наборов данных.
  2. Источник связи: НаборДанныхФакт, Приемник: НаборДанныхПлан.
  3. Условие связи: указываем только Период (Месяц) и Подразделение. Важно: поле Менеджер в связях указывать НЕЛЬЗЯ, так как план от него не зависит.
  4. В настройках ресурсов для поля План в колонке «Рассчитывать по...» нужно оставить пустое место или указать только те группировки, где этот план имеет смысл (например, только общий итог или группировка по месяцу).

Посмотрим на пример выражения в ресурсах для такого случая:


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

Метод 3: Настройка ресурсов "Рассчитывать по..."

Этот метод часто упоминается на форумах, но его нужно применять с осторожностью. Рассмотрим подробнее, как работают флажки на вкладке Ресурсы. Когда мы добавляем поле в ресурсы, система по умолчанию ставит галочки во всех группировках.

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

  1. Найдем поле План в списке ресурсов.
  2. В колонке «Рассчитывать по...» нажмем на кнопку выбора.
  3. Снимем флажки с детальных полей (Контрагент, Заказ).
  4. Оставим флажки только на Подразделение, Месяц и ОбщийИтог.

Важный нюанс: этот метод сам по себе не заставит число «приклеиться» к каждой строке менеджера. Он лишь уберет расчет там, где он не нужен. Чтобы значение отображалось в детальных строках, его все равно придется комбинировать с функцией ВычислитьВыражение.

Метод 4: Использование агрегатов и макетов оформления

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

Для этого выполним следующие действия:

  1. На вкладке Макеты добавим новый макет группировки.
  2. Выберем тип макета (например, Заголовок или Область данных).
  3. В ячейках макета мы можем жестко прописать параметры.
  4. Свяжем параметр ячейки с полем, которое содержит наш «независимый» итог.

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

Резюме и практические советы

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

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

Рассмотрим еще один пример кода для выражения ресурса, который часто спасает в таких ситуациях:


Выбор Когда ЕстьNULL(Сумма(План), 0) = 0 
Тогда ВычислитьВыражение("Сумма(План)", , "ОбщийИтог") 
Иначе Сумма(План) 
Конец
Этот код проверяет: если в текущей группировке данных по плану нет, мы принудительно берем значение из общего итога. Это позволяет заполнять «пустоты» в отчете данными верхнего уровня.

← На главную