Как реализовать сканирование штрихкодов в мобильном браузере на Android без использования внешних компонент

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

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

Почему стандартные методы не работают в мобильных браузерах

Прежде чем переходить к решениям, выясним причину проблемы. При работе через браузеры Chrome или Opera на Android в игру вступают жесткие политики безопасности и особенности обработки событий ввода:

  1. Ограничение программного фокуса (Autofocus Policy): Мобильные браузеры часто блокируют попытки 1С принудительно установить фокус в поле ввода через ЭтаФорма.ТекущийЭлемент, если это действие не вызвано физическим нажатием пользователя на экран.
  2. Специфика экранных клавиатур (IME): Android-клавиатуры часто перехватывают ввод и возвращают неопределенный код клавиши 229 вместо реальных символов префикса. Это ломает механизм «горячих клавиш» 1С, которые просто «не узнают» входящий символ.
  3. Задержки передачи: Браузерный JavaScript-движок может обрабатывать символы, поступающие от сканера на высокой скорости, как единую неразрывную строку или, наоборот, прерывать поток данных, из-за чего фокус «вылетает» из нужного элемента.

Решение №1: Использование командной панели для горячих клавиш

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

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

Решение №2: Поле HTML-документа и JavaScript (Наиболее надежный метод)

Если стандартные поля ввода 1С ведут себя непредсказуемо, мы можем использовать Поле HTML-документа. Это позволяет нам внедрить собственный JavaScript-код, который будет перехватывать события клавиатуры на более низком уровне, игнорируя многие ограничения платформы 1С. Рассмотрим этот алгоритм подробнее:

Создадим на форме реквизит с типом Строка и свяжем его с элементом формы Поле HTML-документа. В это поле мы загрузим простейшую HTML-страницу с невидимым полем ввода input.

Пример структуры HTML-текста для загрузки:


<html>
<body>
    <input type="text" id="barcodeScanner" style="opacity: 0; position: absolute;" inputmode="none">
    <script>
        document.addEventListener('keydown', function(event) {
            // Логика перехвата символов
            var input = document.getElementById('barcodeScanner');
            input.focus();
        });
        
        // Передача данных обратно в 1С при завершении ввода (например, по Enter)
        document.getElementById('barcodeScanner').addEventListener('change', function() {
            var barcode = this.value;
            // Вызов события 1С через механизм взаимодействия
            window.parent.postMessage('barcode:' + barcode, '*');
            this.value = '';
        });
    </script>
</body>
</html>

Важный момент: использование атрибута inputmode="none" позволяет полю принимать данные от сканера, но при этом не вызывает всплывающую виртуальную клавиатуру Android, которая обычно перекрывает половину интерфейса и мешает работе.

Решение №3: Настройка аппаратной части сканера

Иногда проблему можно решить не программным кодом, а правильной конфигурацией самого устройства. Рассмотрим параметры, которые критичны для работы с веб-клиентом:

Решение №4: Принудительная активизация поля ввода

Если вы решили остаться на стандартных полях ввода 1С, выясним причину потери фокуса. В мобильном браузере фокус часто теряется после выполнения серверного вызова. Посмотрим на пример кода, который пытается вернуть фокус через обработчик ожидания, что иногда помогает обойти ограничения Android:


&Процедура ПриОткрытии(Отказ)
    ПодключитьОбработчикОжидания("УстановитьФокусНаСканер", 0.5, Истина);
КонецПроцедуры

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

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

Сравнение методов и рекомендации

Проанализировав все доступные варианты, можно сделать следующие выводы:

  1. Стандартные горячие кнопки: Самый нестабильный вариант для Android-браузеров. Подходит только для простых сценариев и требует тщательного подбора префиксов.
  2. Поле ввода с суффиксом Enter: Хорошо работает, если удается удерживать фокус. Требует от пользователя дисциплины (не нажимать на другие элементы формы).
  3. HTML-поле с JS: Самый профессиональный и надежный способ для веб-клиента. Позволяет полностью контролировать процесс ввода и состояние клавиатуры.
  4. Мобильный клиент 1С: Если бизнес-процесс позволяет, лучше отказаться от браузера в пользу Мобильного клиента. Он нативно поддерживает библиотеку подключаемого оборудования (БПО) и позволяет работать со сканером через «Внешнее событие», что полностью снимает все вопросы с фокусом и горячими клавишами.

Таким образом, для реализации качественного сканирования в браузере без компонент, мы рекомендуем комбинировать настройку задержек на сканере и использование Поля HTML-документа для гарантированного перехвата данных штрихкода.

← На главную