Как в СКД построить кросс-отчет с разным составом единиц измерения и показателей по строкам?

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

При разработке сложных аналитических отчетов в 1С часто возникает задача сформировать кросс-таблицу, в которой колонками выступают динамические аналитики (например, подразделения или склады), а по строкам выводятся различные разнородные показатели. Типичная сложность заключается в том, что для одних строк требуется отображать сразу два ресурса (например, количество в штуках и вес в килограммах), а для других строк — только один показатель (например, только штуки или только вес).

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

Способ 1. Настройка структуры строк с индивидуальным составом выбранных полей

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

Разберем процесс настройки по шагам:

  1. В схеме компоновки данных на вкладке Настройки добавим элемент структуры Таблица.
  2. В группировку колонок таблицы добавим поле Подразделение.
  3. В группировку строк таблицы добавим несколько вложенных группировок без указания полей группировки (детальные записи) либо с отбором по конкретному виду показателя или раздела.
  4. Для каждой созданной строки перейдем на вкладку Выбранные поля в нижней панели настроек текущего элемента структуры, снимем флаг Автополе и вручную выберем только те ресурсы, которые должны выводиться в данной строке:
    • Для строк начального и конечного остатка выбираем ресурсы Количество и Вес;
    • Для строк оборотов по спецодежде или ветеринарным препаратам выбираем только ресурс Количество.
  5. В параметрах вывода структуры таблицы установим свойство Расположение ресурсов в значение Вертикально или В строках, чтобы исключить раздувание колонок шапки по горизонтали.

Способ 2. Использование пользовательских макетов СКД

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

Разберем, как переопределить оформление областей:

  1. Перейдем на вкладку Макеты в схеме компоновки данных.
  2. Добавим Макет группировки для строк, где состав колонок отличается от типового.
  3. Добавим Макет области данных для ячеек пересечения конкретной строки и колонки Подразделение. В макете объединим смежные ячейки для тех показателей, где выводится только одна единица измерения, настроим границы и форматы чисел.
  4. Для заголовков ресурсов определим Макет поля, что позволит скрыть ненужные системные наименования полей и оставить компактный вид колонок.

Способ 3. Формирование составного поля в запросе или вычисляемых полях

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

Посмотрим на пример вычисляемого выражения или конструкции языка запросов:


ВЫБОР
    КОГДА Раздел = "Остатки" ТОГДА
        Строка(Количество) + " шт. / " + Строка(Вес) + " кг"
    КОГДА Раздел = "Препараты" ТОГДА
        Строка(Количество) + " шт."
    ИНАЧЕ
        Строка(Вес) + " кг"
КОНЕЦ

При таком подходе в ресурсы кросс-таблицы выводится всего одно результирующее поле. Это гарантирует идеальную регулярность кросс-сетки по подразделениям независимо от количества разнородных единиц измерения.

Способ 4. Программный вывод через процессор компоновки данных

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

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

Посмотрим на типовой фрагмент программной компоновки данных в коллекцию:


СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ТаблицаРезультат = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

← На главную