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