Как программно настроить условное оформление для конкретного поля в СКД при использовании своего макета

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

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

Разбор типичной ошибки: почему красится вся строка

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

Рассмотрим пример кода, который выполняет задачу частично правильно (устанавливает условие и цвет), но «цепляет» лишние данные:


НовыйЭлементУсловногоОформления = КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить(); 
НовыйЭлементУсловногоОформления.Использование = Истина; 

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

// Установка цвета фона
НовыйЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);

В данном примере отсутствует заполнение коллекции Поля. Чтобы исправить это и ограничить область действия только колонкой «Дельта», необходимо явно добавить это поле в структуру элемента оформления.

Пошаговое решение для программной настройки оформления

Выясним, как составить корректный алгоритм, который будет работать точечно. Разберем процесс по этапам, создавая надежный механизм управления цветом.

  1. Создание элемента оформления. Сначала мы обращаемся к настройкам компоновщика и добавляем новый элемент в коллекцию УсловноеОформление.
  2. Определение целевых полей. Это критически важный шаг. Нам нужно добавить объект ОформляемоеПолеКомпоновкиДанных в коллекцию Поля нашего элемента. Именно здесь мы указываем имя поля, которое должно изменить цвет.
  3. Настройка условий (Отбор). Здесь мы определяем логику: при каких значениях оформление должно «сработать». Мы используем ЭлементОтбораКомпоновкиДанных, указывая левое значение (поле), вид сравнения и правое значение.
  4. Установка параметров оформления. На этом этапе мы выбираем, что именно меняем: ЦветФона, ЦветТекста, Шрифт или Формат.

Посмотрим на итоговый правильный код, который решает задачу автора:


// Создаем правило для положительной дельты (Красный цвет)
ЭлементОформления = КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Использование = Истина;

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

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

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

Важные нюансы работы с именами полей и макетами

Проанализируем ситуацию с именованием полей. В СКД крайне важно соблюдать точность в написании имен. Хотя встроенный язык 1С в целом нечувствителен к регистру, при работе с ПолеКомпоновкиДанных и собственными макетами могут возникать коллизии. Если в схеме компоновки (на закладке «Наборы данных») поле называется «дельта» (в нижнем регистре), то и в программном коде при создании объекта Новый ПолеКомпоновкиДанных("дельта") лучше придерживаться того же написания.

Особенности работы со «Своим макетом»:

Если вы используете собственный макет оформления ячеек, убедитесь в следующем:

Управление областью применения (Группировки и Итоги)

Часто возникает вопрос: нужно ли красить итоговые записи или только детальные? У объекта ЭлементУсловногоОформленияКомпоновкиДанных есть несколько свойств-флагов, которые позволяют тонко настроить область действия. Рассмотрим их:

Если вам нужно красить только детальные записи, но не итоги, следует программно выключить соответствующие флаги:


ЭлементОформления.ИспользоватьВОбщемИтоге = Ложь;
ЭлементОформления.ИспользоватьВГруппировке = Ложь;

Где лучше размещать этот код?

Выясним, в какой момент работы отчета правильнее всего вносить программные правки. Если вы пишете код в модуле формы или в модуле отчета, наиболее подходящим местом является обработчик события ПриКомпоновкеРезультата.

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

КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Очистить();

Если же вы хотите, чтобы пользователь мог видеть ваши настройки в интерфейсе и, возможно, отключать их, работайте с КомпоновщикНастроек.Настройки. Если же оформление должно быть «жестким» и неизменным, используйте КомпоновщикНастроек.ФиксированныеНастройки.

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

← На главную