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