Как поймать событие сканирования штрихкода по TCP с Android-смартфона в 1С

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

В современной практике автоматизации складов и торговых точек часто возникает задача использовать обычный Android-смартфон в качестве беспроводного терминала сбора данных (ТСД) или сканера штрихкодов. Для этого на телефон устанавливается специализированное приложение (например, "Wireless Barcode"), которое считывает штрихкод встроенной камерой и отправляет его по сети Wi-Fi на компьютер с базой данных 1С с использованием протокола TCP.

Однако разработчики часто сталкиваются с проблемой: данные приходят на ПК и успешно печатаются в блокноте (так как приложение эмулирует клавиатурный ввод), но встроенный механизм 1С никак не реагирует на сканирование. Стандартная процедура ОбработкаВнешнегоСобытия не вызывается, а значит, обработать штрихкод программно и быстро добавить товар в документ невозможно. В этой статье мы подробно разберем, почему так происходит, и проанализируем три проверенных практических способа решения этой задачи для конфигураций на обычных формах (включая платформы 1С 8.1, 8.2 и 8.3).

Выясняем причину: почему 1С "не видит" сканирование по TCP?

Типичные драйверы торгового оборудования (от фирмы "1С" или компании "АТОЛ") спроектированы для работы с физическими устройствами, подключенными по последовательному интерфейсу (COM-порт) или в разрыв клавиатуры (клавиатурный ввод). Когда приложение на Android отправляет строку по TCP, операционная система компьютера принимает сетевой пакет. Дальнейшее поведение зависит от режима работы утилиты-приемника на ПК:

  1. Режим эмуляции клавиатуры: Утилита-приемник принимает TCP-пакет и программно имитирует нажатие клавиш на клавиатуре. Данные просто «печатаются» в то поле, где сейчас находится курсор. Если в 1С не открыто конкретное поле ввода, штрихкод пропадает. Событие ВнешнееСобытие при этом не генерируется, так как операционная система не сообщает платформе 1С о том, что ввод был произведен именно сканером, а не руками пользователя.
  2. Режим сетевого сокета: Данные приходят на определенный TCP-порт компьютера, но ни один стандартный драйвер 1С по умолчанию не умеет самостоятельно "слушать" произвольные сетевые порты без дополнительной настройки или специализированного программного обеспечения.

Рассмотрим подробнее три основных способа интеграции, которые помогут нам обойти это ограничение и заставить 1С стабильно принимать штрихкоды во внешнее событие.

---

Способ 1: Перенаправление TCP в виртуальный COM-порт (Наиболее простой метод без программирования)

Этот способ является универсальным и самым надежным, так как он не требует внесения изменений в код конфигурации 1С. Мы обманем систему, создав в операционной системе Windows виртуальный COM-порт, который будет связан с сетевым TCP-портом. Штатный драйвер "1С:Сканер штрихкода" будет думать, что работает с обычным аппаратным сканером.

Разберем по шагам процесс настройки этого решения:

  1. Установка утилиты TCP-to-COM: Нам понадобится специальный программный эмулятор. Отличным бесплатным решением является утилита HW VSP (HW Virtual Serial Port) от компании HW group или альтернативные программы, такие как Tibbo VSP. Скачиваем и устанавливаем утилиту на компьютер, где запущена 1С.
  2. Настройка виртуального порта:
    • Запускаем утилиту HW VSP.
    • Переходим на вкладку создания портов и выбираем свободный номер порта в системе (например, COM9).
    • Указываем IP-адрес смартфона (если приложение на телефоне выступает в роли TCP-сервера) или настраиваем утилиту в режим "TCP Server", чтобы она сама слушала входящие подключения от телефона на определенном порту (например, 9100).
    • Нажимаем кнопку создания порта. В диспетчере устройств Windows появится новый последовательный порт COM9.
  3. Настройка приложения на Android: В настройках программы сканирования на смартфоне указываем IP-адрес нашего компьютера и порт 9100. Проверяем, что при сканировании данные улетают в сеть.
  4. Настройка торгового оборудования в 1С:
    • Открываем 1С, переходим в меню настройки торгового оборудования (Подключаемое оборудование).
    • Добавляем новый сканер штрихкода, используя стандартный драйвер от "1С" или "АТОЛ".
    • В параметрах подключения устройства выбираем порт COM9 (созданный нами виртуальный порт).
    • Устанавливаем скорость и другие параметры по умолчанию. Обязательно указываем символ-суффикс (обычно это Return или перевод строки LF), чтобы система понимала, где заканчивается штрихкод.

Теперь при сканировании штрихкода телефоном данные отправляются по TCP, перехватываются утилитой HW VSP, транслируются в виртуальный COM-порт, а драйвер 1С мгновенно перехватывает их и генерирует стандартное внешнее событие. Проблема решена без единой строчки кода!

---

Способ 2: Использование ActiveX-компоненты Winsock напрямую в коде 1С (Для разработчиков)

Если мы работаем на старой платформе (например, 1С 8.1 или 8.2 на обычных формах) и хотим полностью контролировать процесс обмена данными внутри самой 1С без использования сторонних утилит эмуляции портов, мы можем реализовать собственный TCP-сервер прямо на форме 1С. Для этого мы задействуем стандартную системную библиотеку Microsoft Winsock.

Проанализируем ситуацию: библиотека Winsock поставляется в составе ОС Windows (файл MSWINSCK.OCX). Чтобы использовать её, предварительно зарегистрируем её в системе. Выполним в командной строке от имени администратора команду:

regsvr32 C:\Windows\SysWOW64\MSWINSCK.OCX (или в папке System32 для 32-битных систем).

Теперь разберем по шагам, как написать обработчик получения штрихкодов в модуле формы (например, формы списка документов или специальной формы рабочего места кладовщика):

  1. Добавим на форму элемент управления ActiveX с типом MSWinsock.Winsock и назовем его Сокет.
  2. В модуле формы напишем процедуру инициализации нашего сетевого сервера при открытии формы:

Процедура ПриОткрытии()
    Попытка
        // Настраиваем локальный порт, который будет слушать наша 1С
        ЭлементыФормы.Сокет.LocalPort = 9100; 
        // Запускаем прослушивание порта
        ЭлементыФормы.Сокет.Listen();
        Сообщить("Сетевой сокет успешно запущен на порту 9100. Ожидание подключения смартфона...");
    Исключение
        Предупреждение("Не удалось запустить сетевой сокет: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Когда телефон попытается подключиться к компьютеру для передачи данных, сработает событие запроса на соединение. Нам необходимо принять это соединение:


Процедура СокетConnectionRequest(Элемент, RequestID)
    // Если сокет уже занят другим соединением, закрываем его перед приемом нового
    Если Элемент.State <> 0 Тогда 
        Элемент.Close();
    КонецЕсли;
    // Принимаем входящее подключение по его уникальному ID
    Элемент.Accept(RequestID);
КонецПроцедуры

Теперь опишем самое главное событие — получение данных от смартфона. При поступлении пакета по сети вызывается событие DataArrival:


Процедура СокетDataArrival(Элемент, BytesTotal)
    Перем ПолученныеДанные;
    ПолученныеДанные = "";
    
    // Считываем текстовые данные из сокета (тип 8 соответствует строковому формату)
    Элемент.GetData(ПолученныеДанные, 8); 
    
    // Очищаем строку от лишних символов переноса строк и пробелов
    ЧистыйШтрихкод = СокрЛП(ПолученныеДанные);
    ЧистыйШтрихкод = СтрЗаменить(ЧистыйШтрихкод, Символы.ПС, "");
    ЧистыйШтрихкод = СтрЗаменить(ЧистыйШтрихкод, Символы.ВК, "");
    
    // Отправляем штрихкод в нашу процедуру обработки поиска товара
    Если ЗначениеЗаполнено(ЧистыйШтрихкод) Тогда
        ОбработатьСчитанныйШтрихкод(ЧистыйШтрихкод);
    КонецЕсли;
КонецПроцедуры

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


Процедура ПриЗакрытии()
    Попытка
        ЭлементыФормы.Сокет.Close();
    Исключение
        // Игнорируем возможные ошибки при закрытии неактивного сокета
    КонецПопытки;
КонецПроцедуры

Этот способ гарантирует мгновенную передачу данных прямо в логику работы открытой формы без прослоек в виде драйверов торгового оборудования.

---

Способ 3: Использование готовых программных комплексов (Для комплексной автоматизации)

Если используемое вами приложение "Wireless Barcode" работает нестабильно, часто теряет связь или требует постоянной ручной настройки IP-адресов, имеет смысл посмотреть в сторону готовых программных комплексов, которые создавались специально для интеграции мобильных устройств с 1С.

Рассмотрим популярные альтернативы:

Резюме и рекомендации

Мы проанализировали несколько путей решения проблемы приема штрихкодов по TCP. Подведем итог, какой вариант выбрать в зависимости от ваших условий:

  1. Если вам нужно настроить все максимально быстро, без программирования и изменения конфигурации — выбирайте Способ 1 (перенаправление через HW VSP). Это стандартный рабочий вариант для большинства торговых систем.
  2. Если у вас старая самописная конфигурация на обычных формах (1С 8.1) и вы хотите красивое встроенное решение без установки на компьютеры пользователей лишних сторонних утилит — реализуйте Способ 2 (с компонентой Winsock в коде формы).
  3. Если вы планируете масштабировать систему, автоматизировать полноценную работу склада с адресным хранением и ячейками — лучше отказаться от простых утилит-сканеров и внедрить специализированный софт (Способ 3), превратив телефоны в полноценные ТСД.
← На главную