Как программно открыть калькулятор для ввода числа при открытии управляемой формы в мобильном клиенте 1С?

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

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

Проблема: почему стандартная активация поля не вызывает калькулятор

Когда мы работаем на обычном компьютере, достаточно установить свойство ТекущийЭлемент или использовать свойство АктивизироватьПоУмолчанию, чтобы фокус перешел в поле ввода. Однако в мобильном клиенте простая активация элемента лишь подсвечивает его или вызывает системную клавиатуру ОС, но не открывает специализированный числовой диалог (калькулятор 1С), который обычно появляется при нажатии на кнопку выбора или двойном тапе по полю.

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

Решение №1: Использование метода НачатьРедактированиеЭлемента через обработчик ожидания

Наиболее надежным способом программной имитации нажатия на поле ввода является метод формы НачатьРедактированиеЭлемента(). Этот метод заставляет платформу перевести указанный элемент в режим правки, что в случае с числовым полем инициирует открытие калькулятора.

Однако, как мы выяснили, вызов этого метода напрямую в ПриОткрытии или ПриСозданииНаСервере не даст результата. Разберем правильный алгоритм реализации через однократный обработчик ожидания.

Шаг 1. Подготовка модуля формы. Создадим процедуру, которая будет вызывать диалог, и подключим её в событии открытия.


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

&НаКлиенте
Процедура Подключаемый_ОткрытьКалькулятор()
    // Метод НачатьРедактированиеЭлемента имитирует интерактивное начало ввода
    #Если МобильноеПриложениеКлиент Или МобильныйКлиент Тогда    
        НачатьРедактированиеЭлемента();
    #КонецЕсли
КонецПроцедуры

Проанализируем этот код: использование директив препроцессора #Если МобильныйКлиент позволяет коду корректно работать на разных платформах. Метод НачатьРедактированиеЭлемента без параметров воздействует на ТекущийЭлемент формы.

Решение №2: Использование свойства АвтоВыборНезаполненного

Существует еще один «ленивый» способ добиться автоматического появления диалога ввода, не прибегая к написанию кода в обработчике ожидания. Это использование свойства элемента формы АвтоВыборНезаполненного (или AutoChoiceIncomplete).

Если установить это свойство в значение Истина, платформа 1С самостоятельно попытается открыть диалог выбора, если значение реквизита является пустым (для числа это 0). Рассмотрим особенности этого метода:

Решение №3: Асинхронный метод ПоказатьВводЧисла

Если стандартный калькулятор поля ввода по каким-то причинам не подходит (например, вам нужно кастомизировать заголовок окна или выполнить сложные расчеты перед записью), можно использовать метод ПоказатьВводЧисла. Это асинхронный метод, который гарантированно открывает системный диалог поверх всех окон.

Разберем пример реализации:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВводаЧисла", ЭтаФорма);
    ПоказатьВводЧисла(ОписаниеОповещения, 0, "Введите количество товара:");
КонецПроцедуры

&НаКлиенте
Процедура ПослеВводаЧисла(Результат, ДополнительныеПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        Объект.Количество = Результат;
    КонецЕсли;
КонецПроцедуры

Этот подход полезен тем, что он не зависит от состояния фокуса элементов формы. Однако он создает отдельное модальное (в контексте пользователя) окно, что может не всегда соответствовать дизайну приложения.

Важные настройки элементов формы

Для того чтобы метод НачатьРедактированиеЭлемента работал корректно и вызывал именно калькулятор, проверьте следующие настройки в конфигураторе для вашего поля ввода:

  1. Тип значения: Убедитесь, что реквизит имеет тип Число.
  2. Кнопка выбора: Свойство КнопкаВыбора должно быть установлено в значение Да (или Авто). Если кнопку скрыть, платформа может вызвать обычную клавиатуру вместо калькулятора.
  3. Выбирать при вводе: Установка этого свойства в значение Да помогает платформе понять, что приоритетным способом заполнения является выбор из диалога.
  4. Только просмотр: Убедитесь, что это свойство выключено, иначе редактирование (и вызов калькулятора) будет заблокировано.

Рекомендации по задержке в обработчике ожидания

В ходе практики выяснилось, что на «тяжелых» формах или на бюджетных мобильных устройствах задержки в 0.1 секунды может быть недостаточно. Если вы заметили, что калькулятор открывается через раз, попробуйте увеличить интервал до 0.3 или 0.5 секунды. Это даст графической подсистеме Android или iOS достаточно времени, чтобы завершить анимацию открытия окна и корректно принять фокус ввода.

Также помните, что метод НачатьРедактированиеЭлемента эффективен только тогда, когда элемент визуально доступен на экране. Если поле ввода находится на второй (неактивной) странице панели, сначала нужно программно переключить текущую страницу, а только потом вызывать редактирование.

← На главную