В современной практике автоматизации складов и торговых точек часто возникает задача использовать обычный Android-смартфон в качестве беспроводного терминала сбора данных (ТСД) или сканера штрихкодов. Для этого на телефон устанавливается специализированное приложение (например, "Wireless Barcode"), которое считывает штрихкод встроенной камерой и отправляет его по сети Wi-Fi на компьютер с базой данных 1С с использованием протокола TCP.
Однако разработчики часто сталкиваются с проблемой: данные приходят на ПК и успешно печатаются в блокноте (так как приложение эмулирует клавиатурный ввод), но встроенный механизм 1С никак не реагирует на сканирование. Стандартная процедура ОбработкаВнешнегоСобытия не вызывается, а значит, обработать штрихкод программно и быстро добавить товар в документ невозможно. В этой статье мы подробно разберем, почему так происходит, и проанализируем три проверенных практических способа решения этой задачи для конфигураций на обычных формах (включая платформы 1С 8.1, 8.2 и 8.3).
Типичные драйверы торгового оборудования (от фирмы "1С" или компании "АТОЛ") спроектированы для работы с физическими устройствами, подключенными по последовательному интерфейсу (COM-порт) или в разрыв клавиатуры (клавиатурный ввод). Когда приложение на Android отправляет строку по TCP, операционная система компьютера принимает сетевой пакет. Дальнейшее поведение зависит от режима работы утилиты-приемника на ПК:
ВнешнееСобытие при этом не генерируется, так как операционная система не сообщает платформе 1С о том, что ввод был произведен именно сканером, а не руками пользователя.Рассмотрим подробнее три основных способа интеграции, которые помогут нам обойти это ограничение и заставить 1С стабильно принимать штрихкоды во внешнее событие.
---
Этот способ является универсальным и самым надежным, так как он не требует внесения изменений в код конфигурации 1С. Мы обманем систему, создав в операционной системе Windows виртуальный COM-порт, который будет связан с сетевым TCP-портом. Штатный драйвер "1С:Сканер штрихкода" будет думать, что работает с обычным аппаратным сканером.
Разберем по шагам процесс настройки этого решения:
COM9).9100).COM9.9100. Проверяем, что при сканировании данные улетают в сеть.COM9 (созданный нами виртуальный порт).Return или перевод строки LF), чтобы система понимала, где заканчивается штрихкод.Теперь при сканировании штрихкода телефоном данные отправляются по TCP, перехватываются утилитой HW VSP, транслируются в виртуальный COM-порт, а драйвер 1С мгновенно перехватывает их и генерирует стандартное внешнее событие. Проблема решена без единой строчки кода!
---
Если мы работаем на старой платформе (например, 1С 8.1 или 8.2 на обычных формах) и хотим полностью контролировать процесс обмена данными внутри самой 1С без использования сторонних утилит эмуляции портов, мы можем реализовать собственный TCP-сервер прямо на форме 1С. Для этого мы задействуем стандартную системную библиотеку Microsoft Winsock.
Проанализируем ситуацию: библиотека Winsock поставляется в составе ОС Windows (файл MSWINSCK.OCX). Чтобы использовать её, предварительно зарегистрируем её в системе. Выполним в командной строке от имени администратора команду:
regsvr32 C:\Windows\SysWOW64\MSWINSCK.OCX (или в папке System32 для 32-битных систем).
Теперь разберем по шагам, как написать обработчик получения штрихкодов в модуле формы (например, формы списка документов или специальной формы рабочего места кладовщика):
MSWinsock.Winsock и назовем его Сокет.
Процедура ПриОткрытии()
Попытка
// Настраиваем локальный порт, который будет слушать наша 1С
ЭлементыФормы.Сокет.LocalPort = 9100;
// Запускаем прослушивание порта
ЭлементыФормы.Сокет.Listen();
Сообщить("Сетевой сокет успешно запущен на порту 9100. Ожидание подключения смартфона...");
Исключение
Предупреждение("Не удалось запустить сетевой сокет: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Когда телефон попытается подключиться к компьютеру для передачи данных, сработает событие запроса на соединение. Нам необходимо принять это соединение:
Процедура СокетConnectionRequest(Элемент, RequestID)
// Если сокет уже занят другим соединением, закрываем его перед приемом нового
Если Элемент.State <> 0 Тогда
Элемент.Close();
КонецЕсли;
// Принимаем входящее подключение по его уникальному ID
Элемент.Accept(RequestID);
КонецПроцедуры
Теперь опишем самое главное событие — получение данных от смартфона. При поступлении пакета по сети вызывается событие DataArrival:
Процедура СокетDataArrival(Элемент, BytesTotal)
Перем ПолученныеДанные;
ПолученныеДанные = "";
// Считываем текстовые данные из сокета (тип 8 соответствует строковому формату)
Элемент.GetData(ПолученныеДанные, 8);
// Очищаем строку от лишних символов переноса строк и пробелов
ЧистыйШтрихкод = СокрЛП(ПолученныеДанные);
ЧистыйШтрихкод = СтрЗаменить(ЧистыйШтрихкод, Символы.ПС, "");
ЧистыйШтрихкод = СтрЗаменить(ЧистыйШтрихкод, Символы.ВК, "");
// Отправляем штрихкод в нашу процедуру обработки поиска товара
Если ЗначениеЗаполнено(ЧистыйШтрихкод) Тогда
ОбработатьСчитанныйШтрихкод(ЧистыйШтрихкод);
КонецЕсли;
КонецПроцедуры
В завершение обязательно напишем процедуру закрытия сокета при закрытии формы, чтобы освободить сетевой порт для других приложений операционной системы:
Процедура ПриЗакрытии()
Попытка
ЭлементыФормы.Сокет.Close();
Исключение
// Игнорируем возможные ошибки при закрытии неактивного сокета
КонецПопытки;
КонецПроцедуры
Этот способ гарантирует мгновенную передачу данных прямо в логику работы открытой формы без прослоек в виде драйверов торгового оборудования.
---
Если используемое вами приложение "Wireless Barcode" работает нестабильно, часто теряет связь или требует постоянной ручной настройки IP-адресов, имеет смысл посмотреть в сторону готовых программных комплексов, которые создавались специально для интеграции мобильных устройств с 1С.
Рассмотрим популярные альтернативы:
Мы проанализировали несколько путей решения проблемы приема штрихкодов по TCP. Подведем итог, какой вариант выбрать в зависимости от ваших условий: