Как скрыть пустые колонки ресурсов в группировках кросс-таблицы СКД?

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

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

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

Причина поведения СКД

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

Способ 1. Условное оформление ширины колонок

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

Разберем по шагам настройку схемы компоновки данных:

  1. Перейдем на вкладку Настройки в схеме компоновки данных.
  2. Выберем группировку колонок по складу (или конкретное поле ресурса) и перейдем на вкладку Условное оформление.
  3. Добавим новое условие оформления. В поле Условие зададим проверку на равенство нулю или незаполненность ресурса, например: ВПути Равно 0 или ВПути Не заполнено.
  4. В списке оформляемых полей укажем нужный ресурс (например, ВПути).
  5. В параметрах оформления включим свойства Минимальная ширина и Максимальная ширина, установив им значение 0.1. Также можно отключить видимость текста (свойство Текст установить пустым).

При таком подходе колонка сжимается до минимального размера и визуально исчезает из таблицы. Однако следует помнить о нюансе: при выгрузке отчета в табличный документ или файл Excel микроколонка физически сохраняется в структуре листа.

Способ 2. Архитектурный подход через универсальное измерение «Показатель»

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

Посмотрим на пример трансформации запроса. Вместо выборки ресурсов в отдельные поля объединим их через ОБЪЕДИНИТЬ ВСЕ в общее поле Значение и добавим текстовое измерение ВидПоказателя:


ВЫБРАТЬ
    ТоварыНаСкладах.Номенклатура КАК Номенклатура,
    ТоварыНаСкладах.Склад КАК Склад,
    "Остаток" КАК ВидПоказателя,
    ТоварыНаСкладах.ВНаличииОстаток КАК Значение
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладах
ГДЕ
    ТоварыНаСкладах.ВНаличииОстаток <> 0

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

ВЫБРАТЬ
    ЗаказыПоставщикам.Номенклатура,
    ЗаказыПоставщикам.Склад,
    "В пути",
    ЗаказыПоставщикам.КоличествоВПути
ИЗ
    РегистрНакопления.ЗаказыПоставщикам КАК ЗаказыПоставщикам
ГДЕ
    ЗаказыПоставщикам.КоличествоВПути <> 0

После подготовки данных настроим структуру отчета в СКД:

  1. На вкладке Ресурсы укажем только одно поле — Значение с выражением Сумма(Значение).
  2. В структуре отчета в строках оставим группировку Номенклатура.
  3. В колонках таблицы создадим группировку Склад, а внутрь нее добавим подчиненную группировку по полю ВидПоказателя.

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

Способ 3. Программная постобработка табличного документа по строке итогов

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

Разберем процедуру ПриКомпоновкеРезультата в модуле объекта отчета:


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

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

← На главную