Как интегрировать биометрический терминал ZKTeco с 1С для работы в режиме реального времени?

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

Интеграция биометрических устройств, таких как сканеры отпечатков пальцев или терминалы распознавания лиц ZKTeco, с системой 1С является востребованной задачей для автоматизации учета рабочего времени. Основная сложность заключается в организации «онлайн-режима», когда при прикладывании пальца к сканеру данные мгновенно попадают в 1С, и на экране пользователя отображается информация о сотруднике. Рассмотрим подробно, как реализовать такую интеграцию, используя SDK от производителя и механизмы платформы 1С.

Анализ архитектуры взаимодействия: SDK и 1С

Для начала разберем, что представляет собой программная прослойка между устройством и 1С. Большинство устройств ZKTeco поддерживают работу через так называемый Standalone SDK (библиотека zkemkeeper.dll). Это ActiveX (COM) компонент, который предоставляет методы для подключения к аппарату по IP-адресу, чтения данных из памяти и, что самое важное, подписки на события.

Проанализируем основные подходы к реализации онлайн-мониторинга:

  1. Прямое использование COM-объекта в 1С: Платформа 1С позволяет подключать внешние COM-объекты. Однако на практике это часто приводит к нестабильности, так как 1С не всегда корректно обрабатывает асинхронные события от внешних DLL, особенно в управляемом приложении.
  2. Написание внешней компоненты (Wrapper): Это создание промежуточной DLL (например, на C# или C++), которая берет на себя всю «черную работу» по общению с SDK, а в 1С передает уже готовое ВнешнееСобытие.
  3. Использование Push SDK (ADMS): Современные терминалы могут сами отправлять HTTP-запросы на указанный сервер. В этом случае 1С выступает в роли HTTP-сервиса.

Вариант 1: Использование ActiveX компоненты zkemkeeper.dll

Разберем классический путь. Для работы нам понадобятся файлы 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 заставляет устройство передавать данные о транзакциях в реальном времени.

Вариант 2: Создание внешней компоненты на C# (Native API)

Как показывает практика и обсуждения специалистов, прямое 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Сотрудника);
    КонецЕсли;
КонецПроцедуры

Вариант 3: Работа через промежуточную базу данных

Если написание 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();
КонецФункции

Проблема сравнения шаблонов

Важным моментом является то, где именно происходит сравнение отпечатка. Существует два сценария:

  1. Сравнение на устройстве (1:N): База шаблонов хранится в памяти терминала. 1С получает только числовой UserID. Это самый быстрый и рекомендуемый способ.
  2. Сравнение в 1С (на сервере): Терминал передает «картинку» или математический код (template), а 1С должна сравнить его с базой. Это требует специализированных библиотек (например, VeriFinger), так как стандартными средствами 1С сравнить два массива байтов отпечатка с учетом погрешностей невозможно.

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

Подведем итог. Если вы планируете реализовать полноценный онлайн-мониторинг для 1С, придерживайтесь следующего алгоритма:

Таким образом, мы рассмотрели основные технические пути интеграции. Выбор конкретного метода зависит от вашего опыта в программировании на C# или C++, а также от архитектуры вашей сети и моделей используемого оборудования ZKTeco.

← На главную