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