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