Как в СКД вывести динамические колонки (периоды) между обычными аналитическими полями?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Торговля и дистрибуция
← На главную

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

В этой статье мы подробно разберем, как добиться такого расположения колонок, используя стандартные механизмы настройки структуры СКД, работу с группировками и макетами оформления.

Метод 1. Использование нескольких группировок в колонках таблицы

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

Рассмотрим пошагово, как настроить такую структуру:

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

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

Метод 2. Настройка автопозиции ресурсов

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

Посмотрим на закладку Другие настройки. Там есть параметр Автопозиция ресурсов. По умолчанию он установлен в значение "После всех полей". Если мы выберем "Не использовать", СКД позволит нам вручную управлять местом ресурса в списке выбранных полей.

Однако стоит учитывать нюанс: в режиме "Таблица" (кросс-таблица) ресурсы жестко привязаны к пересечению строк и колонок. Если вы используете тип отчета "Список", то после отключения автопозиции вы сможете просто расставить поля в нужном порядке:


Выбранные поля:
1. Артикул
2. Номенклатура
3. КоличествоОборот (Ресурс)
4. Марка
5. КодДляПоиска

Если же необходим именно табличный вид с динамическими периодами, вернитесь к Методу 1.

Метод 3. Использование дополнительных полей группировки

Выясним, как можно использовать механизм дополнительных полей для решения нашей задачи. В настройках группировки строк (например, по Номенклатура) есть закладка Дополнительные поля.

  1. Добавим туда Артикул и КодДляПоиска.
  2. Установим свойство Расположение в значение "Отдельно". Эти поля появятся слева от ресурсов.
  3. Для полей, которые должны быть справа (Марка, ВидНоменклатуры), создадим отдельную группировку колонок, как описано в первом методе.

Таким образом, мы "зажимаем" динамические колонки между основными полями группировки строк и искусственной группировкой колонок.

Метод 4. Создание пользовательского макета заголовка

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

Разберем алгоритм создания макета:

  1. На закладке Макеты добавим Макет заголовка группировки или Макет области.
  2. Нарисуем в табличном документе нужную структуру шапки. Например: первая ячейка — "Товар", вторая — "Артикул", затем область для параметра ПериодМесяц, и далее ячейки "Марка" и "Вид".
  3. Для ячейки, где будет выводиться период, укажем тип заполнения "Параметр" и свяжем её с полем периода. В свойствах макета укажем, что эта область является заголовком для соответствующей группировки.
  4. Для ресурсов на пересечении также можно создать свой Макет ресурса, чтобы точно позиционировать его относительно созданной шапки.

Этот метод требует больше времени на реализацию, но он гарантирует, что колонки не "разъедутся" при изменении состава данных.

Метод 5. Программное управление компоновкой

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

Рассмотрим пример кода, который позволяет подготовить процессор вывода:


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

Проанализируем этот подход: после выполнения ПроцессорВывода.Вывести() мы получаем готовый ТабличныйДокумент. Мы можем программно найти области с дополнительной аналитикой и переместить их (копировать/вставить колонки) в нужное нам место. Однако старайтесь избегать этого метода, если задачу можно решить через Метод 1 или Метод 4, так как программная манипуляция ячейками замедляет работу отчета.

Резюме

Для реализации вывода группировок между колонками в СКД наиболее эффективным является комбинированный подход:

Соблюдение этих правил позволит вам создавать профессиональные и удобные для пользователя отчеты со сложной топологией данных.

← На главную