Почему не работает условное оформление динамического списка в управляемых формах 1С?

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

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

Анализируем иерархию условного оформления

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

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

Проанализируем ситуацию: если вы добавили условие в динамический список, но оно не срабатывает, обязательно проверьте свойства формы. Нажмите правой кнопкой мыши на корень дерева элементов формы (слово "Форма"), выберите "Свойства" и найдите пункт УсловноеОформление. Если там обнаружатся старые или конфликтующие правила, их следует удалить или скорректировать.

Влияние пользовательских настроек и сброс стандартных значений

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

Посмотрим, как можно решить эту проблему:

Проверка условий и типов данных в запросе

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


ВЫБРАТЬ
    ЗаказКлиента.Ссылка,
    ВЫБОР
        КОГДА ЗаказыВторойСклад.Центральный > 0 ТОВДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК ЕстьЦентральный
ИЗ
    Документ.ЗаказКлиента КАК ЗаказКлиента
...

В данном случае поле ЕстьЦентральный имеет тип Булево. При настройке условия в конфигураторе важно убедиться, что вы сравниваете его именно с логическим значением. Если вы попытаетесь вручную вписать строку "Истина", система может воспринять это некорректно. В интерфейсе настройки оформления для типа Булево обычно предлагается выбор через флажок или значения "Да"/"Нет".

Важный нюанс: Чтобы условие по полю ЕстьЦентральный работало, даже если эта колонка не выведена на экран пользователя, необходимо зайти в настройки динамического списка (вкладка "Настройка списка") и в списке доступных полей установить для него флаг "Использовать всегда". Если этого не сделать, платформа в целях оптимизации может не выбирать значение этого поля из базы, и условие оформления не сможет рассчитаться.

Порядок выполнения правил

Выясним, что происходит, если условия пересекаются. В рамках одной коллекции (например, только в динамическом списке) правила выполняются сверху вниз. Это означает, что если два условия красят одно и то же поле в разные цвета, то применится последнее (нижнее) правило, условие которого истинно.

Рассмотрим пример:

  1. Условие 1: Если Статус = "Новый", цвет текста — Синий.
  2. Условие 2: Если Сумма > 100 000, цвет текста — Красный.

Если в списке появится новый документ на сумму 150 000, его текст станет красным, так как второе условие перекроет первое. Чтобы избежать такой "чехарды", старайтесь делать условия взаимоисключающими или тщательно выстраивайте их последовательность.

Программное добавление оформления

Если статических настроек недостаточно (например, когда цвета должны браться динамически из справочника), мы можем использовать программный метод. Рассмотрим пример добавления условия в процедуре ПриСозданииНаСервере:


ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();

// Устанавливаем оформление: цвет фона
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЗеленый);

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

// Указываем оформляемые поля
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Номер");

При программном добавлении также помните о приоритетах. Если вы добавляете оформление в коллекцию УсловноеОформление (оформление формы), оно будет главнее, чем оформление в коллекции Список.УсловноеОформление.

Резюме и рекомендации

Подводя итог, если ваше условное оформление "не слушается", выполните следующие шаги:

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

← На главную