Как в СКД добавить в конец отчета динамические колонки к статическим ресурсам?

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

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

Анализ проблемы и архитектурный подход

Если проектировать отчет как обычный список группировок строк, все выбранные поля выводятся в виде фиксированных вертикальных столбцов. Добавление группировки по аналитике внутрь списка просто развернет строки вниз, но не добавит новые столбцы вправо.

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

Рассмотрим пошаговую настройку схемы компоновки данных для решения этой задачи.

Шаг 1. Подготовка набора данных и ресурсов

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

На вкладке Ресурсы схемы компоновки данных обязательно объявляем все числовые поля:

  1. Для основных показателей (статических ресурсов) задаем стандартные агрегатные функции, например Сумма(Количество), Сумма(Выручка) и т.д. В колонке Рассчитывать по... при необходимости можно явно ограничить их расчет только группировками строк.
  2. Для динамического ресурса задаем выражение Сумма(СуммаЗатрат). Этот показатель будет рассчитываться как по строкам, так и по колонкам аналитики.

Шаг 2. Построение структуры отчета типа «Таблица»

Перейдем на вкладку Настройки. Удалим корневую группировку Отчет и добавим элемент структуры Таблица. Настроим строки и колонки следующим образом:

  1. В секцию Строки таблицы добавляем нужные вертикальные группировки (например, Подразделение, Номенклатура или детальные записи).
  2. На уровне самой Таблицы полностью очищаем список на вкладке Выбранные поля. Это критически важное действие: если оставить ресурсы на корневом уровне таблицы, СКД продублирует каждый ресурс внутри каждой динамической колонки.
  3. В секцию Колонки таблицы добавляем две параллельные группировки одного уровня.

Разберем подробнее создание этих двух группировок колонок:

  1. Первая группировка колонок (фиксированные показатели): создаем группировку колонок, но поле группировки оставляем пустым (не указываем ни одного поля). Переходим на её локальную вкладку Выбранные поля (с отключенным автопозиционированием) и добавляем сюда все наши 10–15 статических ресурсов. Так как поле группировки не задано, СКД сформирует один постоянный блок колонок.
  2. Вторая группировка колонок (динамические статьи): создаем рядом на том же уровне еще одну группировку колонок и в качестве поля выбираем СтатьяЗатрат. Переходим на её вкладку Выбранные поля и добавляем туда исключительно поле СуммаЗатрат.

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

Шаг 3. Исключение пустых колонок

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

  1. Фильтрация на уровне запроса: в тексте запроса набора данных накладываем условие отбора на регистр, исключая нулевые движения (ГДЕ СуммаЗатрат <> 0), чтобы пустые ссылки вообще не попадали в выборку СКД.
  2. Отбор на уровне группировки: в настройках второй группировки колонок (СтатьяЗатрат) переходим на вкладку Отбор и задаем условие: СуммаЗатрат Заполнено с применением условия После группировки или для иерархии. В этом случае пустые колонки, по которым нет суммовых показателей, отрисовываться не будут.

Шаг 4. Настройка общих итогов по горизонтали

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

Чтобы скорректировать отображение итогов:

  1. Выделяем первую группировку колонок (со статическими ресурсами) и на вкладке Другие настройки находим параметр Расположение общих итогов по горизонтали. Устанавливаем значение Нет.
  2. При необходимости горизонтальный итог можно оставить включенным только для динамической ветки СтатьяЗатрат на уровне самой таблицы или конкретной группировки.

Альтернативный вариант: программная компоновка

В специфических задачах, когда состав динамических колонок требуется жестко зафиксировать по особому алгоритму еще до выполнения компоновки, можно применить программную модификацию настроек в модуле отчета:


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

Тем не менее, в большинстве типовых сценариев достаточно штатного функционала таблицы СКД с разделением выбранных полей по независимым веткам колонок.

← На главную