Как вывести разное количество ресурсов для разных группировок в СКД и убрать пустые строки

Программист 1С v8.3 (Обычные формы) Налоговый учет
← На главную

При разработке сложных отчетов в системе компоновки данных (СКД) часто возникает задача вывести неодинаковое количество колонок (ресурсов) для разных уровней иерархии. Например, на верхнем уровне нам нужно видеть только один показатель «Налоговая нагрузка», а на более детальных уровнях — два показателя: «Начисленные налоги» и «Уплаченные налоги». Если просто добавить все ресурсы в отчет, они будут дублироваться во всех строках, создавая визуальный шум. Если же использовать две разные таблицы в одной схеме, между ними часто образуется пустая строка («дыра»), которую сложно убрать стандартными средствами.

В этой статье мы подробно разберем, как решить эту задачу несколькими способами: от чистой настройки СКД до программной обработки результирующего табличного документа.

Способ 1. Индивидуальная настройка «Выбранных полей» для группировок

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

Проанализируем шаги для реализации этого метода:

  1. Откроем настройки схемы компоновки данных на закладке Настройки.
  2. В дереве настроек слева выберем конкретную группировку (например, «Налоговая нагрузка»).
  3. Перейдем на закладку Выбранные поля в нижней части окна.
  4. Снимем флажок Использовать настройки вышестоящей группировки (он же флаг «Авто»).
  5. Теперь мы можем вручную определить состав полей для этого уровня. Удалим лишние ресурсы и оставим только один необходимый.
  6. Повторим процедуру для следующей вложенной группировки («Наименование показателя»), указав для нее свои два ресурса.

Преимущество этого метода в том, что отчет строится как единая таблица. Система сама поймет, где нужно объединить ячейки или скрыть лишние колонки, и никакой «дыры» между данными не возникнет.

Способ 2. Использование индивидуальных макетов группировок

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

Разберем, как это работает:

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

Способ 3. Условное оформление для «скрытия» ресурсов

Иногда проще добавить все ресурсы во все группировки, но визуально скрыть их там, где они не нужны. Рассмотрим этот вариант подробнее:

  1. В общих настройках отчета добавим все три ресурса.
  2. Перейдем на закладку Условное оформление.
  3. Добавим новое правило. В условии укажем проверку на уровень группировки или наличие значения в поле группировки.
  4. В оформлении установим параметр Текст как пустую строку или зададим Минимальная ширина равную 0.

Важно помнить, что установка ширины в 0 не всегда полностью удаляет колонку в ТабличныйДокумент, но в сочетании с очисткой текста это позволяет сделать лишние данные невидимыми для пользователя.

Способ 4. Программное удаление «дыры» в табличном документе

Если вы уже реализовали отчет в виде двух отдельных кросс-таблиц и столкнулись с пустой строкой между ними, ее можно удалить программно после формирования отчета. Проанализируем ситуацию: стандартный метод ПроцессорВывода.Вывести() при последовательном выводе двух таблиц добавляет разделитель. Чтобы его убрать, нужно найти пустую строку и удалить её.

Пример кода для удаления такой строки:


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

// Ищем ячейку-маркер, которая гарантированно находится в начале второй таблицы
НайденнаяОбласть = ТабДок.НайтиТекст("Наименование показателя");
Если НайденнаяОбласть <> Неопределено Тогда
    // Номер строки, где начинается вторая таблица
    НомерСтроки = НайденнаяОбласть.Верх;
    // Удаляем пустую строку перед ней (дыру)
    Если НомерСтроки > 1 Тогда
        ТабДок.УдалитьОбласть(ТабДок.Область(НомерСтроки - 1, , НомерСтроки - 1, ), ТипСмещенияТабличногоДокумента.ПоВертикали);
    КонецЕсли;
КонецЕсли;

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

Способ 5. Объединение данных на уровне запроса (UNION)

Выясним причину, почему нам приходится мучиться с настройками СКД. Часто это происходит из-за разной структуры данных. Мы можем привести данные к единому виду еще в запросе, используя конструкцию ОБЪЕДИНИТЬ ВСЕ.

Посмотрим на пример логики запроса:


ВЫБРАТЬ
    "Группировка1" КАК ТипДанных,
    Нагрузка КАК Показатель1,
    0 КАК Показатель2
ИЗ
    Источник1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Группировка2",
    Начисленные,
    Уплаченные
ИЗ
    Источник2

В этом случае в СКД у нас всегда будет два ресурса (Показатель1 и Показатель2). Для первой группировки во второй колонке всегда будет ноль или NULL. С помощью условного оформления мы можем просто скрыть нулевые значения, и визуально это будет выглядеть как одна колонка для первой группы и две колонки для второй.

Резюме

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

← На главную