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