При автоматизации рабочего места кассира (РМК) или складских терминалов нередко возникает задача передачи штрихкода или команды в открытую форму 1С не напрямую с физического сканера, а через внешний HTTP-запрос из браузера или стороннего приложения. Рассмотрим, как устроено взаимодействие между контекстами в платформе 1С:Предприятие 8.3, выясним ограничения и разберем проверенные способы решения этой задачи.
Для правильного проектирования архитектуры решения проанализируем, как работают контексты выполнения в 1С:
Оповестить(): Стандартный механизм оповещений форм работает строго внутри одного клиентского сеанса. Вызвать метод Оповестить() на сервере HTTP-сервиса и доставить событие конкретному пользователю на рабочий стол невозможно.ОбработкаВнешнегоСобытия генерируется исключительно клиентскими компонентами (драйверами торгового оборудования по технологии Native API/COM). Серверный код 1С не может принудительно инициировать это событие на клиенте.Наиболее технологичным и производительным методом передачи данных без постоянной нагрузки на базу данных является использование механизма «Система взаимодействия». Сервер 1С принимает HTTP-запрос и отправляет сообщение адресату, а клиентская форма мгновенно его обрабатывает.
Разберем реализацию по шагам:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОповещенияСистемыВзаимодействия("ОбработкаСообщенияСистемыВзаимодействия");
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаСообщенияСистемыВзаимодействия(Сообщение)
Если Сообщение.Свойство = "ЭмуляцияШтрихкода" Тогда
Штрихкод = Сообщение.Текст;
// Вызов типовой процедуры обработки полученного кода
ОбработатьПолученныйШтрихкод(Штрихкод);
КонецЕсли;
КонецПроцедуры
Если Система взаимодействия не подключена, классическим решением выступает промежуточный буфер в базе данных с периодическим опросом на клиенте.
Рассмотрим порядок настройки:
ОчередьВходящихШтрихкодов) с измерениями ИдентификаторКлиента, ИдентификаторЗаписи (УникальныйИдентификатор) и ресурсом Штрихкод (Строка).
Функция ОбработатьGET(Запрос)
Штрихкод = Запрос.ПараметрыURL.Получить("Штрихкод");
ИдентификаторКлиента = Запрос.ПараметрыURL.Получить("ИдентификаторКлиента");
МенеджерЗаписи = РегистрыСведений.ОчередьВходящихШтрихкодов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ИдентификаторКлиента = ИдентификаторКлиента;
МенеджерЗаписи.ИдентификаторЗаписи = Новый УникальныйИдентификатор;
МенеджерЗаписи.Штрихкод = Штрихкод;
МенеджерЗаписи.ПериодЗаписи = ТекущаяУниверсальнаяДатаВМиллисекундах();
МенеджерЗаписи.Записать();
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
КонецФункции
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ПроверитьОчередьШтрихкодов", 0.5);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьОчередьШтрихкодов()
Штрихкод = ПолучитьШтрихкодИзОчередиНаСервере(ИдентификаторТекущегоСеанса);
Если ЗначениеЗаполнено(Штрихкод) Тогда
ОбработатьПолученныйШтрихкод(Штрихкод);
КонецЕсли;
КонецПроцедуры
Если требуется сохранить стандартную логику работы типового торгового оборудования без переписывания формы РМК, оптимально использовать внешнюю компоненту Native API, выполняющуюся непосредственно на клиентском компьютере кассира.
Разберем принцип работы:
http://localhost:8080/).http://localhost:8080/scan/1111111111.ExternalEvent.ОбработкаВнешнегоСобытия, как если бы сработал физический сканер.Для интеграций без доработки программного кода 1С можно использовать системные утилиты операционной системы:
Enter в активное поле формы РМК.Выбор варианта зависит от архитектуры инфраструктуры: