При разработке и доработке управляемых форм в конфигурации «1С:Управление торговлей 11» (а также в иных прикладных решениях на платформе «1С:Предприятие 8.3») часто возникает необходимость динамически выделять строки или отдельные колонки таблицы цветом. Для этого используется механизм программного условного оформления. Однако начинающие разработчики нередко сталкиваются с ситуацией, когда созданный код не выдает ошибок, но раскрашивание таблицы не происходит или отбор срабатывает неверно. Проанализируем типичные причины такой проблемы и разберем правильный порядок настройки условного оформления.
Разберем по шагам основные ошибки, из-за которых программный отбор в условном оформлении может не работать:
ЛевоеЗначение элемента отбора необходимо передавать путь к данным реквизита формы (например, "РаспоряженияНаОтгрузку.Состояние"). Распространенной ошибкой является добавлении префикса "Объект." для таблиц, которые являются реквизитами самой формы (или обработки), а не реквизитами объекта базы данных. Если написать "Объект.РаспоряженияНаОтгрузку.Состояние" для реквизита формы, платформа не сможет найти поле и условие проигнорируется.ВидСравненияКомпоновкиДанных.Содержит для поля с типом перечисления или ссылки вместо строки), отбор не сработает. Перед написанием кода важно проверить тип значений в колонке через отладчик.ОформляемоеПоле.Поле) используется имя элемента управления формы (колонки), а для левого значения условия отбора — путь к данным соответствующего реквизита.УсловноеОформление.Элементы.Очистить() полностью сбрасывает все оформляющие правила, в том числе и те, которые были статически настроены разработчиком в конфигураторе.Рассмотрим конкретную ситуацию. На форме обработки присутствует таблица РаспоряженияНаОтгрузку. Нам необходимо подсветить зеленым или желтым цветом строки, у которых колонка Состояние содержит определенный текст (например, «Ожидается отгрузка»).
Перед формированием правила условного оформления проанализируем структуру данных в отладчике. Проверим, как обращаться к данным таблицы и какой тип содержит нужная колонка:
// В отладчике проверяем обращение к строкам таблицы формы:
ЭтаФорма.РаспоряженияНаОтгрузку[0].Состояние // Возвращает значение: "В процессе отбора" (Тип: Строка)
ЭтаФорма.РаспоряженияНаОтгрузку[1].Состояние // Возвращает значение: "Ожидается отгрузка" (Тип: Строка)
Так как поле Состояние имеет строковый тип, мы можем использовать как точное сравнение (ВидСравненияКомпоновкиДанных.Равно), так и поиск по части строки (ВидСравненияКомпоновкиДанных.Содержит).
Посмотрим на пример правильной реализации процедуры программной установки условного оформления. Код размещается в модуле формы и обычно вызывается в обработчике ПриСозданииНаСервере.
&НаСервере
Процедура УстановитьУсловноеОформление()
// 1. Создаем новое правило условного оформления
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Использование = Истина;
// 2. Устанавливаем оформление (например, цвет фона)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Зеленый);
// 3. Формируем условие отбора
// Важно: Указываем точный путь к данным реквизита таблицы формы без "Объект."
ПутьКДаннымПоля = "РаспоряженияНаОтгрузку.Состояние";
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКДаннымПоля);
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементУсловия.ПравоеЗначение = "жидается"; // Текст для поиска подстроки
ЭлементУсловия.Использование = Истина;
// 4. Указываем колонки (элементы формы), к которым применяются цвета
МассивИменКолонокДляПодсветки = Новый Массив;
МассивИменКолонокДляПодсветки.Добавить(Элементы.РаспоряженияНаОтгрузкуПолучатель.Имя);
МассивИменКолонокДляПодсветки.Добавить(Элементы.РаспоряженияНаОтгрузкуГруппаТипДокумента.Имя);
МассивИменКолонокДляПодсветки.Добавить(Элементы.РаспоряженияНаОтгрузкуРаспоряжениеНомер.Имя);
МассивИменКолонокДляПодсветки.Добавить(Элементы.РаспоряженияНаОтгрузкуРаспоряжениеДата.Имя);
МассивИменКолонокДляПодсветки.Добавить(Элементы.РаспоряженияНаОтгрузкуСостояние.Имя);
МассивИменКолонокДляПодсветки.Добавить(Элементы.РаспоряженияНаОтгрузкуРаспоряжение.Имя);
Для Каждого ИмяКолонки Из МассивИменКолонокДляПодсветки Цикл
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонки);
КонецЦикла;
КонецПроцедуры
Рассмотрим подробнее важные нюансы, которые следует учитывать при программной настройке интерфеса:
ЛевоеЗначение, присутствует в запросе динамического списка. Если колонка не выведена на форму пользовательского интерфейса, у реквизита необходимо включить свойство «Использовать всегда» или программно вызвать УстановитьОбязательноеИспользование("ИмяПоля", Истина).ПриСозданииНаСервере. Повторный вызов процедуры без очистки добавит дублирующие правила в коллекцию УсловноеОформление.Элементы, что негативно скажется на производительности.УсловноеОформление.Элементы.Очистить(). Добавляйте программные элементы через метод Добавить() поверх существующих.