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