При автоматизации складского учета перед разработчиками часто встает задача: организовать быструю и стабильную работу терминалов сбора данных (ТСД) напрямую с информационной базой 1С. Первой и самой очевидной идеей кажется запуск стандартного веб-клиента через обычный браузер ТСД на Android. Однако на практике разработчики сталкиваются с серьезным ограничением — обычные мобильные браузеры (такие как Google Chrome или Safari) не поддерживают внешние компоненты 1С и работу с аппаратным сканером «из коробки».
В этой статье мы подробно разберем, почему стандартная схема эмуляции клавиатуры (Keyboard Wedge) в браузере не подходит для промышленной эксплуатации, и проанализируем современные, стабильные альтернативные архитектурные решения: специализированные контейнеры-браузеры, мобильный клиент 1С с обработкой широковещательных сообщений (Broadcast Intents), а также разработку легковесных интерфейсов на базе HTTP-сервисов.
Если запустить веб-клиент в обычном мобильном браузере, аппаратный сканер ТСД сможет работать только в режиме эмуляции клавиатуры (Keyboard Wedge). При сканировании штрихкод будет вставляться в текущее активное поле ввода, имитируя быстрый ввод символов пользователем. Рассмотрим, почему этот подход неприменим на реальном складе:
Для решения этих проблем мы разберем более продвинутые и надежные технологии интеграции.
Для обхода ограничений стандартных веб-обозревателей используются специализированные Android-приложения (браузеры-контейнеры), разработанные специально под ТСД (например, утилиты класса 1Scan и аналогичные WebView-оболочки).
Проанализируем принцип работы данной технологии:
WebView, в котором открывается опубликованная на веб-сервере база 1С.Рассмотрим, как это выглядит со стороны конфигурации 1С. Нам не требуется разрабатывать или устанавливать сложные внешние компоненты. Нам достаточно использовать штатный механизм работы с сообщениями веб-страницы. Разберем пример программного кода на стороне управляемой формы 1С:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем встроенный обработчик сообщений от внешнего сайта (контейнера WebView)
ПодключитьОбработчикСообщений("ПриПолученииДанныхОтТСД");
КонецПроцедуры
&НаКлиенте
Процедура ПриПолученииДанныхОтТСД(Сообщение, Источник)
// Получаем строковые данные, переданные специализированным контейнером ТСД
Если ПустаяСтрока(Сообщение) Тогда
Возврат;
КонецЕсли;
// Проанализируем содержимое сообщения. Предположим, контейнер отправляет JSON-строку
Попытка
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Сообщение);
ДанныеСканирования = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Если ДанныеСканирования.Свойство("Barcode") Тогда
Штрихкод = СокрЛП(ДанныеСканирования.Barcode);
ТипШтрихкода = ?(ДанныеСканирования.Свойство("Type"), ДанныеСканирования.Type, "");
// Запускаем нашу логику обработки полученного штрихкода
ОбработатьСканирование(Штрихкод, ТипШтрихкода);
КонецЕсли;
Исключение
// Обработка возможных ошибок разбора данных
ЗаписатьЛогОшибки(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот способ позволяет использовать всю мощь обычного веб-клиента, не требуя разработки мобильного приложения, и при этом гарантирует стабильное асинхронное получение штрихкодов без потери фокуса на форме.
Если у вас современная платформа 1С (начиная с версии 8.3.12+), наиболее технологичным решением является использование Мобильного клиента 1С. Мобильный клиент динамически транслирует формы вашей рабочей базы на экран мобильного устройства, поддерживая полноценное асинхронное сканирование.
Для того чтобы сканер ТСД работал как физическое устройство ввода, а не как клавиатура, настроим интеграцию через механизм Broadcast Receiver (широковещательный прием сообщений в ОС Android). Разберем этот процесс по шагам:
В зависимости от бренда ТСД зайдем в системную утилиту управления сканером (например, Datawedge у Zebra, ScanWedge у Honeywell, Scaner у Urovo или АТОЛ) и настроим профиль сканирования:
android.intent.action.BARCODE.barcode_string или data).В конфигурации 1С на базе БПО (Библиотеки подключаемого оборудования) для мобильных платформ выполним следующие действия:
Action пропишем строку android.intent.action.BARCODE, а в поле Extra укажем системную переменную передачи штрихкода — barcode_string.Теперь при физическом нажатии на кнопку сканирования ТСД сгенерирует внешнее событие ОС Android, которое будет перехвачено мобильным клиентом 1С и передано в активную форму. Нам остается лишь обработать его в предопределенной процедуре:
&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Проверим, что событие инициировано сканером штрихкодов
Если Найти(Источник, "BarcodeScanner") > 0 ИЛИ Событие = "Barcode" Тогда
// Полученные данные содержат считанный штрихкод
ПолученныйШтрихкод = СокрЛП(Данные);
// Выполняем поиск номенклатуры или документа в базе данных
ОбработатьШтрихкодНаСервере(ПолученныйШтрихкод);
КонецЕсли;
КонецПроцедуры
Преимущества данного метода: Сканирование происходит мгновенно, фокус ввода на форме не имеет значения, экранная клавиатура не появляется, а раскладка символов (русская/английская) не влияет на результат.
Если ваши терминалы сбора данных морально устарели (работают на старых версиях Android или Windows Mobile), а мобильный клиент работает медленно из-за высоких требований к оперативной памяти, целесообразно использовать связку: легковесное мобильное приложение + HTTP-сервисы 1С.
Вы можете написать простейшее приложение на Android или использовать готовые конструкторы мобильных интерфейсов (например, Simple UI). Это приложение будет мгновенно считывать штрихкод аппаратным лазером и отправлять его по HTTP-протоколу в базу 1С.
Разберем пример создания HTTP-сервиса на стороне 1С для обработки таких запросов от ТСД:
// Функция HTTP-сервиса для обработки сканирования
Функция ОбработатьСканированиеPOST(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Получаем тело запроса от ТСД
СтрокаЗапроса = Запрос.ПолучитьТелоКакСтроку("UTF-8");
Попытка
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаЗапроса);
ДанныеТсд = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Штрихкод = СокрЛП(ДанныеТсд.Штрихкод);
ИдентификаторДокумента = ДанныеТсд.ИдентификаторДокумента;
// Выполняем поиск и добавление товара в документ на стороне сервера
РезультатОбработки = ДобавитьТоварВДокументПоШтрихкоду(Штрихкод, ИдентификаторДокумента);
// Формируем структуру ответа для отправки обратно на ТСД
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("Успешно", Истина);
СтруктураОтвета.Вставить("НоменклатураНаименование", РезультатОбработки.Наименование);
СтруктураОтвета.Вставить("НовоеКоличество", РезультатОбработки.Количество);
Исключение
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("Успешно", Ложь);
СтруктураОтвета.Вставить("Ошибка", ОписаниеОшибки());
Ответ.КодСостояния = 500;
КонецПопытки;
// Записываем ответ в тело сообщения
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураОтвета);
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(), "UTF-8");
Возврат Ответ;
КонецФункции
Этот подход гарантирует максимальное быстродействие интерфейса ТСД, так как на самом устройстве выполняется только отрисовка простейшего экрана и отправка пакетов, а вся бизнес-логика выполняется на мощном сервере 1С.
Выясним, какое архитектурное решение лучше всего выбрать для вашего проекта: