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

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

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

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

Анализ проблемы: почему оформление не применяется?

Давайте посмотрим на исходный код, с которым возникла проблема. В процедуре ПриСозданииНаСервере последовательно вызываются процедуры добавления реквизита и настройки условного оформления.

Сначала добавляем реквизит и элемент формы (колонку), как при программном выводе таблицы значений:


&НаСервере
Процедура ДобавитьДопРеквизиты()
	
	МассивРеквизитов = Новый Массив;

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

Затем пытаемся настроить условное оформление (для автоматической генерации кода можно использовать декомпиляцию условного оформления):


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

Проблема кроется в строке НовыйЭлемент.Поле = Новый ПолеКомпоновкиДанных("ТЧНовРек");. Разработчик предположил, что оформляемое поле нужно указывать по аналогии с автоматически созданными колонками (например, колонка для реквизита "Рек" в табличной части "ТЧ" по умолчанию получает имя "ТЧРек"). Но для программно созданного элемента это правило не работает. Система не может найти на форме элемент с именем "ТЧНовРек" и, соответственно, не применяет оформление.

Ключевой принцип: разделение пути к данным и имени элемента формы

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

  1. Данные для условия — откуда брать значения для проверки (например, равно ли значение нулю).
  2. Элемент для оформления — какой именно элемент интерфейса (колонку, поле) нужно раскрасить.

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

1. Условие (Отбор)

В этой части мы должны указать системе, где находятся данные, которые нужно анализировать. Здесь всегда используется полный путь к данным реквизита, начиная от корня объекта формы. В нашем случае это "Объект.ТЧ.НовРек". Этот код написан верно:


ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТЧ.НовРек");

2. Оформляемые поля

А вот в этой части мы должны указать, какой элемент на форме нужно оформить. Здесь следует использовать не путь к данным, а точное имя элемента формы, которое было задано при его создании. В нашем примере при вызове метода Элементы.Вставить мы задали имя "НовРек":

Эл = Элементы.Вставить("НовРек", Тип("ПолеФормы"), Элементы.ТЧ);

Соответственно, и в условном оформлении нужно ссылаться именно на это имя.

Пошаговая инструкция и итоговый код

Давайте исправим процедуру ДобавитьУФ, чтобы она работала как надо. Выполним следующие шаги:

  1. Оставим без изменений настройку отбора (условия), так как она корректна.
  2. В настройке оформляемых полей укажем имя элемента формы, которое мы задали ранее, — "НовРек".

Вот исправленный и полный код процедуры:


&НаСервере
Процедура ДобавитьУФ()
	
	УсловноеОформление.Элементы.Очистить();

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

После этого изменения условное оформление будет корректно применяться к программно созданной колонке "НовРек". Для отладки свойств в рантайме часто используют редактор форм в режиме предприятия.

Дополнительные рекомендации и частые ошибки

Главный вывод: при настройке условного оформления для программно добавленных элементов всегда помните о различии между путем к данным (для условия) и именем элемента формы (для оформления). Это ключ к успешной и предсказуемой работе динамического интерфейса в 1С.

← На главную