При разработке кроссплатформенных решений на базе «1С:Предприятие 8.3» часто возникает необходимость адаптации интерфейса под конкретное устройство. Мобильный клиент имеет свои особенности отображения элементов, и стандартный «десктопный» стиль может выглядеть на нем неудобно или нечитаемо. Платформа предоставляет возможность программно изменять основной стиль конфигурации, однако этот процесс сопряжен с рядом технических нюансов, связанных с жизненным циклом сеанса.
В этой статье мы подробно разберем, как реализовать автоматическую смену стиля оформления, проанализируем причины возникновения типичных ошибок и выясним, как правильно определять тип клиента на стороне сервера.
Для управления общим оформлением системы во встроенном языке существует свойство глобального контекста ГлавныйСтиль. Оно позволяет назначить стиль из ветки метаданных Общие -> Стили в качестве основного для текущего сеанса пользователя. Однако важно понимать жесткое ограничение платформы: установить или изменить основной стиль можно только один раз — в момент инициализации сеанса.
Единственным местом, где эта операция допустима, является обработчик события УстановкаПараметровСеанса, расположенный в модуле сеанса. Попытка изменить ГлавныйСтиль в модуле управляемого приложения или в любой форме приведет к ошибке выполнения, так как к этому моменту графическая оболочка клиента уже сформирована на основе стиля по умолчанию.
Рассмотрим ситуацию, с которой сталкиваются многие разработчики: при попытке установки стиля возникает ошибка «Свойство не может быть изменено после вызова 'УстановкаПараметровСеанса'». Проанализируем причину её возникновения. Дело в том, что платформа может вызывать этот обработчик несколько раз за один сеанс:
ИменаПараметровСеанса имеет значение Неопределено. Именно в этот момент платформа ожидает инициализацию всех ключевых настроек, включая стиль.Если код установки стиля написан без проверки на первый вызов, система попытается выполнить его повторно, что и вызовет критическую ошибку. Рассмотрим правильную структуру условия в модуле сеанса:
Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса)
// Проверяем, что это самый первый запуск сеанса
Если ИменаПараметровСеанса = Неопределено Тогда
// Здесь мы можем безопасно установить стиль
// После выхода из этого блока свойство ГлавныйСтиль станет доступно только для чтения
КонецЕсли;
КонецПроцедуры
Для того чтобы применить условие выбора стиля, нам нужно понять, какой именно клиент подключается к базе. Поскольку процедура УстановкаПараметровСеанса выполняется на сервере, использование директив препроцессора типа #Если МобильныйКлиент не всегда дает ожидаемый результат, так как они относятся к среде компиляции кода, а не к типу запущенного приложения.
Наиболее надежным способом является использование метода ПолучитьТекущийСеансИнформационнойБазы(). Проанализируем свойство ИмяПриложения, которое возвращает строковый идентификатор клиента:
MobileClient — пользователь зашел через мобильный клиент 1С.1CV8 или 1CV8C — используется тонкий или толстый клиент для Windows/Linux.WebClient — подключение через браузер.Рассмотрим пример кода, реализующий выбор стиля на основе этого метода:
Если ИменаПараметровСеанса = Неопределено Тогда
ИнфоСеанса = ПолучитьТекущийСеансИнформационнойБазы();
Если ИнфоСеанса.ИмяПриложения = "MobileClient" Тогда
// Устанавливаем стиль, оптимизированный для смартфонов и планшетов
ГлавныйСтиль = БиблиотекаСтилей.zmed_СтильМобКлиент;
Иначе
// Для всех остальных случаев используем стандартное оформление
ГлавныйСтиль = БиблиотекаСтилей.zmed_Основной;
КонецЕсли;
КонецЕсли;
Разберем типичную ошибку использования директив компиляции в модуле сеанса. Часто разработчики пытаются использовать #Если МобильныйАвтономныйСервер. Важно помнить, что эта директива срабатывает только в случае работы автономной мобильной конфигурации, где серверная часть физически находится на мобильном устройстве. Если же мобильный клиент подключается к центральной базе, расположенной на обычном сервере «1С:Предприятия», то для сервера это будет обычный вызов, и сработает директива #Если Сервер.
Поэтому, если ваша задача — разделить стили именно для подключенного мобильного клиента, ориентируйтесь на свойства сеанса, а не на условия компиляции.
Если ваша конфигурация построена на базе БСП, процедура УстановкаПараметровСеанса уже содержит вызовы системных модулей, таких как СтандартныеПодсистемыСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса). В этом случае крайне важно размещать блок установки стиля до вызова процедур БСП.
Проанализируем почему: процедуры БСП могут внутри себя обращаться к функциям, которые неявно фиксируют состояние интерфейса или инициируют обращения к метаданным, после которых изменение стиля может стать невозможным. Идеальный порядок действий выглядит так:
УстановкаПараметровСеанса.ИменаПараметровСеанса = Неопределено.ГлавныйСтиль.Пример правильной последовательности кода:
Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса)
// 1. Сначала решаем вопрос со стилем интерфейса
Если ИменаПараметровСеанса = Неопределено Тогда
Если ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения = "MobileClient" Тогда
ГлавныйСтиль = БиблиотекаСтилей.СтильДляМобильныхУстройств;
КонецЕсли;
КонецЕсли;
// 2. Затем передаем управление стандартным подсистемам
СтандартныеПодсистемыСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса);
// 3. Дополнительная логика инициализации (например, подключаемое оборудование)
// ...
КонецПроцедуры
В некоторых случаях тип приложения может быть не единственным критерием. Например, вы хотите установить «упрощенный» стиль для определенных категорий сотрудников, даже если они заходят с компьютера. В этом случае внутри блока Если ИменаПараметровСеанса = Неопределено можно использовать метод РольДоступна().
Важный момент: использование проверки ролей в модуле сеанса требует осторожности, так как роли пользователя в этот момент уже должны быть считаны платформой. Рассмотрим пример:
Если ИменаПараметровСеанса = Неопределено Тогда
// Если у пользователя есть специфическая роль для работы в мобильном интерфейсе
Если РольДоступна("РаботаСМобильнымКлиентом") Тогда
ГлавныйСтиль = БиблиотекаСтилей.МобильноеОформление;
КонецЕсли;
КонецЕсли;
Однако стоит помнить, что метод с определением ИмяПриложения является более предпочтительным, так как он точно отражает техническую среду исполнения, под которую адаптируется визуальный стиль.
Программная установка стиля — мощный инструмент для создания качественного UX в 1С. Чтобы избежать ошибок, следуйте трем правилам: производите установку только при ИменаПараметровСеанса = Неопределено, делайте это в самом начале модуля сеанса и используйте ИмяПриложения для определения типа клиента. Эти простые шаги позволят вашему приложению выглядеть профессионально на любом устройстве.