При разработке мобильных приложений и мобильных клиентов на платформе 1С разработчики часто сталкиваются с задачей адаптации интерфейса для пользователей с разным уровнем зрения или для работы на экранах терминалов сбора данных (ТСД). Стандартного переключателя размера шрифта или команды масштабирования интерфейса, привычной по настольному веб- или тонкому клиенту, в мобильной платформе нет. При этом изменение параметра «Размер текста» в самой операционной системе Android или iOS не оказывает влияния на интерфейс 1С.
Выясним причину такого поведения и подробно разберем практические способы реализации динамического изменения размера шрифта в конфигурации и за ее пределами.
Проанализируем ситуацию: системный ползунок изменения размера шрифта в настройках Android или iOS предназначен для нативных текстовых элементов операционной системы и приложений, использующих стандартные системные стили. Мобильная платформа 1С использует собственный графический движок компоновки форм, оперирующий фиксированными размерами в пунктах (pt). По этой причине изменение системных текстовых настроек устройством игнорируется платформой 1С.
Кроме того, стили конфигурации задаются разработчиком статически на этапе конфигурирования и не могут быть модифицированы пользователем «на лету» в режиме предприятия. Поэтому задачу масштабирования необходимо решать программно или средствами системного масштаба экрана.
Рассмотрим подробнее идею сохранения и применения выбранного шрифта. Объект Шрифт в платформе 1С является сериализуемым типом данных. Это позволяет трансформировать настройки шрифта в XML-строку, сохранять ее в настройках пользователя и при открытии форм применять к элементам интерфейса.
Посмотрим на пример сериализации и обратного восстановления шрифта:
// Сохранение настроенного шрифта в строку XML
СохраненнаяСтрока = ЗначениеВСтрокуXML(Элементы.ПолеВводаТекста.Шрифт);
// Восстановление шрифта из строки и назначение элементу формы
Элементы.ПолеВводаТекста.Шрифт = ЗначениеИзСтрокиXML(СохраненнаяСтрока);
Этот подход удобен, когда в специальной форме настроек приложения пользователь выбирает нужный шрифт или кегль, после чего сериализованная строка записывается в ХранилищеОбщихНастроек или регистр сведений.
Чтобы не переназначать шрифт вручную для каждого поля каждой формы, разберем по шагам создание универсального механизма масштабирования. Создадим процедуру в общем модуле, которая будет рекурсивно обходить элементы формы и увеличивать или уменьшать кегль.
Проанализируем пример кода серверной процедуры масштабирования формы:
Процедура ПрименитьМасштабКФорме(Форма, НовыйРазмерШрифта) Экспорт
Для Каждого Элемент Из Форма.Элементы Цикл
ПрименитьШрифтКЭлементу(Элемент, НовыйРазмерШрифта);
КонецЦикла;
КонецПроцедуры
Процедура ПрименитьШрифтКЭлементу(Элемент, НовыйРазмерШрифта)
// Проверяем, является ли элемент группой, содержащей подчиненные элементы
Если ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда
Для Каждого ПодчиненныйЭлемент Из Элемент.ПодчиненныеЭлементы Цикл
ПрименитьШрифтКЭлементу(ПодчиненныйЭлемент, НовыйРазмерШрифта);
КонецЦикла;
Возврат;
КонецЕсли;
// Проверяем наличие свойства Шрифт у элемента
Попытка
ИсходныйШрифт = Элемент.Шрифт;
Если ИсходныйШрифт = Неопределено Тогда
Элемент.Шрифт = Новый Шрифт(, НовыйРазмерШрифта);
Иначе
Элемент.Шрифт = Новый Шрифт(ИсходныйШрифт, , НовыйРазмерШрифта);
КонецЕсли;
Исключение
// Элемент не поддерживает свойство Шрифт (например, декорации-разделители)
КонецПопытки;
КонецПроцедуры
Вызов процедуры ПрименитьМасштабКФорме достаточно разместить в обработчике ПриСозданииНаСервере форм конфигурации, передавая в качестве параметра желаемый размер (например, 10 для мелкого, 12 для стандартного и 15 для крупного шрифта).
Для табличных частей и динамических списков прямое изменение шрифта колонок через коллекцию Элементы может приводить к ошибкам отображения или не затрагивать данные строк. В этом случае надежнее использовать коллекцию УсловноеОформление формы.
Посмотрим на пример программной настройки шрифта всей таблицы:
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Назначаем оформляемые поля (все видимые колонки таблицы)
Для Каждого Колонка Из Элементы.СписокТоваров.ПодчиненныеЭлементы Цикл
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Колонка.Имя);
КонецЦикла;
// Устанавливаем новый размер шрифта без условий отбора
ЭлементОформления.Оформление.УстановитьЗначениеПараметра(
"Шрифт",
Новый Шрифт(, ВыбранныйРазмер)
);
Если приложение ориентировано на работу операторов склада или курьеров, где критически важен гигантский шрифт для нескольких реквизитов (штрихкод, ячейка, наименование), классический интерфейс форм 1С может оказаться слишком громоздким. В таких случаях экраны реализуются через элемент ПолеHTMLДокумента.
При таком подходе размер шрифта регулируется элементарно через CSS-классы или переменные, переключаемые из кода 1С при смене режима масштабирования без необходимости перезагрузки и перерисовки всей формы.
Если вносить доработки в конфигурацию нельзя, задачу можно решить системными настройками самого устройства, но не через меню шрифтов, а через изменение масштаба интерфейса:
При программном увеличении кегля мобильные формы могут терять читаемость из-за наложения или обрезания полей. Чтобы интерфейс корректно масштабировался, рекомендуем придерживаться следующих правил:
ПоложениеЗаголовка в значение Верх либо полностью скрывать заголовок и использовать свойство ПодсказкаВвода.