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