При разработке отчетов в системе компоновки данных (СКД) на платформе 1С перед разработчиками часто возникает задача построения сложных кросс-таблиц. Типичный пример: в строках таблицы выводится Номенклатура, в колонках настроена двухуровневая группировка по периодам (например, Квартал и Месяц), а в качестве показателей используются три ресурса — Количество, Сумма и СредняяЦена. При этом бизнес-требования могут диктовать следующее условие: в детальных колонках по месяцам и кварталам нужно отображать только показатели Количество и Сумма, а показатель СредняяЦена должен рассчитываться и выводиться исключительно в секции общих итогов отчета.
По умолчанию СКД пытается спроецировать все выбранные ресурсы на все уровни группировок колонок. В результате в каждой колонке месяца резервируется место под третий ресурс, что сильно перегружает отчет визуально и делает его нечитаемым. Давайте подробно разберем, как решить эту задачу стандартными средствами СКД, не прибегая к «грязным» хакам и дублированию таблиц.
Самый простой и логичный способ управления видимостью ресурсов на разных уровнях таблицы — это индивидуальная настройка выбранных полей для каждой группировки. По умолчанию в группировках колонок стоит флаг Авто на вкладке Выбранные поля. Это означает, что группировка наследует все поля, выбранные на уровне всего отчета. Если мы отключим это наследование, то сможем жестко управлять составом колонок.
Давайте выполним настройку по шагам:
Месяц).Количество и Сумма. Третий ресурс (СредняяЦена) добавлять сюда не нужно.Квартал), если на этом уровне также требуется ограничить состав полей.Количество, Сумма и СредняяЦена.Важный нюанс: В некоторых версиях платформы 1С при использовании этого метода в детальных группировках колонок может оставаться пустое зарезервированное место под третий ресурс. В этом случае шапка таблицы выглядит правильно, но под ней отображается пустая колонка без данных. Если вы столкнулись с таким поведением системы компоновки, переходите к следующему методу.
Чтобы исключить даже потенциальную отрисовку пустых колонок в детальных периодах, мы можем явно указать системе компоновки, в каких именно разрезах и группировках имеет смысл рассчитывать каждый конкретный показатель. Это делается на уровне метаданных схемы СКД.
Давайте проанализируем настройку параметров расчета ресурсов:
СредняяЦена.Номенклатура и системное поле ОбщиеИтоги.Квартал, Месяц) выбирать в данном списке не нужно.Таким образом, СКД получит четкое указание: не рассчитывать значение ресурса СредняяЦена внутри периодов. В сочетании с отключением автополя на уровне группировок (Метод 1) это гарантирует, что лишние колонки не будут сгенерированы платформой.
Если структура кросс-таблицы сложная, стандартные общие итоги СКД могут работать не совсем так, как ожидает пользователь. Чтобы получить абсолютный контроль над внешним видом итоговой колонки, мы можем отказаться от стандартных общих итогов по колонкам и создать собственную независимую секцию итогов.
Рассмотрим этот алгоритм по шагам:
Расположение общих итогов по горизонтали и установим его в значение Нет.ИтогиВсего, а в колонке Выражение напишем строковую константу (обязательно в кавычках):
"Общие итоги"
Квартал) добавим новую группировку по созданному вычисляемому полю ИтогиВсего.Квартал -> Месяц), вторая — наша искусственная группировка ИтогиВсего.Количество и Сумма.ИтогиВсего также снимаем флаг Авто, но добавляем туда все три ресурса: Количество, Сумма и СредняяЦена.В результате мы получим визуально монолитную и красивую таблицу, где детальные данные по месяцам содержат только два показателя, а справа выводится отдельная секция общего итога со всеми тремя показателями.
В процессе обсуждения разработчики часто предлагают использовать альтернативные подходы, такие как условное оформление (УО) или создание индивидуальных макетов компоновки. Давайте выясним, почему эти варианты имеют существенные недостатки.
Проблема условного оформления (УО): С помощью условного оформления можно задать условие на уровень группировки и применить пустой формат текста для «ненужного» ресурса. Это скроет значения в ячейках, но физически колонка в кросс-таблице никуда не исчезнет. Пользователь увидит пустой столбец без данных с пустой шапкой. Попытка установить ширину колонки в 0 через УО в кросс-таблицах часто работает некорректно в зависимости от версии платформы и настроек авто-масштабирования табличного документа.
Недостатки индивидуальных макетов (Путь зла): Создание собственного макета оформления для группировок позволяет нарисовать шапку и структуру колонок любой сложности. Однако при этом полностью теряются ключевые преимущества СКД — интерактивность и гибкость. Если конечный пользователь захочет изменить группировку строк, добавить новые поля или сделать отбор, жестко заданный макет "поплывет", и отчет отобразится с критическими ошибками верстки. Поддерживать такой отчет в будущем станет крайне тяжело.
Если по каким-то причинам стандартные настройки схемы компоновки не позволяют добиться идеального результата (например, в очень специфических конфигурациях интерфейса), можно прибегнуть к программному удалению пустых колонок на этапе вывода отчета в табличный документ. Этот метод является абсолютно надежным, так как мы работаем уже с готовым результатом генерации отчета.
Для реализации этого метода переопределим процедуру ПриКомпоновкеРезультата в модуле объекта отчета:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Сформируем схему компоновки программно
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// После вывода отчета мы можем обойти области ячеек табличного документа
// и программно скрыть ненужные колонки, установив свойство Видимость в Ложь
УправлениеВидимостьюКолонок(ДокументРезультат);
КонецПроцедуры
В процедуре УправлениеВидимостьюКолонок мы анализируем имена областей или текст в шапке табличного документа. Если мы находим колонку нежелательного ресурса в периодической группировке, мы применяем к этой области свойство: Область.Видимость = Ложь. Данный метод сохраняет всю динамику СКД и гарантирует безупречный внешний вид финального отчета.
Подводя итог, можно сказать, что лучшей практикой является использование Метода 1 в сочетании с Методом 2, так как они полностью опираются на штатный декларативный подход СКД и не требуют написания сложного программного кода.