Получение данных из СКУД Сигур (бывш. Сфинкс)


Обработка содержит функции получения данных из СКУД Сигур (бывш. Сфинкс) хранящиеся в MySQL.
Пример позволяет получать информацию по сотрудникам в заданных отделах и по нахождению на рабочем месте.
Обработка тестировалась на последней версии 1С (8.3.10.2561) и Win Server 2012 R2, использует только стандартные возможности платформы 1С + драйвер для СУБД MySQL.

Обработка содержит функции получения данных из СКУД Сигур (бывш. Сфинкс) хранящиеся в MySQL.

Пример позволяет получать информацию по сотрудникам в заданных отделах и по нахождению на рабочем месте.

Обработка тестировалась на версии 1с (8.3.10.2561) и Win Server 2012 R2, использует только стандартные возможности платформы 1с + драйвер для СУБД MySQL. Создавалась для самописной конфигурации.

Внимание, если вам интересно получать информацию по номерам карточек отличных от стандарта Wiegand-26 (код карты вида XXX,YYYYY) — допишите процедуру "РасшифроватьКарту(Код)", на вход она получает HEX значение из БД. Если вам не интересна информация по номерам карт, то на остальном функционале это никак не отразиться. 

 

 Переменные

Примеры использования:

 

 Примеры использования

Конструктор и деструктор

Использование обработки всегда должно начинаться с вызова конструктора!
 

...
Сигур    = Обработки.Сигур.Создать();
Если Не Сигур.Конструктор(Драйвер) Тогда Возврат КонецЕсли;
...
Сигур.Деструктор();
...
 

 Листинг конструктора и деструктора

Основные функции:

ВыполнитьЗапрос()

ПолучитьСотрудников()

ПолучитьПосещаемость()

 

 Листинг основных функций

ЕСЛИ У ВАС ВОЗНИКЛИ ВОПРОСЫ, С УДОВОЛЬСТВИЕМ ОТВЕЧУ В КОММЕНТАРИЯХ ИЛИ ЛС

50 Comments

  1. 🅵🅾️🆇

    Обращаю внимание, что публикация упорно съедает знаки «<>» — в техпотдержку написал, надеюсь исправят.

    Reply
  2. 🅵🅾️🆇

    (1)Исправили, оперативненько :3

    Reply
  3. 🅵🅾️🆇

    Вот пример для расшировки карт в запросе для W26:

    SELECT
    NAME,
    if(substr(HEX(CODEKEY), 1, 2) = 18,
    CONCAT(
    RIGHT(CONCAT(‘000’, CONV(substr(HEX(CODEKEY), 3, 6), 16, 10) DIV 65536),3),
    ‘,’,
    RIGHT(CONCAT(‘00000’, CONV(substr(HEX(CODEKEY), 3, 6), 16, 10) % 65536), 5)),
    NULL)
    FROM
    `tc-db-main`.personal
    WHERE
    TYPE = ‘EMP’
    AND STATUS = ‘AVAILABLE’
    AND NAME LIKE ‘%Фамилия%’
    LIMIT 10

    Показать

    Reply
  4. 🅵🅾️🆇

    (3) А вот на примере карточки ‘076,07591’ как «запихнуть» обратно:

    CAST(UNHEX(LEFT(CONCAT(’18’, CONV((076*65536)+07591, 10, 16), ‘0000000000000000’), 16)) AS BINARY)

    Может в будующем сделаю статью по загрузке данных в СКУД.

    Но вообще добавление через MySQL запрос в целом выглядит следующим образом:

    
    # Добавляем сотрудника
    INS ERT INTO
    `tc-db-main`.personal
    SET
    PARENT_ID=829, TYPE=’EMP’, NAME='<Имя>’,
    DESCRIPTION=’Добавлен напрямую в MySQL’,
    POS='<Должность>’, TABID='<Номер по табелю>’, STATUS=’AVAILABLE’,
    CODEKEY=CAST(UNHEX(LEFT(CONCAT(’18’, CONV((076*65536)+07591, 10, 16), ‘0000000000000000’), 16)) AS BINARY),
    CODEKEY_DISP_FORMAT=’W26′, SOAA_KEY_STATUS=’UPDATE_REQUIRED’,
    CREATEDTIME=’2017-10-30 10:54:23′;
    
    # Последний добавленный id
    SEL ECT LAST_INSERT_ID() INTO @a;
    
    # Добавляю разрешение на первую дверь
    INS ERT INTO
    `tc-db-main`.devbindings
    SET
    EMP_ID=@a,
    DEV_ID=1;
    
    # Добавляю в режимы
    INS ERT IN TO
    `tc-db-main`.rulebindings
    SET
    PERSONAL_ID=@a,
    RULE_ID=1;
    
    # Инициализирую синхронизацию бд
    /*
    # До этого было импортирован в бд следующий файл:
    USE `TC-DB-MAIN`;
    UPD ATE PARAMI SE T PARAMVALUE=1 WHERE NAME=’SYNCDB_REQUEST_ENABLED’;
    */
    UPDATE `TC-DB-MAIN`.PARAMI SE T PARAMVALUE=1 WHERE NAME=’SYNCDB_REQUEST’;
    
    #Смотрим результат
    SELE CT
    *
    FR OM
    `tc-db-main`.personal AS P
    WHERE
    Name like ‘%<Имя>%’
    AND STATUS = ‘AVAILABLE’
    LIMIT 100
    
    

    Показать

    .

    Reply
  5. Reftp

    Добрый день, подскажите удалось ли реализовать выгрузку фото в Сигур?

    Reply
  6. 🅵🅾️🆇

    (5)

    Привет.

    Фотки в сигуре не вели.

    И Я на том месте уже не работаю.

    Так что вряд ли смогу подсказать)

    Но это 100% реально сделать.

    Reply
  7. user1043249

    (5)

    Выгрузку фото сделать несложно. Кроме вставки в таблицу PERSONAL надо еще добавлять строку в таблицу PHOTO, колонки:

    ID — ID объекта. =PERSONAL.ID.

    PREVIEW_RASTER — Уменьшенная копия фотографии в формате JPEG в цветовом пространстве RGB *1.

    HIRES_RASTER — Полноразмерная фотография в формате JPEG в цветовом пространстве RGB *1.

    TS — «Версия фотографии». Целое число, которое меняется тогда и только тогда, когда меняется сама фотография (поля _RASTER). Может быть, например, хешем от изображения или временем его создания. Используется в работе кеша фотографии на стороне клиентских мест, а также кеша биометрических дескрипторов, которые строятся системой автоматически для добавляемых или изменяемых фотографий.

    *1 Уменьшенная копия фотографии используется в интерфейсе системы там, где область ее отображения минимальна. Рекомендуется в качестве уменьшенной копии записывать версию фотографии, не превышающую размера 256×256 пикселей, в качестве полноразмерной — не превышающую размера 1920×1080 пикселей.

    Допускается записывать в качестве уменьшенной копии тоже самое, что и в качестве полноразмерной, в т.ч. изображение достаточно большого размера.

    Reply
  8. Kontakt

    Просто достать все карты за период в формате 000,0000. время входа, выхода. справочник персонал не ведется.

    Знаем только номер карты. пример 000,12345.

    Хотим получить данные по этой карте.

    например запрос

    select id,logtime,devhint,logdata,ord(substr(logdata,5,2)) as dir from logs where substr(logdata,1,2)=0xFE07

    известен только номер xxx,12345

    Reply
  9. 🅵🅾️🆇

    (8)

    Это вопрос?)

    Reply
  10. Kontakt

    (9)да

    Reply
  11. Kontakt

    if(substr(HEX(logdata), 1, 2) = 18,

    CONCAT(

    RIGHT(CONCAT(‘000’, CONV(substr(HEX(logdata), 3, 6), 16, 10) DIV 65536),3),

    ‘,’,

    RIGHT(CONCAT(‘00000’, CONV(substr(HEX(logdata), 3, 6), 16, 10) % 65536), 5)),

    NULL)

    а что данное условие делает? substr(HEX(logdata), 1, 2) = 18

    Reply
  12. Kontakt

    (11)

    substr(HEX(logdata), 1, 2)

    разобрался.

    Может помнишь как достать из 0xFE0700010103000000001800F20C00000000FFFF код карты 000,61664

    Reply
  13. 🅵🅾️🆇

    (12)

    Насколько помню, проверяет является ли карта в формате Wiegand-26, в противном случае возвращает null, но это было давно и не правда.

    Вот как расшифровать в mysql запросе:

    SEL ECT
    NAME,
    if(substr(HEX(CODEKEY), 1, 2) = 18,
    CONCAT(
    RIGHT(CONCAT(‘000’, CONV(substr(HEX(CODEKEY), 3, 6), 16, 10) DIV 65536),3),
    ‘,’,
    RIGHT(CONCAT(‘00000’, CONV(substr(HEX(CODEKEY), 3, 6), 16, 10) % 65536), 5)),
    NULL)
    FR OM
    `tc-db-main`.personal
    WHERE
    TYPE = ‘EMP’
    AND STATUS = ‘AVAILABLE’
    AND NAME LIKE ‘%Фамилия%’
    LIMIT 10

    Показать

    Смысл тут — взять кусочек HEX, превратить его в число. Поделить на 65536 и записать в формате 000

    Затем взять еще кусочек HEX, снова в число, получить остаток от деления на 65536 и записать в формате 00000

    Затем объединить это дело в 000,00000

    Вот так функцией 1с:

    // Алгоритм дан только для карт Wiegand-26
    Функция РасшифроватьКарту(Знач Код)
    Если ТипЗнч(Код) = Тип(«Строка»)
    И Лев(Код, 2) = «18» Тогда // Wiegand-26
    Код = ЛюбаяДес(Сред(Код, 3, 6), 16);
    Возврат СтрШаблон(«%1,%2»,
    Формат(Цел(Код/65536), «ЧЦ=3; ЧВН=; ЧГ=0»),
    Формат(Код%65536, «ЧЦ=5; ЧВН=; ЧГ=0»));
    Иначе
    Возврат Неопределено;
    КонецЕсли;
    КонецФункции // РасшифроватьКарту()

    Показать

    Reply
  14. Re:аниматор

    Нет функций

    СтрШаблон()

    СтрРазделить()

    Reply
  15. 🅵🅾️🆇

    (14) У вас очень старая платформа?

    СтрШаблон — подставляет параметры в строку. Аналог в других языках — format

    СтрРазделить — разбивает строку в массив подстрок по заданому разделителю. Аналог в других языках — split

    Reply
  16. Re:аниматор

    (15) 1С:Предприятие 8.3 (8.3.9.2170)

    Reply
  17. 🅵🅾️🆇

    (16) http://v8.1c.ru/o7/201408str/index.htm

    Значит режим совместимости стоит)

    Reply
  18. Re:аниматор

    Понял режим совместимости Версия 8.2.13

    Reply
  19. Re:аниматор
    Функция СтрРазделить(Строка, Разделитель, ВключатьПустые = Ложь)
    МассивЗначений = Новый Массив();
    Символ = Найти(Строка, Разделитель);
    Пока Символ > 0 Цикл
    Если ВключатьПустые или (СтрДлина(Лев(Строка, Символ — 1)) > 0) Тогда
    МассивЗначений.Добавить(Лев(Строка, Символ — 1));
    КонецЕсли;
    Строка = Прав(Строка, СтрДлина(Строка) — Символ);
    Символ = Найти(Строка, Разделитель);
    КонецЦикла;
    Если (ВключатьПустые или СтрДлина(Строка) > 0) Тогда
    МассивЗначений.Добавить(Строка);
    КонецЕсли;
    Возврат МассивЗначений;
    КонецФункции

    Показать

    Reply
  20. 🅵🅾️🆇

    (19) Ну да, можете поискать эти функции в общем модуле бсп по работе со строками.

    Но с 8.3.6 это включено в платформу.

    Reply
  21. Re:аниматор

    СтрШаблон заменил на СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку()

    Reply
  22. Re:аниматор

    СтрРазделить это СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок()

    Reply
  23. Re:аниматор

    (0) Подскажите как называется имя базы по умолчанию? Представители установили, а имя базы для подключения не знают, доступа у меня к серверам нет.

    Сервер = есть

    Порт = есть

    Имя Базы = НЕТ

    Пользователь = есть

    Пароль = есть

    Reply
  24. 🅵🅾️🆇

    (23)

    `tc-db-main` — справочники

    `tc-db-log` — события

    Reply
  25. user869223

    Здравствуйте. Подскажите, пожалуйста, где хранятся номера пропусков, если пропуск не один? В таблице personal хранится только одна запись по сотруднику. Соответственно, одна запись CODEKEY и одно значений пропуска. В самом приложении СИГУР вводим по сотруднику несколько пропусков. Как найти номер второго пропуска?

    Reply
  26. 🅵🅾️🆇

    (25) Привет, честно говоря, не помню и сугура под рукой нет уже давно.

    Но точно получал и выводил несколько пропусков по сотруднику.

    Возможно в списке сотрудников по одному человеку прям несколько записей.

    Reply
  27. user869223

    (26)Запросом по сотруднику только одну строку получаем. И ID сотрудника — это ключевое поле по таблице.

    Reply
  28. 🅵🅾️🆇

    (27) Не помню, честно)

    Reply
  29. user869223

    Все оказалось очень просто: первый пропуск хранится в таблице Personal. Все последующие номера пропусков находятся в таблице personal_key.

    Reply
  30. 4iga-buga

    «ЛюбаяДес » что за функция?

    Reply
  31. 🅵🅾️🆇

    (30) Перевод в десятичную систему счисления из шестнадцатиричной.

    Reply
  32. 4iga-buga

    А можете помочь с преобразованием номера карты em-marine вида «0008599310» в код Wiegand «000003066E1D»?=) буду крайне признателен, самому знаний не хватает и где взять найти не могу)

    Reply
  33. 🅵🅾️🆇

    (32) Неа, не знаю я как формируется emmarine.

    По поводу виганда — просил у саппорта СКУДа скинуть мне данные.

    Они скинули экселевский файл с формулой.

    Reply
  34. user1043249

    (32)

    1) переводите 0008599310 в двоичную форму, получается:

    100000110011011100001110

    2) дополняете слева нулями до 24 бит:

    100000110011011100001110 (в данном случае их и так было 24)

    3) разбиваете по-середине на две части по 12 бит:

    100000110011 011100001110

    4) считаете кол-во единиц в левой и правых частях:

    100000110011 => N1=5

    011100001110 => N2=6

    5) C1 = N1%2, т.е. остаток от деления N1 на 2.

    C1 = 1

    6) C2 = (N2+1)%2, т.е. остаток от деления (N2+1) на 2.

    C2 = 1

    7) добававляете C1 слева двоичного представления, C2 — справа:

    1 100000110011 011100001110 1

    8) воспринимаете результат как 26-и битное целое, переводите его в hex:

    3066E1D

    9) дополняете слева нулями до 12 знаков:

    000003066E1D

    Очевидно же все.

    Reply
  35. 4iga-buga

    (34) разобрался уже, спасибо. кому нибудь точно пригодится, в инете в большинстве ресурсов как то коряво написано или не полностью

    Reply
  36. kievol

    Возможно ли с помощью данной обработки выгружать данные в табель, если да то подскажите пожалуйста как? как её применить в управляемых формах? Спасибо.

    Reply
  37. 🅵🅾️🆇

    (36) Это скорее полуфабрикат для разработчиков.

    Сигурда под рукой уже с год нету.

    Вообще это реализуемо естественно.

    Reply
  38. kievol
    Reply
  39. 🅵🅾️🆇

    (38)

    Судя по всему вы не объявили переменные в модуле объекта:

    Обработка содержит публичные переменные/реквизиты:
    ВремяДома (Целое число [2]), Limit (Строка [10]), Табель (Строка [100])
    Их описание дано в функции «Конструктор»
    
    Приватные переменные:
    Connection — COM Объект ADODB.Connection
    Recordset   — COM Объект ADODB.Recordset
    Reply
  40. kievol

    Огромное спасибо. Теперь намного лучше, но появились ещё 2 ошибки помогите пожалуйста разобраться и с ними

    инициализации модуля: Обработка.Сигур.Форма.Форма.Форма

    по причине:

    {Обработка.Сигур.Форма.Форма.Форма(5,12)}: Неопознанный оператор

    Connection <<?>>- COM Объект ADODB.Connection

    {Обработка.Сигур.Форма.Форма.Форма(51,1)}: Определения процедур и функций должны размещаться перед операторами тела модуля

    <<?>>Функция Конструктор( Знач Драйвер,

    Reply
  41. 🅵🅾️🆇

    (40)

    1) наверное забыли установить драйвер для работы с MySQL

    2) не там переменные объявили.

    Они должны объявлятся в самом начале модуля объекта.

    Reply
  42. kievol

    Вот не задача, драйвер установлен и переменные указаны правильно, да вот всё равно ошибки не прекращаются

    {Обработка.Сигур.МодульОбъекта(2,12)}: Неопознанный оператор

    Connection <<?>>- COM Объект ADODB.Connection (Проверка: Сервер)

    {Обработка.Сигур.МодульОбъекта(48,1)}: Определения процедур и функций должны размещаться перед операторами тела модуля

    <<?>>Функция Конструктор( Знач Драйвер = «SQL Server», (Проверка: Сервер)

    Reply
  43. 🅵🅾️🆇

    (42)

    Определения процедур и функций должны размещаться перед операторами тела модуля

    Либо переменные объявили не там где надо, либо точку с запятой установили после «КонецПроцедуры»

    Reply
  44. kievol

    Спасибо конечно за подсказки, но увы не чего не получается с этими ошибками, быстрее всего нужно смотреть саму обработку для полного анализа

    Reply
  45. kievol

    Добрый день! Подскажите пожалуйста как выполнить загрузку из mysql с определенного id при попытке запроса WHERE ID > ‘2570’ 1с всё равно обходит все записи. Спасибо.

    Reply
  46. 🅵🅾️🆇

    (45) Поставьте себе какойнить удобный запросник или phpmyadmin или datagrip. Там и эксперементируйте.

    Reply
  47. kievol

    Эксперементировал там отрабатывает правильно в 1с нет

    Reply
  48. wandergraf

    Добрый день!

    Reply
  49. wandergraf

    Добрый день!

    Настраиваю новую базу данных сигура.

    помню что для работы с персоналом нужна таблица personal в tc-db-main

    Но не могу подключиться к базе

    логин root

    а пароль какой? Пустой, sphinx и т.п. не подходят….

    Reply
  50. 🅵🅾️🆇

    (49) Позвони в саппорт, они вежливо и сразу отвечали на все вопросы.

    Также на оффсайте есть ман.

    Я уже два года не занимаюсь сфинксом-сигуром, ничего не помню)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *