Как программно установить разные стили оформления для мобильного и тонкого клиента в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке кроссплатформенных решений на базе «1С:Предприятие 8.3» часто возникает необходимость адаптации интерфейса под конкретное устройство. Мобильный клиент имеет свои особенности отображения элементов, и стандартный «десктопный» стиль может выглядеть на нем неудобно или нечитаемо. Платформа предоставляет возможность программно изменять основной стиль конфигурации, однако этот процесс сопряжен с рядом технических нюансов, связанных с жизненным циклом сеанса.

В этой статье мы подробно разберем, как реализовать автоматическую смену стиля оформления, проанализируем причины возникновения типичных ошибок и выясним, как правильно определять тип клиента на стороне сервера.

Особенности свойства ГлавныйСтиль и механизма его инициализации

Для управления общим оформлением системы во встроенном языке существует свойство глобального контекста ГлавныйСтиль. Оно позволяет назначить стиль из ветки метаданных Общие -> Стили в качестве основного для текущего сеанса пользователя. Однако важно понимать жесткое ограничение платформы: установить или изменить основной стиль можно только один раз — в момент инициализации сеанса.

Единственным местом, где эта операция допустима, является обработчик события УстановкаПараметровСеанса, расположенный в модуле сеанса. Попытка изменить ГлавныйСтиль в модуле управляемого приложения или в любой форме приведет к ошибке выполнения, так как к этому моменту графическая оболочка клиента уже сформирована на основе стиля по умолчанию.

Проблема повторного вызова процедуры УстановкаПараметровСеанса

Рассмотрим ситуацию, с которой сталкиваются многие разработчики: при попытке установки стиля возникает ошибка «Свойство не может быть изменено после вызова 'УстановкаПараметровСеанса'». Проанализируем причину её возникновения. Дело в том, что платформа может вызывать этот обработчик несколько раз за один сеанс:

  1. Первый вызов: происходит при старте приложения, когда массив ИменаПараметровСеанса имеет значение Неопределено. Именно в этот момент платформа ожидает инициализацию всех ключевых настроек, включая стиль.
  2. Последующие вызовы: происходят, когда код обращается к конкретному параметру сеанса, который еще не был инициализирован. В этом случае в процедуру передается массив с именами конкретных параметров.

Если код установки стиля написан без проверки на первый вызов, система попытается выполнить его повторно, что и вызовет критическую ошибку. Рассмотрим правильную структуру условия в модуле сеанса:


Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса)
    
    // Проверяем, что это самый первый запуск сеанса
    Если ИменаПараметровСеанса = Неопределено Тогда
        
        // Здесь мы можем безопасно установить стиль
        // После выхода из этого блока свойство ГлавныйСтиль станет доступно только для чтения
        
    КонецЕсли;

КонецПроцедуры

Как безошибочно определить мобильный клиент на сервере

Для того чтобы применить условие выбора стиля, нам нужно понять, какой именно клиент подключается к базе. Поскольку процедура УстановкаПараметровСеанса выполняется на сервере, использование директив препроцессора типа #Если МобильныйКлиент не всегда дает ожидаемый результат, так как они относятся к среде компиляции кода, а не к типу запущенного приложения.

Наиболее надежным способом является использование метода ПолучитьТекущийСеансИнформационнойБазы(). Проанализируем свойство ИмяПриложения, которое возвращает строковый идентификатор клиента:

Рассмотрим пример кода, реализующий выбор стиля на основе этого метода:


Если ИменаПараметровСеанса = Неопределено Тогда
    
    ИнфоСеанса = ПолучитьТекущийСеансИнформационнойБазы();
    
    Если ИнфоСеанса.ИмяПриложения = "MobileClient" Тогда
        // Устанавливаем стиль, оптимизированный для смартфонов и планшетов
        ГлавныйСтиль = БиблиотекаСтилей.zmed_СтильМобКлиент;
    Иначе
        // Для всех остальных случаев используем стандартное оформление
        ГлавныйСтиль = БиблиотекаСтилей.zmed_Основной;
    КонецЕсли;
    
КонецЕсли;

Нюансы работы с директивами препроцессора

Разберем типичную ошибку использования директив компиляции в модуле сеанса. Часто разработчики пытаются использовать #Если МобильныйАвтономныйСервер. Важно помнить, что эта директива срабатывает только в случае работы автономной мобильной конфигурации, где серверная часть физически находится на мобильном устройстве. Если же мобильный клиент подключается к центральной базе, расположенной на обычном сервере «1С:Предприятия», то для сервера это будет обычный вызов, и сработает директива #Если Сервер.

Поэтому, если ваша задача — разделить стили именно для подключенного мобильного клиента, ориентируйтесь на свойства сеанса, а не на условия компиляции.

Интеграция с Библиотекой стандартных подсистем (БСП)

Если ваша конфигурация построена на базе БСП, процедура УстановкаПараметровСеанса уже содержит вызовы системных модулей, таких как СтандартныеПодсистемыСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса). В этом случае крайне важно размещать блок установки стиля до вызова процедур БСП.

Проанализируем почему: процедуры БСП могут внутри себя обращаться к функциям, которые неявно фиксируют состояние интерфейса или инициируют обращения к метаданным, после которых изменение стиля может стать невозможным. Идеальный порядок действий выглядит так:

  1. Вход в процедуру УстановкаПараметровСеанса.
  2. Проверка ИменаПараметровСеанса = Неопределено.
  3. Определение типа клиента и установка ГлавныйСтиль.
  4. Вызов стандартных обработчиков БСП.
  5. Инициализация остальных параметров сеанса.

Пример правильной последовательности кода:


Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса)
    
    // 1. Сначала решаем вопрос со стилем интерфейса
    Если ИменаПараметровСеанса = Неопределено Тогда
        Если ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения = "MobileClient" Тогда
            ГлавныйСтиль = БиблиотекаСтилей.СтильДляМобильныхУстройств;
        КонецЕсли;
    КонецЕсли;
    
    // 2. Затем передаем управление стандартным подсистемам
    СтандартныеПодсистемыСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса);
    
    // 3. Дополнительная логика инициализации (например, подключаемое оборудование)
    // ...
КонецПроцедуры

Альтернативные проверки: роли и права доступа

В некоторых случаях тип приложения может быть не единственным критерием. Например, вы хотите установить «упрощенный» стиль для определенных категорий сотрудников, даже если они заходят с компьютера. В этом случае внутри блока Если ИменаПараметровСеанса = Неопределено можно использовать метод РольДоступна().

Важный момент: использование проверки ролей в модуле сеанса требует осторожности, так как роли пользователя в этот момент уже должны быть считаны платформой. Рассмотрим пример:


Если ИменаПараметровСеанса = Неопределено Тогда
    // Если у пользователя есть специфическая роль для работы в мобильном интерфейсе
    Если РольДоступна("РаботаСМобильнымКлиентом") Тогда
        ГлавныйСтиль = БиблиотекаСтилей.МобильноеОформление;
    КонецЕсли;
КонецЕсли;

Однако стоит помнить, что метод с определением ИмяПриложения является более предпочтительным, так как он точно отражает техническую среду исполнения, под которую адаптируется визуальный стиль.

Резюме

Программная установка стиля — мощный инструмент для создания качественного UX в 1С. Чтобы избежать ошибок, следуйте трем правилам: производите установку только при ИменаПараметровСеанса = Неопределено, делайте это в самом начале модуля сеанса и используйте ИмяПриложения для определения типа клиента. Эти простые шаги позволят вашему приложению выглядеть профессионально на любом устройстве.

← На главную