Как вывести несколько показателей в одной ячейке (сетку 5x4) в отчете СКД

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

В разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача компактного размещения большого количества данных. Одной из наиболее сложных задач является вывод "клеточки-единицы" в кросс-таблице, которая должна содержать не один ресурс, а целую сетку показателей (например, 5 колонок и 4 строки — всего 20 значений) на пересечении конкретного контрагента и периода. Рассмотрим подробнее, какими методами можно реализовать такую "хитрую" структуру, сохранив при этом гибкость и возможности СКД.

Метод 1. Использование макетов оформления ресурсов

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

  1. Перейдем на вкладку Макеты в схеме компоновки данных.
  2. Добавим новый Макет поля или Макет группировки. Для кросс-таблицы эффективнее всего использовать макет для конкретного ресурса или комбинации группировок.
  3. В появившемся редакторе табличного документа нарисуем область размером 5x4 ячейки.
  4. Каждой ячейке внутри этой области присвоим параметр (например, Показатель1, Показатель2 и так далее).
  5. В таблице параметров макета (ниже области рисования) укажем соответствие каждого параметра конкретному полю из набора данных или ресурсу.

Важный нюанс: чтобы сетка не "разъезжалась" при отсутствии данных в некоторых периодах, для ячеек в макете следует жестко задать ширину и высоту в свойствах табличного документа. Это позволит сохранить форму 5x4 даже для пустых значений.

Метод 2. Вложенные группировки в «Выбранных полях»

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

  1. В настройках отчета на закладке Выбранные поля создадим структуру из групп. Для сетки 5x4 нам потребуется 4 основные группы (строки), внутри каждой из которых будет еще по 5 полей (колонки).
  2. Для основных групп установим свойство Расположение — Вертикально.
  3. Для вложенных групп (внутри каждой строки) установим Расположение — Горизонтально.
  4. Чтобы убрать названия групп, о которых упоминал автор темы, необходимо в свойствах каждой группы очистить поле Заголовок.
  5. Дополнительно в настройках самой группировки (или всего отчета) на вкладке Другие настройки установим параметр Расположение заголовков полей в значение Нет.

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

Метод 3. Формирование форматированной строки или HTML

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

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


// В схеме компоновки данных (выражение поля)
МойОбщийМодуль.СформироватьСеткуПоказателей(Поле1, Поле2, ..., Поле20)

В самом модуле мы можем подготовить строку с разделителями:


Функция СформироватьСеткуПоказателей(П1, П2, П3, П4, П5, ...) Экспорт
    // Формируем строки по 5 показателей через пробелы или табуляцию
    Строка1 = Строка(П1) + " | " + Строка(П2) + ...; 
    // Используем символы переноса строки Символы.ПС
    Результат = Строка1 + Символы.ПС + Строка2 + ...;
    Возвращает Результат;
КонецФункции

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

Метод 4. Ресурс типа «ТаблицаЗначений»

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

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

Метод 5. Постобработка табличного документа

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


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

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

Резюме

Для реализации сетки 5x4 в одной ячейке мы рекомендуем сначала попробовать Метод 1 (Макеты оформления), так как он сохраняет все преимущества СКД (расшифровку, фильтрацию). Если же задача разовая и визуальная составляющая важнее структуры данных, Метод 2 (Группировки без заголовков) поможет добиться цели без написания программного кода.

← На главную