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