Как реализовать загрузку данных о проходах сотрудников из СКУД PERCo в 1С?

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

Интеграция 1С со системами контроля и управления доступом (СКУД), такими как PERCo, является классической задачей при автоматизации учета рабочего времени. Основная сложность здесь заключается в правильном сопоставлении внутренних идентификаторов карт СКУД с сотрудниками в базе 1С, особенно если у одного человека может быть несколько активных пропусков. В данной статье мы разберем, как получить данные напрямую из базы данных Firebird и как работать с современным REST API PERCo-Web.

Способ 1. Работа с базой данных Firebird (.fdb) напрямую

Если у вас есть доступ к файлу базы данных PERCo (обычно это файл с расширением .fdb), мы можем извлекать данные с помощью SQL-запросов. Для первоначального анализа структуры таблиц рекомендуется использовать специализированные утилиты, например, IBExpert.

Проанализируем структуру таблиц, которые понадобятся нам для построения отчета о проходах:

Для подключения из 1С к файлу .fdb нам потребуется настроенный ODBC-драйвер Firebird. Рассмотрим пример функции для установления соединения через ADO:


Функция УстановитьСоединениеСPERCo(ПутьКБазе, Логин, Пароль)
    Соединение = Новый COMОбъект("ADODB.Connection");
    СтрокаПодключения = "Driver=Firebird/InterBase(r) driver;Dbname=" + ПутьКБазе + ";User=" + Логин + ";Password=" + Пароль + ";";
    Попытка
        Соединение.Open(СтрокаПодключения);
        Возврат Соединение;
    Исключение
        Сообщить("Ошибка подключения: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
КонецФункции

После установки соединения мы можем выполнить запрос. Чтобы корректно сопоставить проход с сотрудником, используем JOIN. Проанализируем пример запроса:


ТекстЗапроса = "SELECT 
               |    E.EVENT_DATE, 
               |    S.NAME, 
               |    S.TABEL_NUMBER, 
               |    E.IDENTIFIER 
               |FROM REG_EVENTS E
               |LEFT JOIN CARDS C ON E.IDENTIFIER = C.ID_INTERNAL
               |LEFT JOIN STAFF S ON C.STAFF_ID = S.ID
               |WHERE E.EVENT_DATE >= '2023-01-01'";

Преобразование номера карты

Важный нюанс: номер карты в базе данных часто хранится в десятичном виде (например, 1234567), тогда как на самой карте он нанесен в формате Wiegand 26 (например, 001, 12345). Выясним, как пересчитать эти данные в 1С. Обычно номер состоит из кода семейства и номера карты. Рассмотрим алгоритм расчета:

  1. Код семейства (первая часть): НомерИзБазы / 65536 (целочисленное деление).
  2. Номер карты (вторая часть): НомерИзБазы % 65536 (остаток от деления).

В коде 1С это будет выглядеть так:


КодСКУД = 12648430; // Пример значения из БД
КодСемейства = Цел(КодСКУД / 65536);
НомерКарты = КодСКУД % 65536;
Результат = Формат(КодСемейства, "ЧЦ=3; ЧГ=0") + "," + Формат(НомерКарты, "ЧЦ=5; ЧГ=0");

Способ 2. Использование PERCo-Web REST API

Современные версии PERCo-Web предоставляют полноценный REST API, что гораздо безопаснее и удобнее, чем прямое чтение таблиц БД. Для работы с API нам не нужны драйверы, достаточно стандартного объекта HTTPСоединение.

Шаг 1. Аутентификация. Сначала необходимо получить токен доступа. Рассмотрим, как это сделать. Мы отправляем POST запрос на эндпоинт /system/auth, передавая логин и пароль. В ответ система вернет token, который нужно вставлять в заголовок Authorization: Bearer [TOKEN] при каждом последующем обращении. Для предварительного тестирования запросов к API можно использовать консоль HTTP-запросов для управляемых форм.

Шаг 2. Получение списка событий. Основной метод для нашей задачи — /accessReports/events (метод GET). Разберем ключевые параметры запроса:

Рассмотрим пример реализации запроса к API на языке 1С:


Функция ПолучитьСобытияИзAPI(Сервер, Токен, ДатаНачала, ДатаОкончания)
    Заголовок = Новый Соответствие;
    Заголовок.Вставить("Authorization", "Bearer " + Токен);
    
    ПараметрыЗапроса = "dateBegin=" + Формат(ДатаНачала, "ДФ=yyyy-MM-dd") + "&dateEnd=" + Формат(ДатаОкончания, "ДФ=yyyy-MM-dd");
    
    НТТПЗапрос = Новый HTTPЗапрос("/accessReports/events?" + ПараметрыЗапроса, Заголовок);
    Соединение = Новый HTTPСоединение(Сервер, 8080); // Порт по умолчанию часто 8080
    
    Попытка
        Ответ = Соединение.Получить(НТТПЗапрос);
        Если Ответ.КодСостояния = 200 Тогда
            Возврат Ответ.ПолучитьТелоКакСтроку();
        КонецЕсли;
    Исключение
        Сообщить("Ошибка связи с API: " + ОписаниеОшибки());
    КонецПопытки;
    Возврат "";
КонецФункции

Обработка полученных данных

Ответ от API приходит в формате JSON. Проанализируем структуру ответа. В массиве rows будут содержаться объекты со следующими полями:

Для обработки этого текста в 1С мы используем ЧтениеJSON. Полученные данные можно сразу записывать в документ "Регистрация проходов" или напрямую в регистр сведений для дальнейшего формирования табеля учета рабочего времени (Т-13). При необходимости можно воспользоваться отчетом для расширенного анализа план-факта отработанного времени в формате Т-13.

Важный совет: При автоматизации по расписанию через регламентные задания всегда учитывайте возможность дублирования записей. Рекомендуется хранить ID события из PERCo в 1С и перед загрузкой проверять, не была ли эта запись загружена ранее. Также обращайте внимание на часовые пояса сервера СКУД и сервера 1С, чтобы избежать смещения времени проходов.

Таким образом, мы рассмотрели два основных пути интеграции. Выбор между прямым SQL-запросом к .fdb и использованием REST API зависит от версии установленного у вас ПО PERCo и требований безопасности вашей ИТ-инфраструктуры.

← На главную