Как убрать пустой столбец в отчете СКД после отключения итогов?

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

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

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

Выясняем причину: почему СКД выводит пустую колонку?

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

Также пустая колонка часто появляется при группировке по измерению, которое содержит пустые значения (например, NULL, пустая ссылка или неопределенное значение). В этом случае СКД честно создает отдельную колонку для пустой группировки, выводя в заголовке системное представление вроде <...> или оставляя его пустым.

Рассмотрим пошагово, как решить эту проблему различными методами.

Метод 1. Скрытие колонки через «Условное оформление» (Визуальное схлопывание)

Этот метод является наиболее простым и быстрым в реализации. Он отлично подходит, когда нам нужно скрыть конкретную колонку (ресурс или реквизит) при определенных условиях или безусловно, не ломая при этом общую структуру запроса и компоновки. Именно к этому решению пришел автор темы.

Разберем по шагам, как настроить визуальное скрытие колонки:

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

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

Метод 2. Отбор на уровне группировок (Борьба с колонкой «Не указано»)

Если пустая колонка генерируется из-за того, что в группировку колонок попадают пустые значения (например, товары без указания склада или контрагенты без региона), то использование условного оформления — не лучший путь. Правильнее исключить пустую ветку группировки еще на этапе формирования структуры отчета.

Проанализируем этот сценарий и решим задачу через настройки группировки:

  1. В структуре настроек нашего отчета найдем строку, отвечающую за группировку колонок (например, группировка по полю Склад). Важно выбрать именно эту конкретную группировку, а не весь отчет в целом.
  2. В нижней части экрана перейдем на вкладку «Отбор» (это будет локальный отбор для данной группировки).
  3. Добавим новое условие: выберем поле нашей группировки (например, Склад) и установим вид сравнения «Заполнено». Это отсечет создание колонки под пустые значения.
  4. Чтобы информация об этом техническом фильтре не выводилась пользователю в шапке отчета и не загромождала форму, перейдем на вкладку «Другие настройки» для этой группировки и установим параметр «Выводить отбор» в значение «Не выводить».

Метод 3. Отключение пустых колонок через настройки общих итогов

Если пустой столбец выводится в самом конце таблицы на месте ресурсов, это напрямую связано с настройками вывода итоговых данных. Посмотрим, как корректно управлять выводом общих итогов.

Перейдем в настройки структуры отчета на уровень всей таблицы и откроем вкладку «Другие настройки». Найдем параметры:

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

Метод 4. Программное управление видимостью колонок

Бывают ситуации, когда интерактивных настроек недостаточно. Например, видимость колонки должна зависеть от прав текущего пользователя, функциональных опций системы или сложных бизнес-алгоритмов. В этом случае мы можем применить встроенный язык 1С.

Рассмотрим два основных программных подхода.

Вариант А. Управление доступностью поля в компоновщике настроек

Этот способ является наиболее «чистым», так как мы управляем выводом поля еще до момента генерации макета. Мы программно находим выбранное поле в компоновщике настроек и отключаем его использование. Напишем код в модуле отчета, в событии ПриКомпоновкеРезультата:


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

Вариант Б. Постобработка результирующего табличного документа

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

Рассмотрим пример кода постобработки:


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

Резюме и рекомендации

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

← На главную