При разработке интерфейсов для мобильных устройств (мобильный клиент или мобильное приложение 1С) критически важно минимизировать количество нажатий, которые совершает пользователь. Одной из частых задач является автоматический вызов диалога ввода числа (встроенного калькулятора) сразу после открытия формы, чтобы пользователю не приходилось лишний раз тапать по полю ввода. В этой статье мы подробно разберем, как реализовать этот функционал, проанализируем типичные ошибки и рассмотрим альтернативные способы решения задачи.
Когда мы работаем на обычном компьютере, достаточно установить свойство ТекущийЭлемент или использовать свойство АктивизироватьПоУмолчанию, чтобы фокус перешел в поле ввода. Однако в мобильном клиенте простая активация элемента лишь подсвечивает его или вызывает системную клавиатуру ОС, но не открывает специализированный числовой диалог (калькулятор 1С), который обычно появляется при нажатии на кнопку выбора или двойном тапе по полю.
Рассмотрим ситуацию: у нас есть числовой реквизит формы, и мы хотим, чтобы при открытии формы калькулятор «выпрыгивал» автоматически. Попытка вызвать методы редактирования непосредственно в процедуре ПриОткрытии часто заканчивается неудачей, так как графическая оболочка формы в этот момент еще не завершила процесс отрисовки, и команды управления фокусом могут игнорироваться.
Наиболее надежным способом программной имитации нажатия на поле ввода является метод формы НачатьРедактированиеЭлемента(). Этот метод заставляет платформу перевести указанный элемент в режим правки, что в случае с числовым полем инициирует открытие калькулятора.
Однако, как мы выяснили, вызов этого метода напрямую в ПриОткрытии или ПриСозданииНаСервере не даст результата. Разберем правильный алгоритм реализации через однократный обработчик ожидания.
Шаг 1. Подготовка модуля формы. Создадим процедуру, которая будет вызывать диалог, и подключим её в событии открытия.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Устанавливаем фокус на нужное поле
ЭтаФорма.ТекущийЭлемент = Элементы.Количество;
// Подключаем обработчик ожидания с минимальной задержкой.
// Интервала 0.1 секунды обычно достаточно, чтобы форма успела отобразиться.
ПодключитьОбработчикОжидания("Подключаемый_ОткрытьКалькулятор", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОткрытьКалькулятор()
// Метод НачатьРедактированиеЭлемента имитирует интерактивное начало ввода
#Если МобильноеПриложениеКлиент Или МобильныйКлиент Тогда
НачатьРедактированиеЭлемента();
#КонецЕсли
КонецПроцедуры
Проанализируем этот код: использование директив препроцессора #Если МобильныйКлиент позволяет коду корректно работать на разных платформах. Метод НачатьРедактированиеЭлемента без параметров воздействует на ТекущийЭлемент формы.
Существует еще один «ленивый» способ добиться автоматического появления диалога ввода, не прибегая к написанию кода в обработчике ожидания. Это использование свойства элемента формы АвтоВыборНезаполненного (или AutoChoiceIncomplete).
Если установить это свойство в значение Истина, платформа 1С самостоятельно попытается открыть диалог выбора, если значение реквизита является пустым (для числа это 0). Рассмотрим особенности этого метода:
Если стандартный калькулятор поля ввода по каким-то причинам не подходит (например, вам нужно кастомизировать заголовок окна или выполнить сложные расчеты перед записью), можно использовать метод ПоказатьВводЧисла. Это асинхронный метод, который гарантированно открывает системный диалог поверх всех окон.
Разберем пример реализации:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВводаЧисла", ЭтаФорма);
ПоказатьВводЧисла(ОписаниеОповещения, 0, "Введите количество товара:");
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаЧисла(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
Объект.Количество = Результат;
КонецЕсли;
КонецПроцедуры
Этот подход полезен тем, что он не зависит от состояния фокуса элементов формы. Однако он создает отдельное модальное (в контексте пользователя) окно, что может не всегда соответствовать дизайну приложения.
Для того чтобы метод НачатьРедактированиеЭлемента работал корректно и вызывал именно калькулятор, проверьте следующие настройки в конфигураторе для вашего поля ввода:
Число.КнопкаВыбора должно быть установлено в значение Да (или Авто). Если кнопку скрыть, платформа может вызвать обычную клавиатуру вместо калькулятора.Да помогает платформе понять, что приоритетным способом заполнения является выбор из диалога.В ходе практики выяснилось, что на «тяжелых» формах или на бюджетных мобильных устройствах задержки в 0.1 секунды может быть недостаточно. Если вы заметили, что калькулятор открывается через раз, попробуйте увеличить интервал до 0.3 или 0.5 секунды. Это даст графической подсистеме Android или iOS достаточно времени, чтобы завершить анимацию открытия окна и корректно принять фокус ввода.
Также помните, что метод НачатьРедактированиеЭлемента эффективен только тогда, когда элемент визуально доступен на экране. Если поле ввода находится на второй (неактивной) странице панели, сначала нужно программно переключить текущую страницу, а только потом вызывать редактирование.