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