При разработке сложных отчетов на базе Системы компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда для визуального выделения данных требуется создать множество правил условного оформления. Если для каждого правила включить режим «Быстрый доступ», форма отчета перегружается однотипными флажками. В этой статье мы разберем, как элегантно сгруппировать эти настройки и реализовать сложные сценарии раскраски, включая динамическое определение цвета.
Это один из самых простых и эффективных способов, не требующий написания сложного программного кода. Суть метода заключается в создании единого «рубильника» в виде параметра отчета.
Рассмотрим по шагам, как это реализовать:
РаскрашиватьНоменклатуру с типом Булево.Параметры.РаскрашиватьНоменклатуру Равно Истина.Проанализируем ситуацию: теперь СКД будет применять оформление только в том случае, если пользователь установил флажок в параметрах. При этом визуально на форме будет всего одна галочка, управляющая всей логикой раскраски.
Если нам необходимо, чтобы управление происходило именно через стандартный механизм управления элементами условного оформления, мы можем прибегнуть к программному манипулированию настройками. Выясним, как это работает через свойство ИдентификаторПользовательскойНастройки.
Разберем алгоритм действий в модуле отчета:
При программном формировании или модификации схемы мы можем назначить нескольким элементам коллекции УсловноеОформление один и тот же строковый идентификатор. Платформа 1С в типовых формах отчетов группирует настройки с одинаковыми идентификаторами.
// Пример программной модификации в модуле отчета
Процедура ПриКомпоновкеРезультата(РезультатСформирован, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.Настройки;
КоллекцияУО = Настройки.УсловноеОформление;
// Создаем уникальный ID для группы
ОбщийИдентификатор = "МояГруппаРаскраски";
Для Каждого ЭлементУО Из КоллекцияУО Цикл
// Допустим, мы хотим объединить все элементы с определенным представлением
Если ЭлементУО.Представление = "Раскрашивать номенклатуру" Тогда
ЭлементУО.ИдентификаторПользовательскойНастройки = ОбщийИдентификатор;
// У первого элемента оставляем доступ, у остальных скрываем
ЭлементУО.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
КонецЕсли;
КонецЦикла;
// Дальнейший вывод отчета через ПроцессорКомпоновки
КонецПроцедуры
Важный нюанс: Чтобы на форме отображалась только одна галочка, первым элементам в списке нужно установить режим отображения Быстрый доступ, а всем последующим с тем же идентификатором — Недоступный. Платформа свяжет их состояние: изменение одного флажка автоматически применит значение ко всей группе с тем же ID.
Иногда условий так много, что создавать на каждое строку УО нецелесообразно. В этом случае мы можем вычислить цвет заранее в коде или в вычисляемом поле. Посмотрим на пример использования функции общего модуля.
Создадим в общем модуле (с флагом «Вызов сервера») функцию:
Функция ПолучитьЦветПоОстатку(Остаток) Экспорт
Если Остаток < 0 Тогда
Возврат WebЦвета.Красный;
ИначеЕсли Остаток < 10 Тогда
Возврат Новый Цвет(255, 165, 0); // Оранжевый
Иначе
Возврат WebЦвета.Белый;
КонецЕсли;
КонецФункции
В СКД на закладке Вычисляемые поля добавим поле ЦветСтроки, где в выражении укажем: ИмяОбщегоМодуля.ПолучитьЦветПоОстатку(Остаток).
Однако стандартный конструктор УО не позволяет выбрать поле как значение цвета. Рассмотрим, как обойти это ограничение через макеты:
ПараметрЦвета.ПараметрЦвета с нашим вычисляемым полем ЦветСтроки.Этот подход позволяет реализовать абсолютно любую логику раскраски, не создавая сотни правил в настройках СКД.
Для тех, кто не боится работать с внутренним представлением схемы, существует вариант подмены источника цвета в XML-описании настроек. По умолчанию СКД хранит цвет как константу. Но если программно изменить тип значения параметра оформления с Значение на Поле, СКД начнет брать цвет из данных самой строки.
Проанализируем структуру в XML:
<dcscor:item>
<dcscor:parameter>ЦветФона</dcscor:parameter>
<dcscor:value xsi:type="dcscor:Field">МоеПолеСЦветом</dcscor:value>
</dcscor:item>
Хотя в визуальном конструкторе это сделать невозможно, программная установка через объектную модель ЗначениеПараметраНастроекКомпоновкиДанных позволяет добиться такого результата. Мы указываем, что значением параметра ЦветФона является объект типа ПолеКомпоновкиДанных.
Подводя итог, выделим основные правила выбора решения:
Если нужно просто объединить 2-5 правил — используйте булевый параметр и добавьте его в условия каждого правила УО.
Если нужно динамически управлять видимостью настроек из кода — манипулируйте свойством ИдентификаторПользовательскойНастройки.
Если раскраска зависит от сложных бизнес-правил (например, данные хранятся в справочнике цветов) — используйте вычисляемые поля и макеты оформления.
Помните, что избыточное количество условного оформления может замедлить формирование отчета, поэтому перенос логики в вычисляемые поля на уровне запроса или общих модулей зачастую является более производительным решением.