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