При программном создании элементов формы, например, колонок в табличной части, часто возникает задача настроить для них условное оформление. Однако стандартный подход может не сработать, и новая колонка останется без форматирования, в то время как существующие колонки будут оформляться корректно. Разберем, в чем заключается распространенная ошибка и как ее исправить.
Проанализируем типичную ситуацию: у нас есть справочник с табличной частью, в которую мы программно добавляем новую колонку и хотим изменять ее цвет фона в зависимости от значения в ней.
Давайте посмотрим на исходный код, с которым возникла проблема. В процедуре ПриСозданииНаСервере последовательно вызываются процедуры добавления реквизита и настройки условного оформления.
Сначала добавляем реквизит и элемент формы (колонку), как при программном выводе таблицы значений:
&НаСервере
Процедура ДобавитьДопРеквизиты()
МассивРеквизитов = Новый Массив;
// Создаем новый реквизит для табличной части "Объект.ТЧ"
НовРек = Новый РеквизитФормы("НовРек", Новый ОписаниеТипов("Число"), "Объект.ТЧ", "Нов рек", Ложь);
МассивРеквизитов.Добавить(НовРек);
ИзменитьРеквизиты(МассивРеквизитов);
// Вставляем на форму новый элемент управления (колонку) с именем "НовРек"
Эл = Элементы.Вставить("НовРек", Тип("ПолеФормы"), Элементы.ТЧ);
Эл.Вид = ВидПоляФормы.ПолеВвода;
Эл.ПутьКДанным = "Объект.ТЧ.НовРек";
КонецПроцедуры
Затем пытаемся настроить условное оформление (для автоматической генерации кода можно использовать декомпиляцию условного оформления):
&НаСервере
Процедура ДобавитьУФ()
ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
// 1. Настройка условия (отбора)
ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТЧ.НовРек"); // Указан полный путь к данным
ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбораДанных.ПравоеЗначение = 0;
// 2. Указание оформляемого поля - ЗДЕСЬ ОШИБКА
НовыйЭлемент = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
// Попытка указать поле как "ИмяТаблицы" + "ИмяРеквизита"
НовыйЭлемент.Поле = Новый ПолеКомпоновкиДанных("ТЧНовРек"); // НЕВЕРНО
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Кирпичный);
КонецПроцедуры
Проблема кроется в строке НовыйЭлемент.Поле = Новый ПолеКомпоновкиДанных("ТЧНовРек");. Разработчик предположил, что оформляемое поле нужно указывать по аналогии с автоматически созданными колонками (например, колонка для реквизита "Рек" в табличной части "ТЧ" по умолчанию получает имя "ТЧРек"). Но для программно созданного элемента это правило не работает. Система не может найти на форме элемент с именем "ТЧНовРек" и, соответственно, не применяет оформление.
Чтобы условное оформление работало корректно, важно понимать, что система компоновки данных разделяет две сущности:
Разберем, как правильно указывать каждую из этих частей.
1. Условие (Отбор)
В этой части мы должны указать системе, где находятся данные, которые нужно анализировать. Здесь всегда используется полный путь к данным реквизита, начиная от корня объекта формы. В нашем случае это "Объект.ТЧ.НовРек". Этот код написан верно:
ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТЧ.НовРек");
2. Оформляемые поля
А вот в этой части мы должны указать, какой элемент на форме нужно оформить. Здесь следует использовать не путь к данным, а точное имя элемента формы, которое было задано при его создании. В нашем примере при вызове метода Элементы.Вставить мы задали имя "НовРек":
Эл = Элементы.Вставить("НовРек", Тип("ПолеФормы"), Элементы.ТЧ);
Соответственно, и в условном оформлении нужно ссылаться именно на это имя.
Давайте исправим процедуру ДобавитьУФ, чтобы она работала как надо. Выполним следующие шаги:
"НовРек".Вот исправленный и полный код процедуры:
&НаСервере
Процедура ДобавитьУФ()
УсловноеОформление.Элементы.Очистить();
ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
ЭлементУсловногоОформления.Использование = Истина;
// Шаг 1: Указываем полный ПУТЬ К ДАННЫМ для условия
ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТЧ.НовРек");
ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбораДанных.ПравоеЗначение = 0;
ЭлементОтбораДанных.Использование = Истина;
// Шаг 2: Указываем ИМЯ ЭЛЕМЕНТА ФОРМЫ для оформления
НовыйЭлемент = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
НовыйЭлемент.Поле = Новый ПолеКомпоновкиДанных("НовРек"); // ВЕРНО
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Кирпичный);
КонецПроцедуры
После этого изменения условное оформление будет корректно применяться к программно созданной колонке "НовРек". Для отладки свойств в рантайме часто используют редактор форм в режиме предприятия.
"ТЧРек". Чтобы оформить ее, нужно будет указать именно это имя: НовыйЭлемент.Поле = Новый ПолеКомпоновкиДанных("ТЧРек");. А для нашей программно созданной колонки, которую мы назвали "НовРек", нужно использовать НовыйЭлемент.Поле = Новый ПолеКомпоновкиДанных("НовРек");. Это еще раз подтверждает главное правило: в оформляемых полях всегда указывается имя элемента на форме.
УсловноеОформление.Элементы.Очистить();. Это помогает избежать конфликтов и наложения старых правил на новые.
ЭлементУсловногоОформления.Поля.
Главный вывод: при настройке условного оформления для программно добавленных элементов всегда помните о различии между путем к данным (для условия) и именем элемента формы (для оформления). Это ключ к успешной и предсказуемой работе динамического интерфейса в 1С.