Как передать данные из HTTP-запроса в открытую клиентскую сессию 1С для эмуляции сканера штрихкода?

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

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

Ограничения платформы и изоляция сеансов

Для правильного проектирования архитектуры решения проанализируем, как работают контексты выполнения в 1С:

  1. Изоляция сеансов: Входящий HTTP-сервис 1С обрабатывается на стороне сервера в отдельном независимом фоновом сеансе. У серверного кода нет прямого доступа к оперативной памяти или открытым формам активных клиентских сеансов пользователей.
  2. Область действия метода Оповестить(): Стандартный механизм оповещений форм работает строго внутри одного клиентского сеанса. Вызвать метод Оповестить() на сервере HTTP-сервиса и доставить событие конкретному пользователю на рабочий стол невозможно.
  3. Природа внешнего события: Событие формы ОбработкаВнешнегоСобытия генерируется исключительно клиентскими компонентами (драйверами торгового оборудования по технологии Native API/COM). Серверный код 1С не может принудительно инициировать это событие на клиенте.

Способ 1. Асинхронные Push-уведомления через Систему взаимодействия

Наиболее технологичным и производительным методом передачи данных без постоянной нагрузки на базу данных является использование механизма «Система взаимодействия». Сервер 1С принимает HTTP-запрос и отправляет сообщение адресату, а клиентская форма мгновенно его обрабатывает.

Разберем реализацию по шагам:

  1. Обработка на стороне HTTP-сервиса: При получении GET-запроса сервер формирует программное сообщение Системы взаимодействия, указывая идентификатор пользователя нужного кассового места и текст со штрихкодом.
  2. Подключение на клиенте: В модуле формы РМК при открытии подключается обработчик оповещений:
    
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
        ПодключитьОбработчикОповещенияСистемыВзаимодействия("ОбработкаСообщенияСистемыВзаимодействия");
    КонецПроцедуры
    
  3. Обработка входящих данных: В назначенной процедуре извлекаем штрихкод и передаем его в типовые методы обработки штрихкодов конфигурации (например, методы БСП или БПО):
    
    &НаКлиенте
    Процедура ОбработкаСообщенияСистемыВзаимодействия(Сообщение)
        Если Сообщение.Свойство = "ЭмуляцияШтрихкода" Тогда
            Штрихкод = Сообщение.Текст;
            // Вызов типовой процедуры обработки полученного кода
            ОбработатьПолученныйШтрихкод(Штрихкод);
        КонецЕсли;
    КонецПроцедуры
    

Способ 2. Опрос через регистр сведений и обработчик ожидания (Polling)

Если Система взаимодействия не подключена, классическим решением выступает промежуточный буфер в базе данных с периодическим опросом на клиенте.

Рассмотрим порядок настройки:

  1. Создаем непериодический регистр сведений (например, ОчередьВходящихШтрихкодов) с измерениями ИдентификаторКлиента, ИдентификаторЗаписи (УникальныйИдентификатор) и ресурсом Штрихкод (Строка).
  2. В методе HTTP-сервиса записываем полученный из URL штрихкод в регистр:
    
    Функция ОбработатьGET(Запрос)
        Штрихкод = Запрос.ПараметрыURL.Получить("Штрихкод");
        ИдентификаторКлиента = Запрос.ПараметрыURL.Получить("ИдентификаторКлиента");
        
        МенеджерЗаписи = РегистрыСведений.ОчередьВходящихШтрихкодов.СоздатьМенеджерЗаписи();
        МенеджерЗаписи.ИдентификаторКлиента = ИдентификаторКлиента;
        МенеджерЗаписи.ИдентификаторЗаписи = Новый УникальныйИдентификатор;
        МенеджерЗаписи.Штрихкод = Штрихкод;
        МенеджерЗаписи.ПериодЗаписи = ТекущаяУниверсальнаяДатаВМиллисекундах();
        МенеджерЗаписи.Записать();
        
        Ответ = Новый HTTPСервисОтвет(200);
        Возврат Ответ;
    КонецФункции
    
  3. В форме РМК при открытии подключаем периодический опрос:
    
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
        ПодключитьОбработчикОжидания("ПроверитьОчередьШтрихкодов", 0.5);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПроверитьОчередьШтрихкодов()
        Штрихкод = ПолучитьШтрихкодИзОчередиНаСервере(ИдентификаторТекущегоСеанса);
        Если ЗначениеЗаполнено(Штрихкод) Тогда
            ОбработатьПолученныйШтрихкод(Штрихкод);
        КонецЕсли;
    КонецПроцедуры
    
  4. Важно: При чтении записи на сервере необходимо сразу удалять отработанные строки в транзакции, чтобы избежать повторного считывания одного и того же товара.

Способ 3. Локальная внешняя компонента на клиенте

Если требуется сохранить стандартную логику работы типового торгового оборудования без переписывания формы РМК, оптимально использовать внешнюю компоненту Native API, выполняющуюся непосредственно на клиентском компьютере кассира.

Разберем принцип работы:

  1. В клиентском сеансе загружается локальная компонента, которая открывает сетевой порт на рабочей станции (например, http://localhost:8080/).
  2. Внешний GET-запрос отправляется не на общий сервер базы 1С, а локально на адрес кассового ПК: http://localhost:8080/scan/1111111111.
  3. Компонента перехватывает запрос и вызывает стандартное платформенное событие через метод ExternalEvent.
  4. Форма РМК штатно ловит вызов через предопределенную процедуру ОбработкаВнешнегоСобытия, как если бы сработал физический сканер.

Способ 4. Эмуляция COM-порта или клавиатурного ввода

Для интеграций без доработки программного кода 1С можно использовать системные утилиты операционной системы:

  1. Виртуальный COM-порт: В операционной системе создается виртуальная пара COM-портов (например, COM5 и COM6). 1С настраивается на работу с COM5 через штатный драйвер сканера ШК. Локальная фоновая служба принимает HTTP-запрос и записывает строку в COM6. Драйвер 1С принимает сигнал и запускает типовой поиск номенклатуры.
  2. Эмуляция HID (SendKeys): Небольшой локальный скрипт при получении сетевого запроса активирует окно 1С и посылает строку символов с нажатием клавиши Enter в активное поле формы РМК.

Выводы и рекомендации

Выбор варианта зависит от архитектуры инфраструктуры:

  1. Для масштабируемых и распределенных решений лучше всего подходит Система взаимодействия — она передает данные мгновенно и не создает лишней нагрузки на СУБД.
  2. Для быстрых доработок небольших баз подходит регистр сведений с обработчиком ожидания.
  3. Для сохранения типовой конфигурации без снятия с поддержки и использования встроенных механизмов БПО предпочтительна эмуляция виртуального COM-порта или локальная внешняя компонента.
← На главную