Разработка интерфейсов для мобильных устройств на платформе 1С:Предприятие существенно отличается от создания десктопных приложений. Одной из самых частых проблем, с которой сталкиваются разработчики, является невозможность стандартного использования свойства ТекущийЭлемент для позиционирования на кнопках, декорациях или группах. В мобильном клиенте и на мобильной платформе фокус ввода ведет себя иначе из-за специфики тачскрина. Рассмотрим подробнее, почему так происходит и какие существуют проверенные способы решения этой задачи.
В настольной версии 1С установка фокуса на элемент через ЭтаФорма.ТекущийЭлемент автоматически заставляет систему «увидеть» объект и, если он находится за пределами видимости, прокрутить форму. В мобильной среде понятие «фокуса» жестко связано с элементами ввода текста. Кнопки и группы не являются интерактивными объектами, требующими фокуса ввода в понимании мобильной ОС. Проанализируем ситуацию: если мы пытаемся спозиционироваться на кнопке, система игнорирует команду, так как кнопка не может принять текстовый ввод, а значит, нет смысла вызывать виртуальную клавиатуру или принудительно скроллить экран.
Самый эффективный и распространенный «хак» для принудительного скроллинга — использование фиктивного поля ввода. Мобильная платформа всегда старается отобразить поле ввода, на которое программно передан фокус, чтобы пользователь мог сразу начать печатать. Мы можем использовать это поведение в своих целях.
Разберем по шагам, как это реализовать:
Строка.ПолеЯкорь.Рассмотрим пример кода:
&НаКлиенте
Процедура ДобавитьГруппуИПроскроллить()
// Логика добавления элементов или изменения видимости
Элементы.ГруппаРезультат.Видимость = Истина;
// Принудительное позиционирование
ЭтаФорма.ТекущийЭлемент = Элементы.ПолеЯкорь;
КонецПроцедуры
Важный нюанс: при установке фокуса на текстовое поле у пользователя может открыться виртуальная клавиатура. Чтобы этого избежать, можно попробовать использовать поле с флагом ТолькоПросмотр = Истина, однако на некоторых версиях платформы это может блокировать автоматический скроллинг. Рекомендуется протестировать поведение на конкретном мобильном устройстве.
Если форма получается слишком длинной и требует постоянного скроллинга, это сигнал к тому, что интерфейс стоит пересмотреть. В мобильной разработке вместо длинных «простыней» принято использовать страницы (вкладки). Выясним причину, почему это лучше: пользователь видит только актуальную информацию, а системе не нужно рассчитывать координаты для прокрутки.
Проанализируем программный переход между страницами:
&НаКлиенте
Процедура ПерейтиКРезультатам()
// Вместо скроллинга просто переключаем активную страницу
Элементы.ОсновнаяПанель.ТекущаяСтраница = Элементы.СтраницаРезультат;
КонецПроцедуры
Использование страниц с типом ЗакладкиНиз или вообще без отображения закладок (программное переключение) — это «золотой стандарт» мобильного UX в 1С. Это полностью снимает вопрос о позиционировании, так как новый контент всегда открывается в верхней части экрана.
Если в той области, куда нужно проскроллить форму, находится таблица (например, список товаров или лог событий), можно использовать методы самой таблицы. Метод Активизировать() у элемента таблицы часто инициирует визуальный переход к этому объекту даже на мобильном клиенте.
Посмотрим на пример работы со строками таблицы:
&НаКлиенте
Процедура СпозиционироватьсяНаТаблице()
// Устанавливаем текущую строку, если нужно перейти к конкретной записи
Если Объект.Товары.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока = Объект.Товары[Объект.Товары.Количество() - 1].ПолучитьИдентификатор();
КонецЕсли;
// Активизируем саму таблицу
Элементы.Товары.Активизировать();
КонецПроцедуры
Этот способ хорошо работает, если в конце формы располагается динамический список или табличная часть.
Вместо того чтобы заставлять форму скроллиться вниз, мы можем скрыть верхние блоки, которые в данный момент не нужны. В этом случае целевая группа сама «поднимется» вверх к глазам пользователя.
Рассмотрим ситуацию: у нас есть блок фильтров и блок результатов. При нажатии на кнопку «Показать» мы сворачиваем фильтры:
&НаКлиенте
Процедура ВыполнитьПоиск()
// Скрываем блок заголовка или фильтров
Элементы.ГруппаШапка.Видимость = Ложь;
// Показываем результат - он окажется вверху формы
Элементы.ГруппаРезультат.Видимость = Истина;
КонецПроцедуры
Выясним важную техническую деталь: мобильная платформа иногда не успевает пересчитать геометрию формы сразу после изменения видимости элементов. Если вы меняете видимость группы и тут же пытаетесь в коде установить ТекущийЭлемент, скроллинг может не произойти, так как система еще «считает», что элемент невидим или имеет нулевые координаты.
В таких случаях поможет небольшая задержка. Разберем реализацию:
&НаКлиенте
Процедура ПоказатьИПерейти()
Элементы.НужнаяГруппа.Видимость = Истина;
// Даем платформе 0.1 секунды на перерисовку интерфейса
ПодключитьОбработчикОжидания("УстановитьФокусНаЭлемент", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьФокусНаЭлемент()
ЭтаФорма.ТекущийЭлемент = Элементы.ПолеЯкорь;
КонецПроцедуры
Резюмируем: Для надежного позиционирования в мобильном приложении 1С рекомендуется сочетать использование «якорных» полей ввода с управлением видимостью групп или переключением страниц. Помните, что интерфейс мобильного приложения должен быть лаконичным, и если вам требуется сложный программный скроллинг, возможно, стоит упростить структуру самой формы.