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