Как вывести разное количество колонок-ресурсов в периодических группировках и общих итогах таблицы СКД?

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

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

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

Метод 1. Настройка состава «Выбранных полей» на уровне конкретных группировок колонок

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

Давайте выполним настройку по шагам:

  1. Откроем схему компоновки данных и перейдем на вкладку Настройки.
  2. В структуре настроек найдем нашу таблицу. В ветке Колонки выделим группировку детального уровня (например, Месяц).
  3. В нижней части окна перейдем на вкладку Выбранные поля текущей группировки.
  4. Снимем флажок с элемента Авто. После этого список полей станет доступен для редактирования.
  5. Перетащим из левого списка (доступные поля) только те ресурсы, которые должны отображаться на уровне месяца — Количество и Сумма. Третий ресурс (СредняяЦена) добавлять сюда не нужно.
  6. Повторим процедуру для вышестоящей группировки колонок (например, Квартал), если на этом уровне также требуется ограничить состав полей.
  7. На уровне всей таблицы или в глобальных настройках отчета на вкладке Выбранные поля оставим выбранными все три ресурса: Количество, Сумма и СредняяЦена.

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

Метод 2. Тонкая настройка расчета ресурсов («Рассчитывать по...»)

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

Давайте проанализируем настройку параметров расчета ресурсов:

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

Таким образом, СКД получит четкое указание: не рассчитывать значение ресурса СредняяЦена внутри периодов. В сочетании с отключением автополя на уровне группировок (Метод 1) это гарантирует, что лишние колонки не будут сгенерированы платформой.

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

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

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

  1. В настройках отчета выберем таблицу и перейдем в ее Другие настройки. Нам нужно отключить стандартный вывод итогов по колонкам. Для этого найдем параметр Расположение общих итогов по горизонтали и установим его в значение Нет.
  2. Теперь нам необходимо создать виртуальную колонку для итогов. Перейдем на вкладку Вычисляемые поля нашей схемы компоновки.
  3. Добавим новое вычисляемое поле. Зададим ему имя ИтогиВсего, а в колонке Выражение напишем строковую константу (обязательно в кавычках):

"Общие итоги"

  1. Вернемся на вкладку Настройки к структуре нашей таблицы.
  2. В ветке Колонки параллельно нашей основной иерархии периодов (на том же уровне, что и группировка Квартал) добавим новую группировку по созданному вычисляемому полю ИтогиВсего.
  3. Теперь у нас в колонках таблицы находятся две независимые параллельные ветки: первая — это реальные периоды (Квартал -> Месяц), вторая — наша искусственная группировка ИтогиВсего.
  4. Настроим выбранные поля для каждой ветки:
    • Для группировки периодов снимаем флаг Авто и добавляем только два ресурса: Количество и Сумма.
    • Для группировки ИтогиВсего также снимаем флаг Авто, но добавляем туда все три ресурса: Количество, Сумма и СредняяЦена.

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

Почему условное оформление и макеты — не всегда оптимальный выбор?

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

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

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

Метод 4. Программная корректировка отчета при выводе

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

Для реализации этого метода переопределим процедуру ПриКомпоновкеРезультата в модуле объекта отчета:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Сформируем схему компоновки программно
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // После вывода отчета мы можем обойти области ячеек табличного документа
    // и программно скрыть ненужные колонки, установив свойство Видимость в Ложь
    УправлениеВидимостьюКолонок(ДокументРезультат);
    
КонецПроцедуры

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

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

← На главную