Как программно скрыть подсистемы в мобильном приложении 1С

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

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

Метод 1. Использование функциональных опций

Это самый надежный и гибкий способ управления видимостью метаданных в 1С «на лету». Функциональные опции (ФО) позволяют привязывать видимость подсистем, документов или отчетов к определенному значению (параметру), который может меняться программно.

Для реализации этого метода выполним следующие шаги:

  1. Создадим в конфигураторе Константу (например, ИспользоватьМобильныйИнтерфейс) или Параметр сеанса типа Булево.
  2. Создадим объект Функциональная опция, где в качестве «Хранилища» выберем нашу константу или параметр сеанса.
  3. На вкладке «Состав» функциональной опции отметим те подсистемы, которые должны быть видны только при включенной опции.
  4. В модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы пропишем логику включения или выключения этой опции.

Рассмотрим пример кода для определения типа платформы и установки параметра функциональной опции:


Процедура ПриНачалеРаботыСистемы()
    #Если МобильныйКлиент Или МобильноеПриложение Тогда
        // Если зашли с мобильного устройства, отключаем "лишние" опции
        УстановитьПараметрыФункциональныхОпций(Новый Структура("ПоказыватьПолныйИнтерфейс", Ложь));
    #Иначе
        // Для обычного компьютера включаем всё
        УстановитьПараметрыФункциональныхОпций(Новый Структура("ПоказыватьПолныйИнтерфейс", Истина));
    #КонецЕсли
КонецПроцедуры

Важно помнить: после изменения значений параметров функциональных опций в коде, чтобы интерфейс обновился мгновенно без перезагрузки приложения, необходимо вызвать метод ОбновитьИнтерфейс().

Метод 2. Настройка прав и ролей для мобильных пользователей

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

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

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

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

Метод 3. Разделение интерфейса через тип платформы

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

Разберем, как это настроить в конфигураторе:

  1. Откроем свойства корневого узла конфигурации.
  2. Найдем пункт «Интерфейс мобильного приложения».
  3. Здесь можно четко определить список подсистем, которые будут доступны именно в мобильном варианте.

Это самый простой «бескодовый» способ. Если подсистема не включена в этот список, она не появится на смартфоне, даже если у пользователя полные права.

Метод 4. Программная проверка через ИнформацияСистемы

Если нам нужно более тонкое управление (например, скрывать подсистемы только на Android или только на планшетах), мы можем использовать объект ИнформацияСистемы. Это поможет нам точно идентифицировать устройство.

Посмотрим на пример кода:


Инфо = Новый ИнформацияСистемы;
Если Инфо.ТипПлатформы = ТипПлатформы.Android Тогда
    // Логика специально для Android-устройств
    // Например, установка параметров сеанса, влияющих на видимость
КонецЕсли;

Совмещая этот метод с функциональными опциями, мы получаем полный контроль над тем, что видит пользователь в зависимости от его гаджета.

Почему динамическое изменение ролей — плохая идея?

Как было замечено в обсуждении, попытка использовать код типа ПользовательИБ.Роли.Добавить(...) внутри сеанса не решает проблему «здесь и сейчас». Роли — это жесткая структура безопасности. Платформа считывает их один раз при авторизации. Если вы хотите динамики — используйте Функциональные опции. Они специально созданы для того, чтобы менять видимость интерфейса без необходимости перезахода в базу и изменения административных настроек пользователя.

Итоги

Для эффективного скрытия подсистем в мобильном приложении мы рекомендуем:

← На главную