Как программно вызвать калькулятор или клавиатуру в мобильном приложении 1С?

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

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

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

Проблема имитации нажатия в мобильной среде

Рассмотрим ситуацию: при выборе номенклатуры в документе реализации нам нужно, чтобы фокус автоматически переходил в поле Количество и сразу открывался числовой калькулятор. Использование стандартной функции ВвестиЗначение часто не подходит, так как она открывает модальное окно, которое может перекрывать контекст (например, название товара), что неудобно для пользователя.

Попытки использовать COMОбъект("Wscript.Shell") в мобильном приложении приведут к ошибке или зависанию, так как мобильная платформа не имеет доступа к системным оболочкам Windows. Следовательно, нам нужно использовать встроенные механизмы управления элементами формы 1С.

Решение: Комбинация управления видимостью и фокусом

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

Разберем по шагам алгоритм реализации этой задачи:

  1. Подготовка данных на сервере: Перед вызовом окна ввода обычно требуется очистить старое значение или подготовить контекст.
  2. Обновление текста редактирования: Используем метод ОбновитьТекстРедактирования(), чтобы синхронизировать состояние элемента с данными.
  3. «Перезагрузка» элемента: Выключаем и снова включаем видимость поля. Это заставляет платформу пересоздать виджет (view) элемента в памяти мобильного устройства.
  4. Передача фокуса и активация: Устанавливаем элемент как текущий и вызываем специализированный метод мобильной платформы НачатьРедактированиеЭлемента().

Посмотрим на пример кода, который реализует этот механизм:


&НаКлиенте
Процедура ПодготовитьПолеВвода()
    
    // Сначала выполняем необходимые действия на сервере
    ОчиститьПолеВводаНаСервере();
    
    // Обновляем визуальное состояние поля
    Элементы.Количество.ОбновитьТекстРедактирования();
    
    // Хак для принудительного обновления интерфейса
    Элементы.Количество.Видимость = Ложь;
    Элементы.Количество.Видимость = Истина;
    
    // Устанавливаем фокус на элемент
    ЭтаФорма.ТекущийЭлемент = Элементы.Количество;
    
    // Специальная команда для мобильной платформы
    #Если МобильноеПриложениеКлиент Тогда    
        НачатьРедактированиеЭлемента();
    #КонецЕсли
    
КонецПроцедуры

&НаСервере
Процедура ОчиститьПолеВводаНаСервере()
    Количество = 0; // Имя реквизита, связанного с полем ввода
КонецПроцедуры

Важные настройки свойств поля ввода

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

Использование обработчика ожидания для стабильности

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

Проанализируем ситуацию: мы вызываем процедуру активации не напрямую, а через ПодключитьОбработчикОжидания с минимальным интервалом (например, 0.1 секунды). Это дает платформе время завершить текущие события отрисовки и гарантированно передать фокус в поле.


&НаКлиенте
Процедура ВызватьВводКоличества()
    // Подключаем обработчик на 0.1 сек (выполнится один раз)
    ПодключитьОбработчикОжидания("ИсполнитьАктивациюПоля", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ИсполнитьАктивациюПоля()
    ЭтаФорма.ТекущийЭлемент = Элементы.Количество;
    НачатьРедактированиеЭлемента();
КонецПроцедуры

Альтернативные способы реализации

Если стандартный платформенный калькулятор не подходит под ваши требования (например, нужно отображать остатки товара прямо в процессе ввода), рассмотрим другие варианты:

1. Всплывающие формы (Popup)

В последних релизах платформы можно открывать вспомогательные формы с параметром ВариантОткрытияОкна.Всплывающее. Вы можете создать свою форму-калькулятор нужного размера. Она будет открываться поверх основной формы, не закрывая её полностью, что позволит пользователю видеть номенклатуру, для которой вводится количество.

2. Использование внешних компонент (Native API)

Для самых сложных сценариев имитации системных событий можно написать внешнюю компоненту на Java (для Android) или Swift (для iOS). Через Native API 1С позволяет обращаться к системным функциям ОС, в том числе программно управлять экранной клавиатурой. Однако это требует навыков низкоуровневого программирования и отдельной сборки мобильного приложения.

Выводы и рекомендации

Подводя итог, можно сказать, что наиболее надежным и простым способом «имитации нажатия» для вызова ввода является сочетание методов ТекущийЭлемент и НачатьРедактированиеЭлемента() с предварительным сбросом видимости поля. Это решение не требует сторонних библиотек и стабильно работает на большинстве мобильных устройств под управлением 1С.

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

← На главную