Работа с 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 не будет опубликован. Обязательные поля помечены *