Разработка интерфейсов для людей с ограниченными возможностями или специфическими требованиями к отображению данных — это важная задача, с которой рано или поздно сталкивается любой разработчик на платформе «1С:Предприятие». В обычных формах (до версии платформы 8.2) управление стилем всей формы выполнялось достаточно просто: в свойствах самого объекта формы можно было указать конкретный стиль. Однако в управляемом интерфейсе разработчики платформы отказались от этой концепции в пользу декларативного описания интерфейса.
В этой статье мы подробно разберем, как решить задачу кастомизации интерфейса управляемой формы, если стандартное свойство стиля формы отсутствует, а конфигурация работает в режиме совместимости, который не позволяет использовать современные механизмы корпоративного стиля.
В управляемом приложении за компоновку, размеры и внешний вид элементов отвечает сама платформа 1С. Это сделано для того, чтобы формы корректно и одинаково отображались в тонком клиенте, веб-клиенте, на мобильных устройствах и различных операционных системах. Прямое директивное указание стилей всей формы нарушило бы эту кроссплатформенность.
Тем не менее, перед нами стоит конкретная практическая задача: настроить форму для слабовидящего пользователя, сделав шрифт очень большим (например, 26-й кегль, курсив) и применив контрастный оранжевый цвет. Рассмотрим четыре эффективных способа решения этой задачи.
Прежде чем приступать к написанию программного кода, проанализируем возможности самой платформы «1С:Предприятие», начиная с версии 8.3.10. В платформу встроен мощный и оптимизированный механизм масштабирования форм, разработанный специально для решения проблем с доступностью интерфейса.
Рассмотрим, как пользователь или администратор может настроить отображение самостоятельно в режиме «1С:Предприятие»:
Преимущества метода: Платформа берет на себя всю работу по пропорциональному увеличению шрифтов, кнопок, полей ввода, списков и табличных частей. Это работает быстро, не требует изменения конфигурации и полностью снимает нагрузку с сервера при отрисовке.
Если штатного масштабирования недостаточно и бизнес-требования диктуют необходимость жестко задать конкретные визуальные параметры (например, оранжевый курсив 26-го размера для текстовых полей), мы можем настроить элементы программно. Чтобы не менять свойства десятков элементов вручную в конфигураторе, напишем универсальный алгоритм обхода коллекции элементов формы.
Разберем этот метод по шагам. Обход элементов должен выполняться на стороне сервера при создании формы. Для этого отлично подходит процедура ПриСозданииНаСервере.
Посмотрим на пример реализации рекурсивной процедуры в модуле управляемой формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Запускаем рекурсивную обработку всех элементов формы
ИзменитьСтильЭлементовРекурсивно(Элементы);
КонецПроцедуры
&НаСервере
Процедура ИзменитьСтильЭлементовРекурсивно(КоллекцияЭлементов)
Для Каждого Элемент Из КоллекцияЭлементов Цикл
ТипЭлемента = ТипЗнч(Элемент);
// Проверяем типы элементов, которые содержат текст и поддерживают изменение шрифта и цвета
Если ТипЭлемента = Тип("ПолеФормы")
Или ТипЭлемента = Тип("ДекорацияФормы") Тогда
Попытка
// Задаем оранжевый цвет текста (RGB: 255, 127, 0)
Элемент.ЦветТекста = Новый Цвет(255, 127, 0);
// Создаем новый шрифт: Имя (Авто), Размер (26), Полужирный (Ложь), Курсив (Истина)
Элемент.Шрифт = Новый Шрифт(, 26, Ложь, Истина);
Исключение
// Исключаем непредвиденные ошибки для элементов со специфическим поведением
ЗаписьЖурналаРегистрации("НастройкаСтиля", УровеньЖурналаРегистрации.Предупреждение,,,
"Не удалось изменить стиль элемента: " + Элемент.Имя);
КонецПопытки;
ИначеЕсли ТипЭлемента = Тип("КнопкаФормы") Тогда
Попытка
// Для кнопок можно задать чуть меньший шрифт, чтобы они помещались на экране
Элемент.Шрифт = Новый Шрифт(, 18, Истина, Ложь);
Исключение
// Пропускаем ошибки настройки кнопок
КонецПопытки;
КонецЕсли;
// Если элемент является группой (панель, вкладка, группа колонок),
// нам необходимо обойти ее внутренние элементы
Если ТипЭлемента = Тип("ГруппаФормы") Тогда
ИзменитьСтильЭлементовРекурсивно(Элемент.Элементы);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важное примечание: Обратите внимание, что мы используем рекурсию для обхода элементов типа ГруппаФормы. Это гарантирует, что оформление применится даже к тем полям ввода, которые глубоко вложены в различные группы, страницы и панели управляемой формы.
Еще один профессиональный способ централизованно управлять внешним видом полей — это использование встроенного механизма условного оформления формы (свойство УсловноеОформление). Его преимущество заключается в том, что оно оптимизировано самой платформой и работает быстрее ручного изменения свойств каждого элемента.
Рассмотрим, как настроить условное оформление программно на сервере без привязки к конкретным значениям реквизитов (чтобы оформление действовало всегда):
&НаСервере
Процедура НастроитьУсловноеОформлениеДляСлабовидящих()
// Очищаем существующие правила условного оформления, чтобы избежать конфликтов
УсловноеОформление.Элементы.Очистить();
// Добавляем новое правило оформления
НовоеПравило = УсловноеОформление.Элементы.Добавить();
// 1. Настраиваем оформление: задаем цвет и шрифт
НовоеПравило.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Новый Цвет(255, 127, 0));
НовоеПравило.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(, 26, Ложь, Истина));
// 2. Условие применения оставляем пустым.
// Отсутствие условий означает, что правило применяется всегда и ко всем строкам/полям.
// 3. Указываем, какие именно поля формы должны оформляться.
// Программно обходим элементы формы и добавляем все текстовые поля в список оформляемых полей
Для Каждого Элемент Из Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда
ОформляемоеПоле = НовоеПравило.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Элемент.Имя);
ОформляемоеПоле.Использование = Истина;
КонецЕсли;
КонецЦикла;
// Активируем правило
НовоеПравило.Использование = Истина;
КонецПроцедуры
Этот метод позволяет гибко управлять оформлением формы, а платформа «1С:Предприятие» применит заданные параметры стилей максимально экономичным для графической подсистемы образом.
При программном изменении стилей критически важно понимать физику процессов отрисовки интерфейса. Начиная с версии платформы 8.3.7, разработчики оптимизировали изменение оформительских свойств на клиенте. Такие свойства, как ЦветФона или ЦветТекста, можно изменять на клиенте без вызова сервера, так как они не влияют на физические размеры элементов управления.
Однако свойство Шрифт (особенно изменение его размера с дефолтного на 26-й кегль) напрямую влияет на геометрические размеры элементов формы. При изменении шрифта платформе требуется полностью пересчитать координаты всех связанных элементов, высоту строк, ширину колонок и размеры самой формы.
Рекомендация: Всегда выполняйте изменение размеров шрифтов и сложную перенастройку элементов на сервере в процедурах инициализации формы (ПриСозданииНаСервере). Избегайте динамического изменения размеров шрифтов на клиенте во время работы пользователя с формой, так как это приведет к заметным задержкам интерфейса из-за тяжелых расчетов геометрии окон.
Мы проанализировали проблему отсутствия свойства стиля у управляемой формы и нашли несколько надежных вариантов решения: