Интеграция 1С со системами контроля и управления доступом (СКУД), такими как PERCo, является классической задачей при автоматизации учета рабочего времени. Основная сложность здесь заключается в правильном сопоставлении внутренних идентификаторов карт СКУД с сотрудниками в базе 1С, особенно если у одного человека может быть несколько активных пропусков. В данной статье мы разберем, как получить данные напрямую из базы данных Firebird и как работать с современным REST API PERCo-Web.
Если у вас есть доступ к файлу базы данных PERCo (обычно это файл с расширением .fdb), мы можем извлекать данные с помощью SQL-запросов. Для первоначального анализа структуры таблиц рекомендуется использовать специализированные утилиты, например, IBExpert.
Проанализируем структуру таблиц, которые понадобятся нам для построения отчета о проходах:
IDENTIFIER (идентификатор карты) и временная метка события.ID сотрудников.STAFF_ID с несколькими идентификаторами карт. Это решает проблему, когда у сотрудника больше одного пропуска.Для подключения из 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С. Обычно номер состоит из кода семейства и номера карты. Рассмотрим алгоритм расчета:
НомерИзБазы / 65536 (целочисленное деление).НомерИзБазы % 65536 (остаток от деления).В коде 1С это будет выглядеть так:
КодСКУД = 12648430; // Пример значения из БД
КодСемейства = Цел(КодСКУД / 65536);
НомерКарты = КодСКУД % 65536;
Результат = Формат(КодСемейства, "ЧЦ=3; ЧГ=0") + "," + Формат(НомерКарты, "ЧЦ=5; ЧГ=0");
Современные версии PERCo-Web предоставляют полноценный REST API, что гораздо безопаснее и удобнее, чем прямое чтение таблиц БД. Для работы с API нам не нужны драйверы, достаточно стандартного объекта HTTPСоединение.
Шаг 1. Аутентификация. Сначала необходимо получить токен доступа. Рассмотрим, как это сделать. Мы отправляем POST запрос на эндпоинт /system/auth, передавая логин и пароль. В ответ система вернет token, который нужно вставлять в заголовок Authorization: Bearer [TOKEN] при каждом последующем обращении. Для предварительного тестирования запросов к API можно использовать консоль HTTP-запросов для управляемых форм.
Шаг 2. Получение списка событий. Основной метод для нашей задачи — /accessReports/events (метод GET). Разберем ключевые параметры запроса:
dateBegin и dateEnd — период выгрузки в формате YYYY-MM-DD.rows — количество строк на одной странице (важно для пагинации).page — номер страницы.Рассмотрим пример реализации запроса к API на языке 1С:
Функция ПолучитьСобытияИзAPI(Сервер, Токен, ДатаНачала, ДатаОкончания)
Заголовок = Новый Соответствие;
Заголовок.Вставить("Authorization", "Bearer " + Токен);
ПараметрыЗапроса = "dateBegin=" + Формат(ДатаНачала, "ДФ=yyyy-MM-dd") + "&dateEnd=" + Формат(ДатаОкончания, "ДФ=yyyy-MM-dd");
НТТПЗапрос = Новый HTTPЗапрос("/accessReports/events?" + ПараметрыЗапроса, Заголовок);
Соединение = Новый HTTPСоединение(Сервер, 8080); // Порт по умолчанию часто 8080
Попытка
Ответ = Соединение.Получить(НТТПЗапрос);
Если Ответ.КодСостояния = 200 Тогда
Возврат Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
Исключение
Сообщить("Ошибка связи с API: " + ОписаниеОшибки());
КонецПопытки;
Возврат "";
КонецФункции
Ответ от API приходит в формате JSON. Проанализируем структуру ответа. В массиве rows будут содержаться объекты со следующими полями:
tabel_number — табельный номер сотрудника.fio — ФИО.time_label — точное время события.identifier — номер карты.zone_enter / zone_exit — названия зон (помещений).Для обработки этого текста в 1С мы используем ЧтениеJSON. Полученные данные можно сразу записывать в документ "Регистрация проходов" или напрямую в регистр сведений для дальнейшего формирования табеля учета рабочего времени (Т-13). При необходимости можно воспользоваться отчетом для расширенного анализа план-факта отработанного времени в формате Т-13.
Важный совет: При автоматизации по расписанию через регламентные задания всегда учитывайте возможность дублирования записей. Рекомендуется хранить ID события из PERCo в 1С и перед загрузкой проверять, не была ли эта запись загружена ранее. Также обращайте внимание на часовые пояса сервера СКУД и сервера 1С, чтобы избежать смещения времени проходов.
Таким образом, мы рассмотрели два основных пути интеграции. Выбор между прямым SQL-запросом к .fdb и использованием REST API зависит от версии установленного у вас ПО PERCo и требований безопасности вашей ИТ-инфраструктуры.