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