Интеграция биометрических устройств, таких как сканеры отпечатков пальцев или терминалы распознавания лиц ZKTeco, с системой 1С является востребованной задачей для автоматизации учета рабочего времени. Основная сложность заключается в организации «онлайн-режима», когда при прикладывании пальца к сканеру данные мгновенно попадают в 1С, и на экране пользователя отображается информация о сотруднике. Рассмотрим подробно, как реализовать такую интеграцию, используя SDK от производителя и механизмы платформы 1С.
Для начала разберем, что представляет собой программная прослойка между устройством и 1С. Большинство устройств ZKTeco поддерживают работу через так называемый Standalone SDK (библиотека zkemkeeper.dll). Это ActiveX (COM) компонент, который предоставляет методы для подключения к аппарату по IP-адресу, чтения данных из памяти и, что самое важное, подписки на события.
Проанализируем основные подходы к реализации онлайн-мониторинга:
ВнешнееСобытие.Разберем классический путь. Для работы нам понадобятся файлы SDK, которые обычно регистрируются в системе командой regsvr32 zkemkeeper.dll. Выясним, как инициировать соединение в коде 1С.
Рассмотрим пример инициализации объекта в 1С:
&НаКлиенте
Процедура ПодключитьСканер()
Попытка
ZkDevice = Новый COMОбъект("zkemkeeper.ZKEM.1");
Если ZkDevice.Connect_Net("192.168.1.201", 4370) Тогда
Сообщить("Связь с терминалом установлена успешно!");
// Регистрация события для онлайн-мониторинга
Если ZkDevice.RegEvent(1, 1) Тогда
Сообщить("События успешно зарегистрированы.");
КонецЕсли;
Иначе
Сообщить("Не удалось подключиться к терминалу.");
КонецЕсли;
Исключение
Сообщить("Ошибка при создании COM-объекта: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Для того чтобы 1С «слышала» терминал, необходимо использовать обработчик ожидания или внешнее событие. Важно помнить, что метод RegEvent с параметром 1 заставляет устройство передавать данные о транзакциях в реальном времени.
Как показывает практика и обсуждения специалистов, прямое COM-подключение в 1С может работать нестабильно (особенно при обрывах связи). Рассмотрим более надежный вариант: создание «обертки» на языке C#. Это позволяет решить проблему разрядности (например, если SDK 32-битный, а сервер 1С 64-битный) и обеспечить гарантированную доставку событий.
Проанализируем структуру такой компоненты. Она должна реализовывать интерфейс IInitDone и ILanguageExtender, чтобы платформа 1С воспринимала её как родную. Внутри компоненты мы подписываемся на событие SDK OnAttTransactionEx. Когда сотрудник прикладывает палец, SDK генерирует событие в C#, а наша компонента перебрасывает его в 1С через метод ExternalEvent.
В коде 1С это будет выглядеть следующим образом:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем нашу самописную DLL
ПутьККомпоненте = "C:\Bins\ZkWrapper.dll";
ПодключитьВнешнююКомпоненту(ПутьККомпоненте, "ZkLib", ТипВнешнейКомпоненты.Native);
Драйвер = Новый ("AddIn.ZkLib.FingerprintScanner");
Драйвер.УстановитьСвязь("192.168.1.201");
КонецПроцедуры
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "ZkLib" И Событие = "FingerScan" Тогда
// Переменная "Данные" содержит ID сотрудника
IDСотрудника = Данные;
ВывестиИнформациюОСотруднике(IDСотрудника);
КонецЕсли;
КонецПроцедуры
Если написание DLL кажется слишком сложным, проанализируем ситуацию с использованием штатного ПО от ZKTeco (например, ZKTime.Net). Это ПО работает как служба Windows и постоянно опрашивает терминалы, сохраняя все проходы в базу данных SQL Server или MS Access.
В этом случае мы можем настроить в 1С фоновое задание, которое будет раз в секунду обращаться к таблице событий в SQL базе. Выясним плюсы этого подхода: нам не нужно возиться с низкоуровневыми библиотеками и SDK. Минус — небольшая задержка (около 1 секунды) и нагрузка на сеть при частом опросе.
Пример кода для чтения данных из внешней SQL базы:
Функция ПолучитьПоследниеСобытия() Экспорт
Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Driver={SQL Server};Server=SERVER_NAME;Database=ZKTime;Uid=sa;Pwd=password;";
Connection.Open(ConnectionString);
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = "SELECT TOP 10 UserID, CheckTime FROM Checkinout ORDER BY CheckTime DESC";
Recordset = Command.Execute();
Пока НЕ Recordset.EOF Цикл
// Обработка данных
Recordset.MoveNext();
КонецЦикла;
Connection.Close();
КонецФункции
Важным моментом является то, где именно происходит сравнение отпечатка. Существует два сценария:
UserID. Это самый быстрый и рекомендуемый способ.Подведем итог. Если вы планируете реализовать полноценный онлайн-мониторинг для 1С, придерживайтесь следующего алгоритма:
ВнешнегоСобытия.ВнешнееСобытие, так как это единственный штатный способ в 1С мгновенно отреагировать на действие внешнего оборудования без зависания интерфейса.Таким образом, мы рассмотрели основные технические пути интеграции. Выбор конкретного метода зависит от вашего опыта в программировании на C# или C++, а также от архитектуры вашей сети и моделей используемого оборудования ZKTeco.