Работа с торговым оборудованием в среде мобильного веб-клиента 1С часто сопряжена с трудностями, которые не возникают в десктопных версиях. Одной из наиболее острых проблем является некорректная работа сканеров штрихкодов, настроенных в режиме «разрыв клавиатуры» (Keyboard Wedge), когда данные передаются в браузер как последовательность нажатых клавиш. В этой статье мы подробно проанализируем, почему «горячие кнопки» и поля ввода могут не срабатывать на Android, и разберем по шагам альтернативные методы реализации задачи без установки дополнительных драйверов.
Прежде чем переходить к решениям, выясним причину проблемы. При работе через браузеры Chrome или Opera на Android в игру вступают жесткие политики безопасности и особенности обработки событий ввода:
ЭтаФорма.ТекущийЭлемент, если это действие не вызвано физическим нажатием пользователя на экран.229 вместо реальных символов префикса. Это ломает механизм «горячих клавиш» 1С, которые просто «не узнают» входящий символ.Как показывает практика, горячие клавиши, привязанные к обычным кнопкам на форме, в мобильном вебе могут игнорироваться. Однако существует эмпирическое наблюдение, что кнопки, размещенные непосредственно в Командной панели формы или таблицы, имеют более высокий приоритет обработки в веб-клиенте. Разберем, как это реализовать:
Разместим команду в командной панели и назначим ей сочетание клавиш (префикс сканера). Если сканер посылает, например, латинскую букву «F» перед штрихкодом, мы можем привязать эту букву к кнопке. Проанализируем ситуацию: в некоторых случаях это помогает браузеру корректно сопоставить ввод с действием на форме. Тем не менее, этот метод остается нестабильным из-за особенностей Android IME.
Если стандартные поля ввода 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, которая обычно перекрывает половину интерфейса и мешает работе.
Иногда проблему можно решить не программным кодом, а правильной конфигурацией самого устройства. Рассмотрим параметры, которые критичны для работы с веб-клиентом:
ПриИзменении или АвтоПодбор более эффективно.Если вы решили остаться на стандартных полях ввода 1С, выясним причину потери фокуса. В мобильном браузере фокус часто теряется после выполнения серверного вызова. Посмотрим на пример кода, который пытается вернуть фокус через обработчик ожидания, что иногда помогает обойти ограничения Android:
&Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("УстановитьФокусНаСканер", 0.5, Истина);
КонецПроцедуры
&НаКлиенте
&Процедура УстановитьФокусНаСканер()
ТекущийЭлемент = Элементы.ПолеВводаШтрихкода;
КонецПроцедуры
Важное примечание: Как упоминалось в обсуждении, этот метод может не сработать, если пользователь предварительно не совершил хотя бы одно нажатие на экран (User Interaction). Поэтому рекомендуется добавить кнопку «Начать работу», после нажатия на которую фокус будет устанавливаться программно.
Проанализировав все доступные варианты, можно сделать следующие выводы:
Таким образом, для реализации качественного сканирования в браузере без компонент, мы рекомендуем комбинировать настройку задержек на сканере и использование Поля HTML-документа для гарантированного перехвата данных штрихкода.