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