Как программно настроить условное оформление таблицы на управляемой форме 1С и исправить неработающее условие?

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

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

Выясним причину: почему не срабатывает условие оформления

Разберем по шагам основные ошибки, из-за которых программный отбор в условном оформлении может не работать:

  1. Неверный путь к данным в отборе: В свойство ЛевоеЗначение элемента отбора необходимо передавать путь к данным реквизита формы (например, "РаспоряженияНаОтгрузку.Состояние"). Распространенной ошибкой является добавлении префикса "Объект." для таблиц, которые являются реквизитами самой формы (или обработки), а не реквизитами объекта базы данных. Если написать "Объект.РаспоряженияНаОтгрузку.Состояние" для реквизита формы, платформа не сможет найти поле и условие проигнорируется.
  2. Несоответствие типов данных: Если в отбор передается некорректное значение или не тот вид сравнения (например, поиск подстроки через ВидСравненияКомпоновкиДанных.Содержит для поля с типом перечисления или ссылки вместо строки), отбор не сработает. Перед написанием кода важно проверить тип значений в колонке через отладчик.
  3. Путаница между именами элементов формы и путями к данным: Для массива оформляемых полей (ОформляемоеПоле.Поле) используется имя элемента управления формы (колонки), а для левого значения условия отбора — путь к данным соответствующего реквизита.
  4. Очистка существующих настроек: Вызов метода УсловноеОформление.Элементы.Очистить() полностью сбрасывает все оформляющие правила, в том числе и те, которые были статически настроены разработчиком в конфигураторе.

Шаг 1. Проверка типов и значений полей в отладчике

Рассмотрим конкретную ситуацию. На форме обработки присутствует таблица РаспоряженияНаОтгрузку. Нам необходимо подсветить зеленым или желтым цветом строки, у которых колонка Состояние содержит определенный текст (например, «Ожидается отгрузка»).

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


// В отладчике проверяем обращение к строкам таблицы формы:
ЭтаФорма.РаспоряженияНаОтгрузку[0].Состояние // Возвращает значение: "В процессе отбора" (Тип: Строка)
ЭтаФорма.РаспоряженияНаОтгрузку[1].Состояние // Возвращает значение: "Ожидается отгрузка" (Тип: Строка)

Так как поле Состояние имеет строковый тип, мы можем использовать как точное сравнение (ВидСравненияКомпоновкиДанных.Равно), так и поиск по части строки (ВидСравненияКомпоновкиДанных.Содержит).

Шаг 2. Программирование условного оформления

Посмотрим на пример правильной реализации процедуры программной установки условного оформления. Код размещается в модуле формы и обычно вызывается в обработчике ПриСозданииНаСервере.


&НаСервере
Процедура УстановитьУсловноеОформление()

	// 1. Создаем новое правило условного оформления
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	ЭлементОформления.Использование = Истина;
	
	// 2. Устанавливаем оформление (например, цвет фона)
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Зеленый);

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

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

	Для Каждого ИмяКолонки Из МассивИменКолонокДляПодсветки Цикл
		ОформляемоеПоле      = ЭлементОформления.Поля.Элементы.Добавить();
		ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонки);
	КонецЦикла;

КонецПроцедуры

Особенности работы с динамическими списками и таблицами значений

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

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