Разработка отчетов с использованием СистемыКомпоновкиДанных (СКД) в программном режиме часто вызывает затруднения, особенно когда требуется динамически изменять структуру отчета, добавлять специфические отборы для вложенных группировок или скрывать пустые колонки, которые «магическим» образом исчезают в конструкторе, но остаются в коде. Рассмотрим пошагово, как разобраться с этой структурой и эффективно управлять настройками.
НастройкиКомпоновкиДанныхГлавная сложность заключается в иерархическом устройстве объекта НастройкиКомпоновкиДанных. Когда мы добавляем в структуру отчета ТаблицаКомпоновкиДанных, важно понимать, что это сложный объект. Мы не можем просто применить отбор к «таблице» как к единому целому. У таблицы есть подчиненные элементы: Строки и Колонки.
Для того чтобы добраться до нужного элемента и установить в нем отбор, нам необходимо двигаться по иерархии коллекции Структура. Если вы программно добавляете таблицу, структура будет выглядеть примерно так:
// Добавляем таблицу в структуру настроек
Таблица = НастройкиКомпоновки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
// Добавляем группировку в строки таблицы
ГруппировкаСтрок = Таблица.Строки.Добавить();
ГруппировкаСтрок.ПолеГруппировки = Новый ПолеКомпоновкиДанных("ФИО");
// Теперь устанавливаем отбор именно для этой группировки
ЭлементОтбора = ГруппировкаСтрок.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементОтбора.ПравоеЗначение = "Иванов";
ЭлементОтбора.Использование = Истина;
Самый эффективный способ изучить структуру — настроить отчет «руками» в режиме 1С:Предприятие, а затем программно проанализировать полученный объект. Вы можете использовать такой прием в отладчике:
ПриКомпоновкеРезультата установите точку останова.СериализаторXDTO для вывода настроек в XML, чтобы увидеть точную иерархию элементов, которую потом вы сможете повторить в своем коде.
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Temp\Settings.xml");
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, КомпоновщикНастроек.Настройки);
ЗаписьXML.Закрыть();
Часто возникает вопрос: почему в консоли СКД пустые колонки скрываются автоматически, а в программном коде — нет? Это происходит потому, что автоматическое управление выводом АвтоМаксимизация и параметры вывода требуют явной настройки.
Если вам нужно скрыть колонку, где все значения равны нулю, не стоит полагаться исключительно на УсловноеОформление, так как оно лишь меняет визуальное представление (например, ширину), но не удаляет поле из состава выводимых данных. Рассмотрим два более надежных метода:
Настройки.Выбор.Элементы.Если все же необходимо применить оформление (например, изменить шрифт или цвет при определенных условиях), используйте объект УсловноеОформление. Важно помнить, что каждый элемент условного оформления должен содержать коллекцию Поля, иначе оформление применится ко всей строке отчета.
ЭлементОформления = НастройкиКомпоновки.УсловноеОформление.Элементы.Добавить();
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Количество");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = 0;
// Указываем, какие поля подлежат оформлению
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Количество");
ОформляемоеПоле.Использование = Истина;
// Устанавливаем визуальный параметр (например, цвет текста)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.СветлоСерый);
Таким образом, работа с СКД через код требует дисциплины в соблюдении иерархии объектов. Всегда старайтесь сначала добиться нужного результата в визуальном конструкторе, а затем переносите полученные настройки в код, используя возможности сериализации и отладки.