При разработке мобильных решений на платформе 1С часто возникает задача разделения интерфейса. Например, когда одно и то же решение используется и как полнофункциональное настольное приложение, и как упрощенный мобильный клиент. В такой ситуации необходимо скрыть «тяжелые» или ненужные подсистемы для мобильных пользователей, чтобы не перегружать интерфейс и обеспечить безопасность данных. Рассмотрим подробно, как это реализовать, и разберем наиболее эффективные методы.
Это самый надежный и гибкий способ управления видимостью метаданных в 1С «на лету». Функциональные опции (ФО) позволяют привязывать видимость подсистем, документов или отчетов к определенному значению (параметру), который может меняться программно.
Для реализации этого метода выполним следующие шаги:
ИспользоватьМобильныйИнтерфейс) или Параметр сеанса типа Булево.ПриНачалеРаботыСистемы пропишем логику включения или выключения этой опции.Рассмотрим пример кода для определения типа платформы и установки параметра функциональной опции:
Процедура ПриНачалеРаботыСистемы()
#Если МобильныйКлиент Или МобильноеПриложение Тогда
// Если зашли с мобильного устройства, отключаем "лишние" опции
УстановитьПараметрыФункциональныхОпций(Новый Структура("ПоказыватьПолныйИнтерфейс", Ложь));
#Иначе
// Для обычного компьютера включаем всё
УстановитьПараметрыФункциональныхОпций(Новый Структура("ПоказыватьПолныйИнтерфейс", Истина));
#КонецЕсли
КонецПроцедуры
Важно помнить: после изменения значений параметров функциональных опций в коде, чтобы интерфейс обновился мгновенно без перезагрузки приложения, необходимо вызвать метод ОбновитьИнтерфейс().
Если задача стоит в разделении доступа для конкретных пользователей, логично использовать механизм ролей. В 1С можно настроить видимость подсистем напрямую в свойствах роли. Однако здесь есть важный нюанс, который обсуждался на форуме: программное изменение ролей текущего пользователя не вступает в силу немедленно.
Проанализируем ситуацию: если мы попытаемся добавить роль через объект ПользователиИнформационнойБазы при начале работы системы, изменения применятся только при следующем входе в программу. Поэтому для мобильных устройств лучше использовать следующий подход:
Таким образом, платформа сама отсечет лишние элементы интерфейса на этапе загрузки метаданных, основываясь на правах доступа.
Платформа 1С позволяет использовать инструкции препроцессора для разделения логики. Если нам нужно, чтобы определенные куски кода или элементы управления вообще не попадали в мобильный клиент, мы используем конструкцию #Если МобильныйКлиент. Однако для подсистем это работает иначе: мы можем управлять их составом через свойство конфигурации «Интерфейс мобильного приложения».
Разберем, как это настроить в конфигураторе:
Это самый простой «бескодовый» способ. Если подсистема не включена в этот список, она не появится на смартфоне, даже если у пользователя полные права.
Если нам нужно более тонкое управление (например, скрывать подсистемы только на Android или только на планшетах), мы можем использовать объект ИнформацияСистемы. Это поможет нам точно идентифицировать устройство.
Посмотрим на пример кода:
Инфо = Новый ИнформацияСистемы;
Если Инфо.ТипПлатформы = ТипПлатформы.Android Тогда
// Логика специально для Android-устройств
// Например, установка параметров сеанса, влияющих на видимость
КонецЕсли;
Совмещая этот метод с функциональными опциями, мы получаем полный контроль над тем, что видит пользователь в зависимости от его гаджета.
Как было замечено в обсуждении, попытка использовать код типа ПользовательИБ.Роли.Добавить(...) внутри сеанса не решает проблему «здесь и сейчас». Роли — это жесткая структура безопасности. Платформа считывает их один раз при авторизации. Если вы хотите динамики — используйте Функциональные опции. Они специально созданы для того, чтобы менять видимость интерфейса без необходимости перезахода в базу и изменения административных настроек пользователя.
Для эффективного скрытия подсистем в мобильном приложении мы рекомендуем:
ОбновитьИнтерфейс(), если настройки видимости меняются в процессе работы сеанса.