Как программно прокрутить форму и спозиционироваться на элементе в мобильном приложении 1С

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

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

Анализ проблемы: почему ТекущийЭлемент не всегда работает

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

Решение 1: Метод «Якоря» с использованием скрытого поля ввода

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

Разберем по шагам, как это реализовать:

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

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


&НаКлиенте
Процедура ДобавитьГруппуИПроскроллить()
    // Логика добавления элементов или изменения видимости
    Элементы.ГруппаРезультат.Видимость = Истина;
    
    // Принудительное позиционирование
    ЭтаФорма.ТекущийЭлемент = Элементы.ПолеЯкорь;
КонецПроцедуры

Важный нюанс: при установке фокуса на текстовое поле у пользователя может открыться виртуальная клавиатура. Чтобы этого избежать, можно попробовать использовать поле с флагом ТолькоПросмотр = Истина, однако на некоторых версиях платформы это может блокировать автоматический скроллинг. Рекомендуется протестировать поведение на конкретном мобильном устройстве.

Решение 2: Использование механизма страниц (Панели)

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

Проанализируем программный переход между страницами:


&НаКлиенте
Процедура ПерейтиКРезультатам()
    // Вместо скроллинга просто переключаем активную страницу
    Элементы.ОсновнаяПанель.ТекущаяСтраница = Элементы.СтраницаРезультат;
КонецПроцедуры

Использование страниц с типом ЗакладкиНиз или вообще без отображения закладок (программное переключение) — это «золотой стандарт» мобильного UX в 1С. Это полностью снимает вопрос о позиционировании, так как новый контент всегда открывается в верхней части экрана.

Решение 3: Активизация табличных частей

Если в той области, куда нужно проскроллить форму, находится таблица (например, список товаров или лог событий), можно использовать методы самой таблицы. Метод Активизировать() у элемента таблицы часто инициирует визуальный переход к этому объекту даже на мобильном клиенте.

Посмотрим на пример работы со строками таблицы:


&НаКлиенте
Процедура СпозиционироватьсяНаТаблице()
    // Устанавливаем текущую строку, если нужно перейти к конкретной записи
    Если Объект.Товары.Количество() > 0 Тогда
        Элементы.Товары.ТекущаяСтрока = Объект.Товары[Объект.Товары.Количество() - 1].ПолучитьИдентификатор();
    КонецЕсли;
    
    // Активизируем саму таблицу
    Элементы.Товары.Активизировать();
КонецПроцедуры

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

Решение 4: Управление видимостью и «подъем» контента

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

Рассмотрим ситуацию: у нас есть блок фильтров и блок результатов. При нажатии на кнопку «Показать» мы сворачиваем фильтры:


&НаКлиенте
Процедура ВыполнитьПоиск()
    // Скрываем блок заголовка или фильтров
    Элементы.ГруппаШапка.Видимость = Ложь;
    
    // Показываем результат - он окажется вверху формы
    Элементы.ГруппаРезультат.Видимость = Истина;
КонецПроцедуры

Особенности отрисовки: ПодключитьОбработчикОжидания

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

В таких случаях поможет небольшая задержка. Разберем реализацию:


&НаКлиенте
Процедура ПоказатьИПерейти()
    Элементы.НужнаяГруппа.Видимость = Истина;
    // Даем платформе 0.1 секунды на перерисовку интерфейса
    ПодключитьОбработчикОжидания("УстановитьФокусНаЭлемент", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФокусНаЭлемент()
    ЭтаФорма.ТекущийЭлемент = Элементы.ПолеЯкорь;
КонецПроцедуры

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

← На главную