Работа с PerCo своими силами





Сейчас предлагаются различные готовые модули для работы PerCo с 1С. Но не всегда решение простых задач требует установки дополнительного модуля. Рассмотрим подключение для создания и изменения карт сотрудников.

Сейчас предлагаются различные готовые модули для работы PerCo с 1С, как, например, вот этот http://www.perco.ru/products/sistemy-kontrolya-dostupa/sistema-kontrolya-dostupa-s-20/programmnoe-obespechenie/setevoe/1s-modul-uchet-rabochego-vremeni/. Но не всегда решение простых задач требует установки дополнительного модуля. Рассмотрим подключение для создания и изменения карт сотрудников.

Допустим перед нами стоит задача подключиться и создать новую карту (пропуск) для сотрудника. Для этого нам нужно подключится через СОМ объект к базе:

 

        БД = Новый COMОбъект(«ADODB.Connection»);
       
БД.Provider = «LCPI.IBProvider»;
       
БД.ConnectionString = стрПодключения;
        Попытка
           
БД.Open();
        Исключение
           
Сообщить(«Не удалось подключиться к БД PerCo. » + ОписаниеОшибки());
        КонецПопытки;


Соответственно необходимо, что бы был установлен IBProvider.

В строке подключения должно быть что-то такое:

 

        стрПодключения = «data source = ПутьКФайлу:Файл.fdb; ctype = WIN1251; User ID = sysdba; Password = masterkey; auto_commit = true»;

 

Затем с помощью запросов обращаемся к базе и оперируем данными. Рассмотрим добавление карты в базу, как одно из самых простых.

 

            ЗапросНаДобавление = Новый COMОбъект(«ADODB.Recordset»);
           
ЗапросНаДобавление.ActiveConnection = БД;
           
ТекстЗапросаНаДобавление «Insert INTO STAFF (ID_STAFF, LAST_NAME, FIRST_NAME, MIDDLE_NAME, TABEL_ID, DATE_BEGIN, VALID, TEMPORARY, DELETED) » +
                                       
«VALUES (» + СокрЛП(ID_STAFF) + «, ‘» + Фамилия + «‘, ‘» + Имя + «‘, ‘» + Отчество + «‘, ‘»  + СокрЛП(ТабельныйНомер) + «‘, ‘» + ДатаБезВремени + «‘ , 1, 0, 0)»;
           
ЗапросНаДобавление.Open(ТекстЗапросаНаДобавление);
           
ЗапросНаДобавление.Close();

 

            ЗапросНаДобавлениеКарты = Новый COMОбъект(«ADODB.Recordset»);
           
ЗапросНаДобавлениеКарты.ActiveConnection = БД;
           
ТекстЗапросаНаДобавлениеКарты = «Insert INTO STAFF_CARDS (ID_CARD, STAFF_ID, VALID, DATE_BEGIN, DATE_END, TEMPORARY, DOCUMENTS_ID, HISTORY_DATE, PROHIBIT, IDENTIFIER, TYPE_IDENTIFIER, IDENTIFIER_TRANSFORMED) » +
           
«values (» + СокрЛП(ID_CARD) + «, » + ID_STAFF + «,  1, ‘» + ДатаНачалаДействия + «‘, ‘» + ДатаОкончанияДействия + «‘, 0, 0, ‘» + ТекущаяДата() + «‘, 0, ‘» + НомерКарты + «‘, 0, ‘» + НомерКарты + «‘ )»;
           
ЗапросНаДобавлениеКарты.Open(ТекстЗапросаНаДобавлениеКарты);
           
ЗапросНаДобавлениеКарты.Close();

 

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

При замене пропуска так же нужно заменять права, при изъятии карты удаляем карту и ее права, а также помещаем карту в стоп-лист с описанием причины изъятия. В работе Вам очень пригодится программа IBExpert. В ней очень удобно просматривать таблицы, результаты своих действий, а также можно посмотреть стандартные процедуры.

 

В моем случае я создала отдельный документ с 4-мя видами операций (Первичная выдача пропуска, замена пропуска, изменение прав и изъятие карты) и два регистра сведений: в один попадают строки подключения для разных организаций, в другой пишу права доступа. Как видно на скриншоте, при создании документа загружается полное дерево прав доступа и контроллеры к ним, в этом дереве пользователь может галочками расставлять права доступа.

24 Comments

  1. DimaP

    Хорошо… В старой системе через эксель из перки выгружали, а потом в 1С

    Reply
  2. Wanderer.nk

    Можно попросить у Вас конфигурацию для выдачи карт?

    Reply
  3. Nas'ka

    (2) Wanderer.nk, что Вы имеете ввиду?

    Reply
  4. Walker.pro

    Насколько я понимаю, в PERCO после изменения таблиц нужно еще производить обмен с аппаратурой. Какой командой Вы это делаете?

    Reply
  5. Nas'ka

    (4) Walker.pro, Если вы имеете ввиду сами контроллеры, то при назначении прав, пишу еще в STAFF_CARDS_AREAS_DEVICE

    Reply
  6. Walker.pro

    (5)

    То есть если добавить или изменить запись в таблице STAFF_CARDS_AREAS_DEVICE, то автоматом происходит обмен с контроллерами?

    Reply
  7. Wanderer.nk

    (3) Посмотрел внимательнее на скриншоты и понял, что Вы в УПП запихнули это. Это сделано внешней обработкой?

    Reply
  8. Nas'ka

    (7) Wanderer.nk, да УПП, нет документ

    Reply
  9. Wanderer.nk

    (8) эх, буду сам вписывать в свою конфу. За код и идею спасибо — самому в голову не пришло что-то, а родной софт удручает. Особенно печать бейджиков за 4000 руб.

    Reply
  10. Nas'ka

    (9) Wanderer.nk, успехов в Ваших начинаниях. Конфой не делюсь, сами наверное понимаете почему =) Все пилено-перепилено.

    Reply
  11. DrAku1a

    Эх… Опять что-то устанавливать…

    Я написал компоненту на NativeAPI, которая выполняет SELECT-запрос и сохраняет его результаты в XML-файле для последующего чтения из 1С.

    В Delphi для доступа к FireBird есть набор компонент «InterBase», и используется только GDS32.DLL (либо FBClient.DLL), и ничего устанавливать не нужно, даже если сам FireBird и его база установлены и находятся на удаленном сервере…

    Есть в планах поделиться тут 🙂

    Reply
  12. Diversus

    (10) Уважаемый автор!

    Сейчас занимаюсь примерно тем же, связываю КПП с 1С.

    Жаль конечно, что не поделились конфигурацией пусть даже пиленной-перепиленной )))

    Есть пара вопросов, если не сложно ответьте пожалуйста.

    1) Как добавляете новое подразделение в иерархию? Разобрался, что таблица подразделений SUBDIV_REF, но не понятно что за столбцы N_LEFT и N_RIGHT. И где присваивается родительский элемент?

    2) Какими запросами присваиваете права? Там какая то каша из соединений таблиц: ACCESS_GROUPS, STAFF_CARDS_AREAS_DEVICE, ACCESS_GROUPS. Как строете дерево подразделений?

    3) Получение всех проходов сотрудников по запросу, насколько я понимаю:

    SELECT * FROM REG_EVENTS WHERE (identifier is not null) and (identifier <> 0) ORDER BY ID_REG

    Верно ли?

    Обращение в тех поддержку результатов не принесло. Поэтому сам ковыряюсь. Тяжело, когда ты не знаешь для чего та или иная таблица была задумана авторами.

    Благодарю за любую помощь.

    Reply
  13. Diversus

    +(12) У меня получилось привязать это все к своей конфигурации. Единственное с чем столкнулся: необходимо все же использовать SDK от PerCo.

    Reply
  14. Nas'ka

    (13) Прошу прощения за то, что молчала. Да, без модуля SDK не происходит передачи в аппаратуру. Да и в принципе с SDK не нужно громоздких запросов.

    Reply
  15. Diversus

    (14) Я пробовал сделать все через SDK, но при таком подходе работа из 1С становится невыносимо долгой… Поэтому остановился на комбинированном варианте.

    Все изменения произвожу запросами в которых создаю, изменяю, блокирую пропуски, создаю новых сотрудников и т.д. SDK используется лишь для передачи данных в аппаратуру.

    Работает все очень быстро и без проблем.

    Reply
  16. Aleksey58

    Может немножко не по теме, но возникла задача сделать выгрузку из БД firebird СКУД Реверс, нужно вытащить из нее отчет прохода сотрудников, как можно определить какие таблицы нужно использовать, в самой клиентской программе приложение отчет написано сыровато, фильтры в ней не работают. Может кто-то работал с этой БД?

    Reply
  17. kazakoff

    Может кто выложить SDK хочу на него посмотреть?

    Reply
  18. ilychuk

    А может кто из гуру подскажет где в базе PERCo хранятся значения семейства и самого номера карточки. Пока нашел только идентификатор

    Reply
  19. gospodenkods

    (18) Нашли ? Я просто ищу 🙂

    Reply
  20. ilychuk

    (19)да. Там не хранится семейство и номер, а хранится идентификатор который получается преобразованием семейства и номера через шестнадцатеричную систему

    Reply
  21. svilsa

    (18) Нашли как получить идентификатор карты по коду?

    Reply
  22. svilsa

    (21)Нашелся пример: вот онлайн конвертер: http://guardsaas.com/ru/content/keycode

    Reply
  23. ilychuk

    (21)да. Есть функции на c# для преобразования кода и семейства в идентификатор и наоборот. Могу поделиться

    Reply
  24. svilsa

    (23)Спасибо, нашелся алгоритм на 1С перевода кодов карт RFID в десятичную систему как хранятся в БД Perco:

    Функция ПеревестиКодыКарт(ТЗ)
    Для каждого Строка из Тз Цикл
    Код = Строка.КодКарты;
    Запятая = СтрНайти(Код, «,»);
    Если Запятая = 0 Тогда
    Сообщить(«Неверный код карты » + Строка.Сотрудник + «: » + Строка.КодКарты);
    Продолжить;
    КонецЕсли;
    ЛевЧасть = Число(Лев(Код, Запятая — 1));
    ПравЧасть = Число(Сред(Код, Запятая + 1));
    Лев = Прав(«00» + Из_10_В_Любую(ЛевЧасть), 2);
    Прав = Прав(«0000» + Из_10_В_Любую(ПравЧасть), 4);
    Итог = «» + Лев + Прав;
    Строка.КодКарты10 = Из_Любой_В_10(Итог);
    Сообщить(«» + Код + Символы.Таб + СтрЗаменить(Строка.КодКарты10, Символы.НПП, «»));
    КонецЦикла;
    КонецФункции
    
    Функция Из_10_В_Любую(Знач Значение=0,Нотация=16) Экспорт
    Если Нотация<=0 Тогда Возврат(«») КонецЕсли;
    Значение=Число(Значение);
    Если Значение<=0 Тогда Возврат(«0″) КонецЕсли;
    Значение=Цел(Значение);
    Результат=»»;
    Пока Значение>0 Цикл
    Результат=Сред(«0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ»,Значение%Нотация+1,1)+Результат;
    Значение=Цел(Значение/Нотация) ;
    КонецЦикла;
    Возврат Результат;
    КонецФункции
    //_________________________________________________________
    
    Функция Из_Любой_В_10(Знач Значение=»0″,Нотация=16) Экспорт
    Если Нотация<=0 Тогда Возврат(0) КонецЕсли;
    Значение=СокрЛП(Значение);
    Если Значение=»0″ Тогда Возврат(0) КонецЕсли;
    Результат=0;
    Длина=СтрДлина(Значение);
    Для Х=1 По Длина Цикл
    М=1;
    Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
    Результат=Результат+(Найти(«0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ»,Сред(Значение,Х,1))-1)*М;
    КонецЦикла;
    Возврат Окр(Результат);
    КонецФункции
    

    Показать

    Код перевода из десятичной системы в шестнадцатиричную и обратно взят отсюда: Перевод

    Reply

Leave a Comment

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