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