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