Почему не работает условное оформление динамического списка в 1С 8.3 и как это исправить

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

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

Разберем постановку задачи

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

Анализ первой ошибки: УО динамического списка vs УО формы

В системе 1С:Предприятие 8 существует два основных места, где можно задать условное оформление для динамического списка:

  1. Условное оформление формы: доступно через свойство УсловноеОформление самой управляемой формы.
  2. Условное оформление компоновщика настроек: доступно через Список.КомпоновщикНастроек.Настройки.УсловноеОформление.

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

Проблема пустых значений и NULL в запросе

Часто условие оформления не срабатывает из-за того, что данные в колонке не соответствуют ожидаемому типу. Например, если в запросе используется левое соединение, поле остатка может содержать NULL. Рассмотрим правильный подход к подготовке данных в запросе:


ВЫБРАТЬ
    Товары.Наименование,
    ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Количество
ИЗ
    Справочник.Товары КАК Товары
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки КАК Остатки ПО ...

Функция ЕСТЬNULL гарантирует, что в колонке всегда будет число, что критически важно для корректной работы сравнения Больше 0 в отборе условного оформления.

Почему все строки красятся в один цвет

Если после программного добавления оформления все строки стали одного цвета (например, зелеными), это означает, что условие (отбор) либо не срабатывает, либо считается истинным для всех строк. Выясним основные причины:

Правильная программная установка условного оформления

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


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

Обратите внимание на 5-й пункт. Часто разработчики забывают заполнить коллекцию Поля. Хотя в документации указано, что пустое значение коллекции полей должно приводить к оформлению всей строки, на практике в динамических списках это работает нестабильно. Явное указание поля самого списка (СписокУПоставщика) или конкретных колонок (СписокУПоставщикаКоличество) решает эту проблему.

Визуальная настройка в конфигураторе

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

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

Важные замечания по приоритетам и производительности

Рассмотрим иерархию применения оформления. Если у вас задано УО и на уровне формы, и на уровне компоновщика списка, платформа будет применять их последовательно. Оформление формы имеет более высокий приоритет и накладывается «поверх» настроек списка.

С точки зрения производительности, настройка через КомпоновщикНастроек динамического списка считается более предпочтительной для огромных массивов данных, так как она обрабатывается ближе к уровню выборки данных. Однако программно управлять оформлением формы (УсловноеОформление.Элементы) гораздо проще и удобнее в 90% типовых задач.

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

Заключение

Подведем итог. Если у вас не работает условное оформление в динамическом списке, проверьте три вещи:

  1. Путь к полю: для формы это ИмяСписка.ИмяПоля, для компоновщика — просто ИмяПоля.
  2. Оформляемые поля: всегда явно указывайте, какие колонки (или весь список) вы хотите оформить.
  3. Наличие данных: убедитесь, что поле включено в запрос, не содержит NULL и для него установлен флаг Использовать всегда, если оно не выведено на форму.

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

← На главную