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