При автоматизации рабочих мест кассиров, операторов или администраторов часто возникает задача организации биометрической авторизации. Использование персонального сканера отпечатков пальцев для каждого сотрудника — идеальное решение, однако на практике клиенты часто просят оптимизировать расходы и использовать один физический USB-сканер (например, популярную модель Anviz U-Bio) на два близко расположенных рабочих места (окошка обслуживания).
Напрямую подключить одно USB-устройство к двум системным блокам невозможно из-за ограничений самой шины USB. Тем не менее, эту задачу можно решить с помощью правильной программной архитектуры в «1С:Предприятии» или применения специализированного системного софта. В этой статье мы подробно рассмотрим все возможные варианты — от простых до самых надежных и современных.
---
Это классический и самый очевидный способ реализации логики совместного доступа средствами самой платформы «1С». Суть метода заключается в разделении ролей компьютеров на «Сервер сканирования» (хост, к которому физически подключен USB-сканер) и «Клиент» (второй компьютер, которому требуется получить данные сканирования).
Рассмотрим по шагам алгоритм работы этой схемы:
РегистрСведений.ЗапросыБиометрии) или специальную константу.Для реализации записи запроса со второго компьютера мы можем использовать следующий код:
Процедура СоздатьЗапросНаСканирование(ИдентификаторКассы) Экспорт
НоваяЗапись = РегистрыСведений.ЗапросыБиометрии.СоздатьМенеджерЗаписи();
НоваяЗапись.КассаИсточник = ИдентификаторКассы;
НоваяЗапись.СтатусЗапроса = Перечисления.СтатусыЗапросовБиометрии.Ожидание;
НоваяЗапись.ДатаЗапроса = ТекущаяДатаСеанса();
НоваяЗапись.РезультатСканирования = "";
НоваяЗапись.Записать(Истина);
КонецПроцедуры
На хост-компьютере, к которому подключено устройство, настраивается регулярное фоновое выполнение процедуры проверки:
Процедура ПроверитьНаличиеЗапросов() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗапросыБиометрии.КассаИсточник КАК КассаИсточник
|ИЗ
| РегистрСведений.ЗапросыБиометрии КАК ЗапросыБиометрии
|ГДЕ
| ЗапросыБиометрии.СтатусЗапроса = ЗНАЧЕНИЕ(Перечисление.СтатусыЗапросовБиометрии.Ожидание)";
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Вызываем процедуру сканирования пальца через компоненту Anviz
ДанныеОтпечатка = ПолучитьСнимокСоСканера();
Если ЗначениеЗаполнено(ДанныеОтпечатка) Тогда
ЗаписатьРезультатСканирования(Выборка.КассаИсточник, ДанныеОтпечатка);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Важная особенность: Чтобы постоянный опрос базы данных не блокировал основной интерфейс кассира на Компьютере 1, рекомендуется запустить на этом компьютере отдельный фоновый («технический») сеанс «1С» под специальным пользователем. Этот сеанс будет монопольно владеть компонентой сканера и выполнять обработку очереди запросов в цикле.
---
Предыдущий способ имеет существенный недостаток: периодический опрос базы данных (даже раз в 1-2 секунды) создает постоянную паразитную нагрузку на СУБД и вносит задержку в работу пользователей. Чтобы избавиться от задержек, мы можем использовать встроенные механизмы интеграции «1С» — HTTP-сервисы.
При такой схеме Компьютер 1 выступает в роли локального веб-сервера (или обращается к базе данных, опубликованной на веб-сервере IIS/Apache):
BiometryExchange).Рассмотрим пример создания метода чтения данных в модуле HTTP-сервиса «1С»:
Функция ПередатьДанныеСканирования(Запрос)
// Получаем тело запроса с шаблоном отпечатка пальца
ДанныеШаблона = Запрос.ПолучитьТелоКакСтроку();
ИдентификаторПолучателя = Запрос.ПараметрыЗапроса.Получить("ИдентификаторПолучателя");
// Помещаем данные во временное хранилище или передаем через систему взаимодействия
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеШаблона, Новый УникальныйИдентификатор);
// Оповещаем ждущего клиента (например, через Систему Взаимодействия)
ОповеститьКлиентаОСканировании(ИдентификаторПолучателя, АдресХранилища);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИЗСтроки("Данные успешно приняты и перенаправлены.");
Возврат Ответ;
КонецФункции
---
Если ваша конфигурация развернута на платформе «1С:Предприятие 8.3» версии 8.3.10 и выше, оптимальным способом связывания двух клиентских мест является использование штатной Системы взаимодействия. Этот механизм работает поверх протокола веб-сокетов, что гарантирует мгновенную (доли секунды) доставку сообщений между сеансами без необходимости опроса СУБД.
Разберем алгоритм работы по шагам:
"ЗапуститьСканирование".Пример отправки сообщения через Систему взаимодействия:
Процедура ОтправитьЗапросНаСканированиеЧерезСВ(ИдентификаторПользователяХоста)
// Получаем обсуждение один-на-один с пользователем компьютера-хоста
ВыборкаПользователей = Новый Массив;
ВыборкаПользователей.Добавить(ИдентификаторПользователяХоста);
Обсуждение = СистемаВзаимодействия.СоздатьОбсуждение(ВыборкаПользователей);
Обсуждение.Ключ = "БиометрическийЗапрос_" + Строка(Новый УникальныйИдентификатор);
Обсуждение.Записать();
НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(Обсуждение.Идентификатор);
НовоеСообщение.Текст = "ЗапуститьСканирование";
НовоеСообщение.Записать();
КонецПроцедуры
---
Если вы хотите избежать доработки конфигурации «1С» и написания сложного программного кода взаимодействия сеансов, можно решить задачу на уровне системного администрирования. Для этого используются специализированные утилиты класса USB-over-IP (например, VirtualHere или USB Network Gate).
Проанализируем сценарий настройки этого решения:
Важный нюанс автоматизации: Так как монопольно использовать сканер в один момент времени может только один компьютер, нам необходимо динамически управлять подключением устройства. Программа VirtualHere поддерживает управление через интерфейс командной строки (CLI).
Мы можем написать в «1С» простую процедуру, которая перед вызовом окна авторизации будет «захватывать» устройство по сети, а после закрытия формы — «отпускать» его для возможности использования на первом компьютере:
Процедура УправлениеПодключениемСканера(РежимПодключения)
ПутьККонсолиКлиента = "C:\VirtualHere\vhuit64.exe";
Если РежимПодключения = "Подключить" Тогда
// Захватываем устройство по его сетевому адресу
ПараметрыЗапуска = "-t ""USE, IP_АДРЕС_ХОСТА, ID_УСТРОЙСТВА""";
Иначе
// Освобождаем устройство
ПараметрыЗапуска = "-t ""FREE, IP_АДРЕС_ХОСТА, ID_УСТРОЙСТВА""";
КонецЕсли;
ЗапуститьСистемноеПриложение(ПутьККонсолиКлиента, ПараметрыЗапуска);
КонецПроцедуры
Этот метод полностью бесплатен при использовании VirtualHere для одного устройства и не требует от разработчика «1С» написания кода обмена шаблонами биометрии.
---
Для полноты картины рассмотрим физический вариант коммутации. На рынке существуют механические и автоматические USB-переключатели (KVM-свитчи), которые позволяют нажатием физической кнопки перенаправлять сигнал с одного USB-порта на один из двух подключенных компьютеров.
Существуют также программно-управляемые USB-реле (USB Relay), которые позволяют управлять коммутацией линий питания USB-кабеля по команде с ПК. Однако у этого подхода есть серьезные технологические недостатки:
Вывод: Аппаратная коммутация с помощью реле или механических переключателей крайне не рекомендуется для работы с чувствительным биометрическим оборудованием.
---
Выбор конкретного метода зависит от архитектуры вашей ИТ-системы и бюджета проекта: