Как программно настроить условное оформление для динамических колонок в табличной части 1С

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

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

Понимание структуры программного условного оформления

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

  1. Оформляемые поля: это конкретные визуальные элементы на форме (колонки), которые будут менять цвет, шрифт или видимость.
  2. Отбор (условие): логическое правило, при котором оформление должно сработать.
  3. Параметры оформления: собственно сами настройки (цвет фона, цвет текста, шрифт и т.д.).

Проанализируем типовой сценарий: у нас есть табличная часть Календарь, в которую программно добавлены колонки. Мы хотим выделить ячейки, содержащие определенный текст (например, начинающийся с «Заказ №»).

Различие между именем элемента и путем к данным

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

В объекте УсловноеОформление используются два разных типа ссылок на поля:

1. Для Поля оформления (куда применяется стиль) мы используем Имя элемента формы. Например, если колонка на форме называется «вторник18», мы обращаемся к ней именно по этому имени.

2. Для Левого значения отбора (что мы проверяем) мы используем Путь к данным. Это строгий формат адресации реквизита в информационной базе. Для табличной части он выглядит как Объект.ИмяТабличнойЧасти.ИмяРеквизита.

Рассмотрим пример правильной инициализации оформления:


// Добавляем новый элемент оформления
Элемент = УсловноеОформление.Элементы.Добавить();

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

// 2. Указываем ПАРАМЕТРЫ оформления
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 200, 200)); // Светло-красный

Настройка условий (Отбор)

Теперь разберем, как правильно задать условие. Отбор в условном оформлении работает по принципам системы компоновки данных (СКД). Он состоит из ЛевогоЗначения, ВидаСравнения и ПравогоЗначения.

Посмотрим на типичную ситуацию: поиск строки в динамической колонке. Если мы хотим выделить ячейки, текст в которых начинается с «Заказ», нам необходимо правильно настроить все три составляющие:


ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

// Левое значение — это путь к данным колонки в табличной части
// ВАЖНО: Если данные находятся в ТЧ, путь должен включать имя ТЧ
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Календарь.Вторник18");

// Вид сравнения для поиска по строке
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НачинаетсяС;

// Правое значение — это сама строка, с которой мы сравниваем
ОтборЭлемента.ПравоеЗначение = "Заказ";

// Не забываем активировать использование правила
Элемент.Использование = Истина;

Важное замечание: Если ваша задача — просто выделить все заполненные (непустые) ячейки, то ПравоеЗначение указывать не нужно. В этом случае используйте ВидСравненияКомпоновкиДанных.Заполнено.

Универсальный подход для динамических колонок

Часто колонки создаются в цикле. Проанализируем, как можно автоматизировать процесс добавления оформления для всех динамических колонок сразу. Допустим, у нас есть массив имен колонок, которые мы добавили на форму.


Для Каждого ИмяКолонки Из МассивДинамическихКолонок Цикл
    
    НовыйЭлемент = УсловноеОформление.Элементы.Добавить();
    
    // Оформляем конкретную колонку
    Поле = НовыйЭлемент.Поля.Элементы.Добавить();
    Поле.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонки);
    
    // Условие: если в данных этой колонки есть текст "Заказ"
    Условие = НовыйЭлемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Условие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Календарь." + ИмяКолонки);
    Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
    Условие.ПравоеЗначение = "Заказ";
    
    // Устанавливаем цвет фона (например, из стилей системы)
    НовыйЭлемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ОсобыйТекст);
    НовыйЭлемент.Использование = Истина;
    
КонецЦикла;

Полезные советы по работе с коллекцией оформления

Чтобы ваше решение работало стабильно и не вызывало проблем с производительностью или отображением, придерживайтесь следующих правил:

Таким образом, ключ к успешному программному условным оформлению заключается в точном соблюдении адресации данных. Помните: Поле оформления = Имя элемента, а Левое значение отбора = Путь к данным реквизита. Соблюдение этого правила решит 90% проблем с неработающей раскраской таблиц.

← На главную