Как программно настроить СКД, отборы в группировках и управлять выводом пустых полей?

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

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

Понимание структуры настроек НастройкиКомпоновкиДанных

Главная сложность заключается в иерархическом устройстве объекта НастройкиКомпоновкиДанных. Когда мы добавляем в структуру отчета ТаблицаКомпоновкиДанных, важно понимать, что это сложный объект. Мы не можем просто применить отбор к «таблице» как к единому целому. У таблицы есть подчиненные элементы: Строки и Колонки.

Для того чтобы добраться до нужного элемента и установить в нем отбор, нам необходимо двигаться по иерархии коллекции Структура. Если вы программно добавляете таблицу, структура будет выглядеть примерно так:


// Добавляем таблицу в структуру настроек
Таблица = НастройкиКомпоновки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));

// Добавляем группировку в строки таблицы
ГруппировкаСтрок = Таблица.Строки.Добавить();
ГруппировкаСтрок.ПолеГруппировки = Новый ПолеКомпоновкиДанных("ФИО");

// Теперь устанавливаем отбор именно для этой группировки
ЭлементОтбора = ГруппировкаСтрок.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементОтбора.ПравоеЗначение = "Иванов";
ЭлементОтбора.Использование = Истина;

Как «подсмотреть» структуру, созданную в конструкторе

Самый эффективный способ изучить структуру — настроить отчет «руками» в режиме 1С:Предприятие, а затем программно проанализировать полученный объект. Вы можете использовать такой прием в отладчике:

  1. Создайте отчет, где в конструкторе настроек вы настроили все так, как вам нужно.
  2. В процедуре ПриКомпоновкеРезультата установите точку останова.
  3. Используйте СериализаторXDTO для вывода настроек в XML, чтобы увидеть точную иерархию элементов, которую потом вы сможете повторить в своем коде.

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Temp\Settings.xml");
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, КомпоновщикНастроек.Настройки);
ЗаписьXML.Закрыть();

Решение проблемы пустых колонок

Часто возникает вопрос: почему в консоли СКД пустые колонки скрываются автоматически, а в программном коде — нет? Это происходит потому, что автоматическое управление выводом АвтоМаксимизация и параметры вывода требуют явной настройки.

Если вам нужно скрыть колонку, где все значения равны нулю, не стоит полагаться исключительно на УсловноеОформление, так как оно лишь меняет визуальное представление (например, ширину), но не удаляет поле из состава выводимых данных. Рассмотрим два более надежных метода:

  1. Управление выбором полей: Вы можете программно проверить наличие данных в колонке и, если результат пуст, исключить поле из Настройки.Выбор.Элементы.
  2. Использование вычисляемых полей и отборов: Это более «чистый» архитектурный подход. Создайте в наборе данных СКД вычисляемое поле, которое будет рассчитывать максимум или сумму по группировке. Затем наложите отбор на группировку: «Где Максимум(Значение) > 0». Таким образом, пустые строки/колонки будут отсекаться еще на этапе формирования выборки данных.

Условное оформление как инструмент тонкой настройки

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


ЭлементОформления = НастройкиКомпоновки.УсловноеОформление.Элементы.Добавить();
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Количество");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = 0;

// Указываем, какие поля подлежат оформлению
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Количество");
ОформляемоеПоле.Использование = Истина;

// Устанавливаем визуальный параметр (например, цвет текста)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.СветлоСерый);

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

← На главную