Интеграция современного биометрического оборудования с устаревшими платформами автоматизации часто вызывает у разработчиков множество вопросов. В нашей практике мы регулярно сталкиваемся с задачами сопряжения торгового оборудования и систем контроля управления доступом (СКУД) со старыми конфигурациями на платформе 1С:Предприятие 7.7. Одним из наиболее популярных и доступных USB-сканеров на рынке является модель ZKTeco ZK4500. В этой статье мы подробно разберем, как подключить данное устройство к 1С 7.7, проанализируем типовые ошибки разработчиков и рассмотрим готовые варианты реализации кода.
При попытке подключить сканер напрямую через внешние библиотеки (например, libzkfpcsharp.dll) с использованием универсального загрузчика Dynwrapx программисты часто сталкиваются с системной ошибкой «Функция не найдена». Выясним, почему это происходит:
libzkfpcsharp.dll не является самостоятельной низкоуровневой библиотекой, а представляет собой всего лишь обертку (C#-wrapper). Для ее успешной работы в системе должны присутствовать основные C++ библиотеки ядра SDK (например, libzkfp.dll). Если эти файлы отсутствуют в системной директории Windows (SysWOW64 для 64-битных ОС) или в рабочем каталоге базы данных, инициализация вызовет ошибку.Dynwrapx требует строгого соответствия соглашениям о вызове функций (обычно __stdcall для Windows API). Функции внутри .NET-сборок экспортируются иначе, что делает их прямую интеграцию через врапперы невозможной.Для решения этой проблемы мы рассмотрим два наиболее эффективных и проверенных метода интеграции сканера ZKTeco ZK4500 с 1С 7.7.
Компания ZKTeco бесплатно предоставляет разработчикам комплект ZKFinger SDK. В его состав входит готовый к использованию элемент управления ActiveX — библиотека ZKFPEngX.dll (в некоторых версиях SDK она представлена как файл biokey.ocx). Использование этого компонента позволяет обойтись без создания собственных внешних компонент и программировать логику работы оборудования напрямую в среде 1С.
Рассмотрим по шагам процесс установки и настройки ActiveX-компонента:
ZKFPEngX.dll и сопутствующие библиотеки ядра SDK в системную папку (для 64-разрядных Windows это папка C:\Windows\SysWOW64). Откройте командную строку от имени Администратора и выполните следующую команду:
regsvr32 C:\Windows\SysWOW64\ZKFPEngX.dll
СоздатьОбъект().
Решение: Разместим элемент ActiveX непосредственно на форме нашей обработки или документа. Для этого откройте форму в Конфигураторе 1С 7.7, выберите пункт меню «Вставить объект» (Insert Control) и найдите в списке зарегистрированных элементов «ZKFPEngX Control». Задайте созданному элементу понятный идентификатор, например: ЭлементСканер.
Теперь проанализируем программный код, который необходимо разместить в модуле нашей формы для инициализации сенсора:
// Процедура инициализации оборудования при открытии формы
Процедура ПриОткрытии()
Попытка
// Указываем индекс активного сенсора (0 - если подключен один сканер)
ЭлементСканер.SensorIndex = 0;
// Запускаем биометрический движок
РезультатИнициализации = ЭлементСканер.InitEngine();
Если РезультатИнициализации = 0 Тогда
Сообщить("Биометрический сканер ZK4500 успешно инициализирован.");
ИначеЕсли РезультатИнициализации = 1 Тогда
Предупреждение("Ошибка: Не удалось загрузить драйверы сканера отпечатков!");
ИначеЕсли РезультатИнициализации = 2 Тогда
Предупреждение("Ошибка: Сканер отпечатков пальцев не подключен к USB!");
Иначе
Предупреждение("Неизвестная ошибка инициализации устройства. Код: " + РезультатИнициализации);
КонецЕсли;
Исключение
Предупреждение("Критическая ошибка: Компонент ZKFPEngXControl не зарегистрирован на этом компьютере!");
КонецПопытки;
КонецПроцедуры
После успешной инициализации нам нужно настроить обработку событий. Когда пользователь прикладывает палец к сканеру, ActiveX генерирует событие OnCapture. В модуле формы 1С 7.7 мы перехватываем его с помощью предопределенной процедуры, которая формируется по шаблону: [ИмяЭлемента]_[ИмяСобытия].
// Обработчик события успешного сканирования отпечатка пальца
Процедура ЭлементСканер_OnCapture(РезультатСчитывания, ШаблонОтпечатка)
Если РезультатСчитывания = 0 Тогда
// Считывание прошло успешно. ШаблонОтпечатка содержит двоичные данные.
// Переведем двоичные данные шаблона в строковое представление для удобства работы в 1С
СтрокаШаблона = "";
ЭлементСканер.GetTemplateAsString(ШаблонОтпечатка, СтрокаШаблона);
// Вызываем функцию верификации или авторизации пользователя
АвторизоватьСотрудникаПоШаблону(СтрокаШаблона);
Иначе
Сообщить("Ошибка считывания биометрических данных. Пожалуйста, повторите попытку.");
КонецЕсли;
КонецПроцедуры
Если специфика вашей конфигурации не позволяет размещать ActiveX-элементы на формах диалогов (например, если требуется фоновое сканирование в глобальном модуле или работа в фоновых процессах), оптимальным решением станет написание собственной внешней компоненты (ВК) по стандарту COM на C# с использованием платформы .NET.
Рассмотрим структуру простейшего класса-обертки на C# для взаимодействия с 1С 7.7:
using System;
using System.Runtime.InteropServices;
namespace ZK4500_1C_Bridge
{
// Уникальные GUID для регистрации COM-класса и интерфейса
[Guid("A1B2C3D4-E5F6-7A8B-9C0D-1E2F3A4B5C6D")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[ComVisible(true)]
public interface IZKConnector
{
int InitDevice();
string CaptureFingerprint();
}
[Guid("F1E2D3C4-B5A6-9788-7766-554433221100")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class ZKConnector : IZKConnector
{
// Внутренние методы взаимодействия с libzkfp.dll через DllImport
[DllImport("libzkfp.dll")]
private static extern int zkfperr_Init();
public int InitDevice()
{
// Логика инициализации библиотеки и датчика
return zkfperr_Init();
}
public string CaptureFingerprint()
{
// Логика получения шаблона и преобразования в Base64-строку
byte[] templateBuffer = new byte[2048];
// ... Код получения отпечатка из устройства ...
return Convert.ToBase64String(templateBuffer);
}
}
}
При компиляции данной сборки крайне важно соблюдать следующие правила настройки проекта:
regasm.exe:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe ZK4500_1C_Bridge.dll /codebase /tlb
В коде 1С 7.7 работа с такой компонентой будет выглядеть классическим образом:
// Пример работы с самописной ВК на C#
Процедура ПодключитьСборку()
Попытка
Компонента = СоздатьОбъект("ZK4500_1C_Bridge.ZKConnector");
Если Компонента.InitDevice() = 0 Тогда
Сообщить("Собственная компонента успешно подключена!");
КонецЕсли;
Исключение
Сообщить("Не удалось запустить COM-объект компоненты.");
КонецПопытки;
КонецПроцедуры
Рассмотрим подробнее, как организовать хранение биометрической информации и осуществлять быстрый поиск сотрудников в справочнике базы данных 1С 7.7.
1. Хранение шаблонов в справочнике:
Биометрический шаблон представляет собой массив байт, который с помощью метода GetTemplateAsString() преобразуется в текстовую Base64-строку фиксированной длины (обычно от 1 до 4 КБ в зависимости от версии алгоритма). Для хранения этой информации в 1С 7.7 идеально подходит справочник "Сотрудники". Создайте в нем новый реквизит (например, БиометрическийШаблон) со следующими свойствами:
2. Процедура регистрации нового сотрудника (Enrollment):
При регистрации пользователя в системе рекомендуется сделать несколько сканирований (обычно 3 прикладывания пальца) для формирования эталонного шаблона. ActiveX-компонент ZKFPEngX умеет автоматически объединять эти сканы в единый качественный шаблон при помощи встроенного механизма слияния.
3. Процедура сравнения (Верификация 1:1 и 1:N):
Для авторизации сотрудника нам нужно сравнить вновь полученный отпечаток с базой данных. Передавать биометрические данные на сторонние веб-сервисы не требуется — все операции сравнения выполняются локально и мгновенно силами самой библиотеки ZKFPEngX.
Разберем пример кода поиска сотрудника по его отпечатку (алгоритм сравнения "один ко многим"):
// Функция поиска сотрудника в базе данных по текущему скану отпечатка
Функция НайтиСотрудникаПоОтпечатку(ТекущийШаблонСтрокой)
СпрСотрудники = СоздатьОбъект("Справочник.Сотрудники");
СпрСотрудники.ВыбратьЭлементы();
Пока СпрСотрудники.ПолучитьЭлемент() = 1 Цикл
ШаблонИзБазы = СпрСотрудники.БиометрическийШаблон;
Если ПустаяСтрока(ШаблонИзБазы) = 1 Тогда
Продолжить; // Пропускаем сотрудников без зарегистрированных отпечатков
КонецЕсли;
// Метод Verifying From String сравнивает два текстовых шаблона биометрии
// Возвращает True (Истина/1), если степень совпадения выше установленного порога
Если ЭлементСканер.VerifyingFromString(ШаблонИзБазы, ТекущийШаблонСтрокой) = 1 Тогда
// Сотрудник успешно идентифицирован!
Возврат СпрСотрудники.ТекущийЭлемент();
КонецЕсли;
КонецЦикла;
Возврат ПолучитьПустоеЗначение("Справочник.Сотрудники");
КонецФункции
Использование встроенного метода сравнения VerifyingFromString гарантирует высочайшую скорость работы, так как математический расчет сходства векторов отпечатков реализован разработчиками ZKTeco на уровне оптимизированного под x86 машинного кода библиотеки C++, работающей внутри ActiveX.