При разработке отчетов на системе компоновки данных (СКД) разработчики часто сталкиваются с комбинированной задачей: необходимо вывести стандартный список показателей (10–15 статических ресурсов), а в конце таблицы добавить динамически разворачивающийся набор колонок в разрезе определенного справочника (например, СтатьиЗатрат), количество элементов которого заранее неизвестно. Разберем, как правильно реализовать такую структуру в СКД без сложного программного кода и лишних пустых колонок.
Если проектировать отчет как обычный список группировок строк, все выбранные поля выводятся в виде фиксированных вертикальных столбцов. Добавление группировки по аналитике внутрь списка просто развернет строки вниз, но не добавит новые столбцы вправо.
Для того чтобы колонки формировались горизонтально и динамически зависели от присутствующих в базе данных значений, необходимо перевести структуру отчета в тип Таблица. Главная сложность заключается в том, чтобы заставить СКД не дублировать статические ресурсы внутри каждой динамической колонки, а вывести сначала блок фиксированных показателей, и только затем развернуть статьи затрат.
Рассмотрим пошаговую настройку схемы компоновки данных для решения этой задачи.
Проанализируем требования к исходным данным. Запрос отчета должен выбирать как основные числовые показатели строк, так и поле аналитики (СтатьяЗатрат), а также сумму, относящуюся к этой статье.
На вкладке Ресурсы схемы компоновки данных обязательно объявляем все числовые поля:
Сумма(Количество), Сумма(Выручка) и т.д. В колонке Рассчитывать по... при необходимости можно явно ограничить их расчет только группировками строк.Сумма(СуммаЗатрат). Этот показатель будет рассчитываться как по строкам, так и по колонкам аналитики.Перейдем на вкладку Настройки. Удалим корневую группировку Отчет и добавим элемент структуры Таблица. Настроим строки и колонки следующим образом:
Подразделение, Номенклатура или детальные записи).Разберем подробнее создание этих двух группировок колонок:
СтатьяЗатрат. Переходим на её вкладку Выбранные поля и добавляем туда исключительно поле СуммаЗатрат.В результате СКД сформирует отчет, где слева будут выведены строки, затем блок фиксированных колонок, а справа от них развернется столько колонок со статьями затрат, сколько записей вернет запрос.
Если в системе заведены десятки статей затрат, но по конкретным строкам отчета движения были лишь по нескольким из них, пустые колонки могут загромождать отчет. Избавимся от них следующими приемами:
ГДЕ СуммаЗатрат <> 0), чтобы пустые ссылки вообще не попадали в выборку СКД.СтатьяЗатрат) переходим на вкладку Отбор и задаем условие: СуммаЗатрат Заполнено с применением условия После группировки или для иерархии. В этом случае пустые колонки, по которым нет суммовых показателей, отрисовываться не будут.По умолчанию СКД при структуре «Таблица» пытается вывести общий итог по горизонтали для всей строки, складывая показатели колонок. Для статических разнородных ресурсов (например, количество, цена, процент) горизонтальный итог не имеет смысла.
Чтобы скорректировать отображение итогов:
Нет.СтатьяЗатрат на уровне самой таблицы или конкретной группировки.В специфических задачах, когда состав динамических колонок требуется жестко зафиксировать по особому алгоритму еще до выполнения компоновки, можно применить программную модификацию настроек в модуле отчета:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Программное заполнение или модификация структуры группировок
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Тем не менее, в большинстве типовых сценариев достаточно штатного функционала таблицы СКД с разделением выбранных полей по независимым веткам колонок.