При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с необходимостью создания таблиц, где количество колонок заранее неизвестно и зависит от данных в информационной базе. Типичный пример — отчет по продажам за месяц, где колонками выступают дни или конкретные номенклатурные группы. Ситуация осложняется, когда стандартный вывод СКД не устраивает заказчика: например, ресурсы должны располагаться не в конце таблицы, а в строго определенных местах, или шапка отчета имеет сложную иерархическую структуру.
В данной статье мы подробно разберем, как заставить макет СКД «размножаться» по горизонтали, как управлять позиционированием ресурсов и какие хитрости позволяют добиться идеального визуального представления динамических данных.
Прежде чем переходить к рисованию макетов, проанализируем стандартные возможности СКД. Основной механизм для создания динамических колонок — это использование типа структуры «Таблица» в настройках компоновки данных. В такой таблице мы определяем группировки строк и группировки колонок.
Для реализации динамического расширения выполним следующие шаги:
Период или Склад).Номенклатура).Количество и Сумма.При таком подходе система автоматически создаст столько колонок, сколько уникальных значений содержится в поле группировки колонок. Однако здесь мы сталкиваемся с проблемой: ресурсы всегда выводятся в конце или дублируются для каждой колонки группировки в зависимости от настроек, и управлять их точным порядком без дополнительных манипуляций сложно.
Рассмотрим ситуацию, когда основная претензия к отчету — «ресурсы находятся не там, где нужно». Часто разработчики сразу бросаются рисовать макеты, хотя проблему можно решить штатными настройками «Прочих настроек» СКД. Выясним, как это сделать:
В настройках варианта отчета или конкретной группировки найдем параметр «Расположение ресурсов». У него есть несколько важных значений:
Чтобы ресурсы не «улетали» в конец, проанализируем настройку «Автопозиция ресурсов». Если установить ее в значение Не использовать, система позволит вам вручную определять порядок следования ресурсов в списке выбранных полей. Это критически важно, когда вы хотите перемежать обычные реквизиты и вычисляемые показатели в динамической таблице.
Если стандартных настроек недостаточно и требуется специфическое оформление (цвета, объединение ячеек в шапке, особые шрифты), мы переходим к созданию макетов. Разберем по шагам, как заставить область макета дублироваться вбок.
Шаг 1. Определение областей в макете
Переходим на закладку «Макеты». Для динамической колонки нам потребуется создать как минимум два типа макета:
При создании области в табличном документе (макете) крайне важно захватывать не просто ячейку, а именованную область, которая соответствует группировке. Чтобы колонка «размножалась» горизонтально, система должна понимать, что эта область относится к группировке колонок.
Шаг 2. Использование параметров
В ячейках макета необходимо использовать параметры. Например, если группировка идет по полю Месяц, то в ячейке заголовка мы пишем <p>Месяц</p> и в свойствах ячейки указываем, что это Параметр. Имя параметра должно в точности совпадать с именем поля в наборе данных.
Шаг 3. Связка макета с данными
При добавлении макета заголовка группировки в списке «Макеты» нужно выбрать конкретное поле группировки (например, Проект). После этого при генерации отчета СКД встретит эту настройку и начнет циклически выводить заданную область макета для каждого уникального значения проекта.
Иногда бизнес-логика требует, чтобы динамические колонки шли вперемешку с фиксированными. Проанализируем ситуацию: у нас есть колонка «Остаток», затем идут динамические колонки «Продажи по филиалам», а в конце — «Прогноз». Чтобы добиться этого в СКД, можно использовать метод искусственных полей в запросе.
Посмотрим на пример логики в запросе:
ВЫБРАТЬ
"1. Остаток" КАК ПолеСортировки,
Товары.Наименование КАК Аналитика,
Товары.Остаток КАК Значение
ИЗ
Справочник.Товары КАК Товары
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"2. Продажи: " + Филиалы.Наименование,
Продажи.Товар,
Продажи.Количество
ИЗ
РегистрНакопления.Продажи КАК Продажи
Затем в СКД мы делаем группировку колонок по полю ПолеСортировки. Таким образом, мы получаем единый динамический блок, где порядок элементов жестко задан префиксами или отдельным числовым полем сортировки. Это избавляет от необходимости рисовать сложный макет, так как вся структура управляется данными запроса.
В самых сложных случаях, когда макет все равно «едет» или требуется объединение ячеек в шапке над динамически созданными колонками, на помощь приходит программный вывод. Рассмотрим этот процесс.
Мы можем перехватить процесс вывода в модуле объекта отчета. Для этого используется ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент. Алгоритм выглядит следующим образом:
ПроцессорКомпоновки.Это позволяет «дотянуть» визуальную составляющую отчета до идеала, когда возможностей только лишь визуального конструктора макетов СКД становится недостаточно.
Важный нюанс: при использовании макетов для динамических колонок всегда проверяйте настройку «Тип макета». Для заголовков группировок, которые должны расширяться вбок, убедитесь, что вы не зафиксировали ширину колонок жестко, если это может помешать выводу большого количества данных. Правильное использование параметров и областей макета — залог того, что ваш отчет будет выглядеть профессионально и корректно отображать любую выборку данных.