При работе с терминалами сбора данных (ТСД) Zebra MC92N0-G и мобильной платформой 1С, версий 8.3.11.57 и 8.3.10.84, пользователи часто сталкиваются с проблемой некорректной обработки символа Enter, который ТСД должен автоматически отправлять после каждого сканирования штрихкода. Мы рассмотрим эту проблему подробно и предложим проверенное решение, которое позволит вам эффективно интегрировать ТСД с вашей мобильной платформой 1С.
Изначально, при использовании ТСД Zebra MC92N0-G, если не применять специальные настройки, после сканирования штрихкода данные просто вводятся в активное поле ввода, но для активации события обработки (например, перехода к следующему полю или выполнению какой-либо логики) требуется дополнительное ручное нажатие клавиши Enter на клавиатуре ТСД. Очевидно, что такой подход замедляет работу и является неприемлемым для устройств стоимостью в несколько тысяч долларов.
Для автоматизации этого процесса, мы можем воспользоваться встроенными функциями ТСД. В настройках профиля сканера ТСД Zebra, обычно через утилиту DataWedge (Profile -> Keystroke Output -> Basic data formatting), существует опция Send ENTER key. Активация этой опции должна, по идее, автоматически добавлять символ Enter после каждого отсканированного штрихкода.
Однако на практике, особенно при работе с мобильной платформой 1С, мы обнаруживаем, что это не всегда работает так, как ожидается. Символ Enter, отправленный таким образом, мобильная платформа 1С либо не воспринимает вообще, либо воспринимает крайне нестабильно. В большинстве случаев мы видим, как отсканированный код появляется в поле ввода и тут же пропадает, как будто платформа не успевает его обработать или воспринимает Enter как сигнал к очистке поля или отмене ввода. Иногда это срабатывает "с десятого раза", что совершенно неприемлемо для производственной среды.
Даже попытки сделать поле ввода многострочным, казалось бы, решают проблему с сохранением введенного кода (он не пропадает), но при этом мы сталкиваемся с другой трудностью: перестают срабатывать стандартные события платформы, такие как ПриИзменении или ОкончаниеВводаТекста. Это лишает нас возможности программно обрабатывать полученные данные.
Кроме того, мы выяснили, что даже попытка заменить Enter на другой управляющий символ, например, Tab (опция Send TAB key в настройках DataWedge), также не приводит к успеху. Мобильная платформа 1С совершенно не воспринимает символ Tab, что исключает его использование в качестве разделителя.
В ходе практических экспериментов и благодаря рекомендациям сообщества, было найдено эффективное решение, которое позволяет нам обойти проблемы с некорректной обработкой символа Enter. Это решение включает в себя два ключевых компонента:
АвтоПодборТекста.Давайте разберем эти шаги подробнее.
DataWedge — это мощное программное обеспечение от Zebra, которое позволяет нам гибко настраивать работу сканера штрихкодов и передачу данных в различные приложения. Для нашей задачи мы должны настроить его так, чтобы вместо Enter после штрихкода отправлялся любой другой, выбранный нами, символ, который мобильная платформа 1С будет корректно воспринимать как окончание ввода.
Создание отдельного профиля критически важно, так как это позволяет настроить поведение сканера именно для 1С, не затрагивая другие приложения на ТСД.
=). Вы можете использовать любой другой символ, который не встречается в ваших штрихкодах и не является управляющим символом, вызывающим проблемы. Например, #, $, |, ~.
Важно: Выбирайте символ, который явно не будет присутствовать в данных штрихкода, чтобы избежать ложных срабатываний.
Пример: в поле "Suffix" введите символ =.
Теперь после каждого сканирования штрихкода ТСД будет отправлять данные штрихкода, за которыми будет следовать выбранный вами суффикс (например, 1234567890=).
Теперь, когда ТСД отправляет штрихкод с пользовательским суффиксом, нам необходимо научить 1С Мобильную платформу правильно обрабатывать этот ввод. Для этого мы будем использовать событие АвтоПодборТекста для поля ввода, в которое поступают данные.
ПолеВвода) на форме.АвтоПодборТекста:
АвтоПодборТекста и создайте для него обработчик на стороне клиента.АвтоПодборТекста мы должны будем проверить, содержит ли введенный текст наш суффикс. Если да, то это означает, что сканирование завершено, и мы можем обработать штрихкод.Рассмотрим пример кода для обработчика события АвтоПодборТекста:
&НаКлиенте
Процедура ПолеВводаШтрихкодаАвтоПодборТекста(Элемент, Текст, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартную обработку автоподбора, чтобы полностью контролировать процесс
ПеременныйСуффикс = "="; // Наш пользовательский суффикс, настроенный в DataWedge
// Проверяем, содержит ли введенный текст наш суффикс
Если Найти(Текст, ПеременныйСуффикс) > 0 Тогда
// Извлекаем штрихкод, отсекая суффикс
// Функция Лев(Текст, Найти(Текст, ПеременныйСуффикс) - 1) вернет строку до первого вхождения суффикса.
// Если возможны несколько суффиксов в разных частях, можно использовать СтрЗаменить()
// или найти последнее вхождение суффикса.
Штрихкод = СтрЗаменить(Текст, ПеременныйСуффикс, "");
// Или, если суффикс всегда в конце:
// Штрихкод = Лев(Текст, СтрДлина(Текст) - СтрДлина(ПеременныйСуффикс));
// Теперь, когда у нас есть чистый штрихкод, мы можем выполнить необходимые действия:
// 1. Поместить штрихкод в основное значение поля
Элемент.Значение = Штрихкод;
// 2. Выполнить логику обработки штрихкода (поиск товара, добавление в список и т.д.)
ОбработатьОтсканированныйШтрихкод(Штрихкод);
// 3. Очистить поле ввода для следующего сканирования
Элемент.Значение = "";
Иначе
// Если суффикс еще не пришел (код сканируется по частям или еще не завершен)
// Мы можем временно отобразить текущий текст в поле
Элемент.Значение = Текст;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьОтсканированныйШтрихкод(Штрихкод)
// Здесь размещаем вашу основную логику обработки штрихкода
// Например, поиск товара по штрихкоду, добавление в таблицу,
// оповещение пользователя и т.д.
Сообщить("Отсканирован штрихкод: " + Штрихкод);
// Пример:
// ПодключитьОбработчикОповещения("ВыполнитьДействиеПослеСканирования", Неопределено, Штрихкод);
// Или сразу вызывать серверную процедуру
// ОбработатьШтрихкодНаСервере(Штрихкод);
КонецПроцедуры
// Пример серверной процедуры, если требуется работа с данными на сервере
&НаСервереБезКонтекста
Процедура ОбработатьШтрихкодНаСервере(Штрихкод)
// Здесь логика работы с БД, справочниками и т.д.
// Например:
// Запрос = Новый Запрос;
// Запрос.Текст = "ВЫБРАТЬ Номенклатура.Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Штрихкод = &Штрихкод";
// Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
// Результат = Запрос.Выполнить().Выбрать();
// ...
КонецПроцедуры
Пояснения к коду:
СтандартнаяОбработка = Ложь;: Мы отключаем стандартную обработку события АвтоПодборТекста, чтобы полностью контролировать процесс. Без этого мобильная платформа может попытаться выполнить свой автоподбор, что не всегда предсказуемо для штрихкодов.ПеременныйСуффикс = "=";: Мы явно указываем наш суффикс, который настроили в DataWedge. Это важно для корректного определения конца штрихкода.Найти(Текст, ПеременныйСуффикс) > 0: Эта строка проверяет, содержится ли наш суффикс в тексте, который был введен. Если да, значит, штрихкод полностью отсканирован.Штрихкод = СтрЗаменить(Текст, ПеременныйСуффикс, "");: После обнаружения суффикса мы удаляем его из строки, чтобы получить чистый штрихкод.Элемент.Значение = Штрихкод;: После извлечения штрихкода мы можем присвоить его значение полю ввода, чтобы пользователь видел результат.ОбработатьОтсканированныйШтрихкод(Штрихкод);: Здесь вызывается ваша основная процедура обработки штрихкода, где вы реализуете бизнес-логику (поиск товара, добавление его в документ и т.п.).Элемент.Значение = "";: Для удобства пользователя и подготовки поля к следующему сканированию мы очищаем его.Почему же АвтоПодборТекста сработал, а ПриИзменении или ОкончаниеВводаТекста нет? Вероятно, это связано с особенностями внутренней архитектуры мобильной платформы 1С и тем, как она обрабатывает быстрый ввод с эмулированной клавиатуры. Событие АвтоПодборТекста, возможно, имеет более низкий уровень срабатывания или более длительный тайм-аут для анализа введенного текста, что позволяет ему "захватить" весь штрихкод до того, как платформа решит, что ввод завершен или ошибочен, особенно когда имеется четкий символ-разделитель в конце.
Хотя предложенное решение является рабочим, существуют и другие аспекты и альтернативы, которые мы должны рассмотреть для более глубокой интеграции и устойчивости системы.
Для более гибкой и надежной работы со сканерами штрихкодов в 1С Мобильной платформе мы можем использовать внешние компоненты. Например, компонент "1С:Сканер штрихкода (NativeApi)" позволяет получать данные в режиме "BROADCAST" (широковещательные сообщения) непосредственно от сканера ТСД. Этот режим предоставляет более прямой контроль над данными, поступающими от сканера, и часто является более стабильным способом, чем эмуляция клавиатуры. Мы рекомендуем изучить возможности этого компонента, если стандартное эмулирование клавиатуры продолжает вызывать проблемы или требуются расширенные функции управления сканером.
Фирма "1С" предоставляет Библиотеку подключаемого оборудования (БПО) для мобильной платформы, которая содержит драйверы для различных устройств ввода данных, включая сканеры штрихкодов. Использование этих драйверов может значительно упростить интеграцию и обеспечить более стандартизированный подход к работе с ТСД. Мы рекомендуем проверить актуальную версию БПО и ознакомиться с ее функционалом для мобильных приложений, так как она постоянно дорабатывается и может предложить готовые решения для вашей задачи.
Сканеры могут работать в различных режимах, включая "keyboard wedge" (эмуляция клавиатуры) и "serial interface" (последовательный интерфейс). Режим эмуляции клавиатуры, который мы сейчас рассматриваем, прост в настройке, но, как мы выяснили, может вызывать проблемы с распознаванием управляющих символов (таких как Enter или Tab) в некоторых приложениях, включая 1С Мобильную платформу. Если вы столкнулись с непреодолимыми трудностями, стоит рассмотреть возможность использования режима последовательного интерфейса, если ваше ТСД и мобильная платформа 1С поддерживают его через специальные драйверы или внешние компоненты.
На рынке существуют сторонние мобильные приложения, такие как "1Scan", разработанные специально для интеграции возможностей Android-устройств (включая сканеры штрихкодов ТСД, камеру, NFC, GPS и Bluetooth) с веб-клиентом 1С. Эти приложения обычно используют обмен JSON-командами, что может обеспечить более стабильное и многофункциональное взаимодействие по сравнению с простой эмуляцией клавиатуры. Если ваш проект требует расширенных возможностей или вы хотите избежать глубокой программной доработки, мы можем рассмотреть использование таких готовых решений.
Для эффективной отладки работы со сканером в 1С Мобильной платформе мы рекомендуем использовать режим "Отладка клавиатуры", если он доступен в настройках драйвера "1С:Сканеры штрихкода". Этот режим позволяет увидеть всю последовательность переданных клавиатурных сообщений, что может помочь нам точно понять, какие символы и в какой последовательности получает 1С от ТСД. Также существуют методы имитации события сканирования штрихкода в режиме отладки, что значительно ускоряет процесс разработки и проверки логики.
Следует помнить, что 1С Мобильная платформа также поддерживает сканирование штрихкодов с использованием встроенной камеры устройства. Для этого в свойствах конфигурации необходимо установить разрешение "Мультимедиа". Хотя это не является решением проблемы с внешним ТСД, это может быть полезной альтернативой для некоторых сценариев, когда интеграция внешнего сканера оказывается слишком сложной или дорогостоящей.
Проблема некорректной обработки символа Enter, отправляемого ТСД Zebra MC92N0-G в 1С Мобильной платформе, является распространенной, но, как мы выяснили, имеет эффективное решение. Путем настройки DataWedge на ТСД для отправки пользовательского суффикса и использования события АвтоПодборТекста в 1С, мы можем добиться стабильной и автоматической обработки отсканированных штрихкодов. Мы рекомендуем вам внимательно следовать предложенным шагам и при необходимости рассмотреть более продвинутые методы интеграции с использованием внешних компонентов или сторонних решений для достижения максимальной эффективности и надежности вашей системы.