Интеграция 1С с Perco

Управление - Интеграция

Как работать с  базой электронной проходной Perco  через 1С.

Доброго всем времени суток.  Поделюсь с Вами опытом, который приобрел совсем недавно, решая задачу по организации доступа к данным базы Perco  через 1С.

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

Читал  тут статью  //infostart.ru/public/154693/   и это была основа для меня, с которой я начинал.

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

Также вам понадобится Драйвер для подключения  к FDB   базе. Я брал вот такой Firebird/Interbase(r) driver .  Где качал,  уже не помню. Но точно найти нетрудно.

 

Для просмотра таблиц базы FDB я использовал IBExpert.exe.

Таблиц там очень много! Связаны они через ID.

Начнем по порядку с подключения к базе.

//Loca************

    //

    //БД = Новый COMОбъект("ADODB.Connection");     

    //

    //ПутьКФайлуБД     = "D:1c8_Prohodnaya\SCD17K.FDB"; 

    //ПутьКСерверу="";

    //ПутьКБазе=ПутьКФайлуБД;

    //ИмяПользователя = "Admin";

    //ПарольПользователя = "Admin";

    //

    //

    ////Строка подключения

    //ConnectString = "driver={Firebird/Interbase(r) driver};" +

    //"DbName=localhost:" + ПутьКФайлуБД + ";" +

    //"UID=SYSDBA;" +

    //"PWD=masterkey;" +

    //"CHARSET=WIN1251";

    //

    //БД.ConnectionString = ConnectString;

    //БД.ConnectionTimeOut = 15;

    //БД.CommandTimeout = 30 ;

    //

    //Попытка 

    //    БД.Open(БД.ConnectionString); 

    //    Сообщить("Соединение успешно уставнолено !!!"); 

    //Исключение 

    //    Сообщить("Невозможно установить соединение с Perco: 

    //    | "+ОписаниеОшибки()); 

    //    //    Возврат; 

    //КонецПопытки; 

    
    //local


//Server

    
    БД = Новый COMОбъект("ADODB.Connection"); 
    //БД.ConnectionString = "driver={Firebird/Interbase(r) driver};" + 

    //"Dbname=192.168.10.219:D:\1c8_Prohodnaya\SCD17K.FDB;" +

    //"UID=SYSDBA;" + 

    //"PWD=masterkey;" +  

    //"CHARSET=WIN1251";  

    
    
    БД.ConnectionString = "driver={Firebird/Interbase(r) driver};" + 
    "Dbname=192.168.*.*:C:\SCD17K.FDB;" +
    "UID=SYSDBA;" + 
    "PWD=masterkey;" +  
    "CHARSET=WIN1251";  
    
    
    
    БД.ConnectionTimeout = 15; 
    БД.CursorLocation = 3; 
    // Подключаемся к базе данных 

    
    попытка 
        БД.Open(БД.ConnectionString); 
    исключение 
        Сообщить("Не удалось выполнить подключение " + ОписаниеОшибки()); 
    КонецПопытки;
 

Далее начинаем добавлять данные напрямую в таблици Перко. 

STАFF - Сотрудники.
STАFF - Сотрудники.

ЗапросНаДобавление = Новый COMОбъект("ADODB.Recordset");
    ЗапросНаДобавление.ActiveConnection = БД;
    
    
    ФИОпроверка =  Сокрлп(Фамилия)+Сокрлп(имя)+Сокрлп(отчество);
    
    ПоискВпров = ТЗпров.Найти(ФИОпроверка,"ФИО");    
    
    
    
    
    
    // Максимальный ИД в Таблице для присвоения его новому элементу. 

    ЗапросНаДобавление.Open("SELECT MAX(id_staff) + 1 AS max_id FROM STAFF");
    ИД = Формат(ЗапросНаДобавление.Fields("max_id").Value, "ЧН=; ЧГ=");
    ЗапросНаДобавление.Close();
    
    
    
    
    
    
    
    если Сокрлп(ПоискВпров)<>"" тогда
        Сообщить("Сотрудник  с таким ФИО уже есть в базе данных!!!");    
        
    Иначе
        
        ID_STAFF = ИД;
        ДатаБезВремени_1 = Формат(ДатаБезВремени,"ДЛФ=Д");
        
        ТекстЗапросаНаДобавление =  "Insert INTO STAFF (ID_STAFF, LAST_NAME, FIRST_NAME, MIDDLE_NAME, TABEL_ID, DATE_BEGIN,DATE_DISMISS, VALID, TEMPORARY_ACC, DELETED) " +
        "VALUES (" + СокрЛП(ID_STAFF) + ", '" + Фамилия + "', '" + Имя + "', '" + Отчество + "', '"  + СокрЛП(ТабельныйНомер) 
        + "', '" + ДатаБезВремени_1+ "', '" + ДатаБезВремени_1 + "' , 1, 0, 0)";
        попытка 
            
            ЗапросНаДобавление.Open(ТекстЗапросаНаДобавление); 
        исключение 
            Сообщить ("Проблемы с выполнением запроса к FireBird"); 
            Возврат;
        КонецПопытки; 
        //ЗапросНаДобавление.Close();


Должности и подразделение

ТекстЗапросаПодразделение=  "Insert INTO STAFF_REF (STAFF_ID, DATE_ACTION, SUBDIV_ID, APPOINT_ID, GROUP_WT_ID, LAST_TIMESTAMP) " +
        "VALUES (" + ID_STAFF + ", '" + Формат(ДатаБезВремени_1, "ДФ=dd.MM.yyyy") + "', " + ИДПодразделения + ", " + ИДДолжности + ", 0, '" 
        + Формат(ТекущаяДата(), "ДФ='dd.MM.yyyy HH:mm:ss'") + "')";
        
        попытка 
            
            ЗапросПодразделение.Open(ТекстЗапросаПодразделение); 
        исключение 
            Сообщить ("Проблемы с выполнением запроса к FireBird"); 
        КонецПопытки;
 
 

Выдаем ему карту 

// Максимальный ИД в Таблице для присвоения его новому элементу. 

            ЗапросНаДобавление.Open("SELECT MAX(ID_CARD) + 1 AS max_id FROM STAFF_CARDS");
            ИД = Формат(ЗапросНаДобавление.Fields("max_id").Value, "ЧН=; ЧГ=");
            ЗапросНаДобавление.Close();
            
            ID_CARD = ИД;
            
            ДатаНачалаДействия =ДатаБезВремени_1;
            ДатаОкончанияДействия =  ДатаБезВремени_2;
            
            
            
            ЗапросНаДобавлениеКарты = Новый COMОбъект("ADODB.Recordset");
            
            ЗапросНаДобавлениеКарты.ActiveConnection = БД;
            
            ТекстЗапросаНаДобавлениеКарты = "Insert INTO STAFF_CARDS (ID_CARD, STAFF_ID, VALID,VALID_TRANSFER, DATE_BEGIN, DATE_END, TEMPORARY_ACC, DOCUMENTS_ID, HISTORY_DATE, PROHIBIT, IDENTIFIER, TYPE_IDENTIFIER, IDENTIFIER_TRANSFORMED) " +
            "values (" + СокрЛП(ID_CARD) + ", " + Сокрлп(ID_STAFF) + ",  1, 1,'" + ДатаНачалаДействия + "', '" + ДатаОкончанияДействия + "', 0, 0, '" + ТекущаяДата + "', 0, '" + Сокрлп(НомерКарты) + "', 0, '" + Сокрлп(НомерКарты) + "' )";
            
            
            //Сообщить(ТекстЗапросаНаДобавлениеКарты);

            
            попытка 
                ЗапросНаДобавлениеКарты.Open(ТекстЗапросаНаДобавлениеКарты); 
                
            исключение 
                Сообщить ("Проблемы с выполнением запроса к FireBird" + ОписаниеОшибки()); 
            КонецПопытки; 
            
            
        КонецЕсли;
 

Доступы для карты

 

// Максимальный ИД в Таблице для присвоения его новому элементу. 

            ЗапросНаДоступ.Open("SELECT MAX(ID_STAFF_CARDS_AREAS) + 1 AS max_id FROM STAFF_CARDS_AREAS");
            ИД = Формат(ЗапросНаДоступ.Fields("max_id").Value, "ЧН=; ЧГ=");
            ЗапросНаДоступ.Close();
            
            
            
            ID_STAFF_CARDS_AREAS =  ИД;
            ЛЛ = AREAS_TREE_ID;
            AREAS_TREE_ID = УбратьПробелы(ЛЛ);  // Убиваем пробелы

            AREAS_TREE_ID  =  ЛЛ;
            
            ТекДата = Формат(ТекущаяДата(),"ДЛФ=ДВ");
            
            ТекДата = Сред(Сокрлп(ТекДата),11,11);
            
            ТекстЗапросаНаДоступ =  "Insert INTO STAFF_CARDS_AREAS (ID_STAFF_CARDS_AREAS,STAFF_CARDS_ID, AREAS_TREE_ID,TIME_ATTENDANCE,PROHIBIT,AREAS_IS_REQUIRED) " +
            "values ("+ ID_STAFF_CARDS_AREAS + ", " + СокрЛП(ID_CARD) + ", " + AREAS_TREE_ID + " ,'" + ТекДата +"', 0,0)";
            
            
            //Сообщить(ТекстЗапросаНаДоступ);

            
            ТекстUpdate = "Update STAFF_CARDS_AREAS set STAFF_CARDS_ID = "+СокрЛП(ID_CARD)+", TIME_ATTENDANCE = '" +ТекДата+ "', PROHIBIT = 0, AREAS_IS_REQUIRED = 0, AREAS_TREE_ID = " +AREAS_TREE_ID+"
            | where ID_STAFF_CARDS_AREAS="+ ID_STAFF_CARDS_AREAS ;
            
            
            
            //Сообщить(ТекстUpdate);

            //Возврат;

            попытка 
                ЗапросНаДоступ.Open(ТекстЗапросаНаДоступ); 
                ЗапросНаДоступ.Open(ТекстUpdate); 
                
            исключение 
                Сообщить ("Проблемы с выполнением запроса к FireBird" + ОписаниеОшибки()); 
            КонецПопытки;
 

Сразу же пишем данные в таблицу STAFF_CARDS_AREAS_DEVICE 

 

// Максимальный ИД в Таблице для присвоения его новому элементу. 

            ЗапросНаДоступ_D.Open("SELECT MAX(ID_STAFF_CARDS_AREAS_DEVICE) + 1 AS max_id FROM STAFF_CARDS_AREAS_DEVICE");
            ИД = Формат(ЗапросНаДоступ_D.Fields("max_id").Value, "ЧН=; ЧГ=");
            ЗапросНаДоступ_D.Close();
            
            
            
            ID_STAFF_CARDS_AREAS_DEVICE =  ИД;
            л_Груп = 7478;
            ACCESS_GROUPS_ID = УбратьПробелы(л_Груп);  // Убиваем пробелы

            ACCESS_GROUPS_ID = л_Груп;
            
            
            Если  Сокрлп(AREAS_TREE_ID)= "7432"  тогда
                л_CONFIG_TREE_ID = "5399";
            ИначеЕсли   Сокрлп(AREAS_TREE_ID) = "7433"  тогда
                л_CONFIG_TREE_ID = "6194";
            ИначеЕсли   Сокрлп(AREAS_TREE_ID) = "7434"  тогда
                л_CONFIG_TREE_ID = "6989";
            КонецЕсли;        
            
            CONFIG_TREE_ID = УбратьПробелы(л_CONFIG_TREE_ID);
            CONFIG_TREE_ID = л_CONFIG_TREE_ID;
            
            
            
            
            
            ТекстЗапросаНаДоступ_DEVICE =  "Insert INTO STAFF_CARDS_AREAS_DEVICE (ID_STAFF_CARDS_AREAS_DEVICE,STAFF_CARDS_AREAS_ID, CONFIG_TREE_ID,ACCESS_GROUPS_ID,DELETED,NEVERMORE_TRANSFER) " +
            "values ("+ ID_STAFF_CARDS_AREAS_DEVICE + ", " + СокрЛП(ID_STAFF_CARDS_AREAS) + ", " + CONFIG_TREE_ID +" ," + ACCESS_GROUPS_ID +", 0,0)";
            попытка 
                ЗапросНаДоступ_D.Open(ТекстЗапросаНаДоступ_DEVICE); 
                
            исключение 
                Сообщить ("Проблемы с выполнением запроса к FireBird" + ОписаниеОшибки()); 
            КонецПопытки;
 

Циферки, прописанные руками, это ИД строк в таблицах в нашей базе. В вашей они, естественно, будут другими. 


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

Собственно пока сделал вот так. Сотрудник в базе появляется. Карта и доступы ему присваиваются. Но через турникет не пускает. Буду копать дальше. Если есть идеи или вопросы - пишите. 

См. также

Комментарии
1. John Smith (PiccaHut001) 17.10.14 18:34 Сейчас в теме
"Но через турникет не пускает." - ничего ещё не работает, копайте дальше
2. Василий Борисов (EliasShy) 49 22.10.14 11:20 Сейчас в теме
У перки своя программа, сравнительно удобная, для работы с данными, отчетами и прочим.
Зачем велосипед?
Мы из нее получаем фотки и сотрудников запросом.
3. Алексей Штейнварг (alexstey) 229 22.10.14 12:58 Сейчас в теме
заполнения базы не достаточно. Нужно передать измененные параметры на контроллер турникета или на все контроллеры в системе.
4. John Smith (PiccaHut001) 23.10.14 10:51 Сейчас в теме
(2) EliasShy, вспомнилась молодость, когда я из обработки 1С 7.7 загружал остатки в складскую программу на Джава. Insert-ами в базу на оракле. Отчёты по остаткам сходились, документы проводились, но товары не списывались. Был остаток 100, списали 50, остаток как ни в чём не бывало 100. Пришлось обращаться ребятам в поддержку, мол чего-это товары не списываются, ваша программа не работает. Бедняги корячились дня 4 в pl-sql developere, с матами поправили.
5. Андрей Акулов (DrAku1a) 1213 30.10.14 02:46 Сейчас в теме
(2) нифига она не удобная у них. Да и свои отчеты в 1С налабать можно.
6. Алексей Ст (Alex33614) 30 30.10.14 12:36 Сейчас в теме
Именно. + Программа от перко требует больше операций сделать. И она ( в нашем случае ) на 1 пользователя. а зачем покупать сетевую если моно реализовать это в 1с.
7. selv selv (selv) 41 15.11.16 13:38 Сейчас в теме
Воспользовались вашей статьей, написали обработку по добавлению вновь введенного сотрудника в перку, но по факту исполнение обработки выпадает в исключение еще на этапе обработки запроса по добавлению записи в таблицу STAFF
Вот часть кода обработки:
ТекстЗапросаНаДобавление = "Insert INTO STAFF (ID_STAFF, LAST_NAME, FIRST_NAME, MIDDLE_NAME, TABEL_ID, DATE_BEGIN,DATE_DISMISS, VALID, TEMPORARY_ACC, DELETED,STAFF_STATE) " +
"VALUES (" + СокрЛП(ID_STAFF) + ", '" + Фамилия + "', '" + Имя + "', '" + Отчество + "', '" + СокрЛП(ТабельныйНомер)
+ "', '" + ДатаБезВремени_1+ "', '" + ДатаБезВремени_1 + "' , 1, 0, 0, 0)";
попытка
ЗапросНаДобавление.Open(ТекстЗапросаНаДобавление,СоединениеODBC);
исключение
Сообщить ("Проблемы с выполнением запроса к FireBird при добавлении сотрудника");
Возврат;
КонецПопытки;
ЗапросНаДобавление.Close();

Кажется что касяк в самом запросе.??!
8. Илья Фролов (it4hr) 23 26.01.17 17:08 Сейчас в теме
Тут заметил, что в таблице STAFF_CARDS_AREAS_DEVICE у только что добавленной строки ( через сервер Перки)
поле NEVERMORE_TRANSFER равно единице. А после передачи данных в аппаратуру становиться равным нулю.

9. ilaurel ilaurel (ilaurel) 20.07.17 14:32 Сейчас в теме
Вы пишете, что обязателен модуль SDK.
Но где, в какой момент, он использован? У Вас просто COM соединение.

Спрашиваю, т.к. в инструкции PERCo по подключению через SDK, в разделе "Подключение стороннего ПО к серверу PERCo" ("стороннее ПО" - это 1С) написано, что для подключения следует использовать метод SetConnect.
И что метод вызывается первым и без него COM-соединение не возможно.

Если вы используете SDK, то где этот SetConnect?
10. Алексей Штейнварг (alexstey) 229 20.07.17 17:59 Сейчас в теме
(9) Записать в БД мало. Нужно еще передать обновленную информацию из БД в контроллеры. Вот тут и, видимо, нужен SDK. В примере его вызова нет.
11. Алексей Ст (Alex33614) 30 21.07.17 09:48 Сейчас в теме
(10) да все верно. Ком записывает в Базу SDK передает в Контроллер.
Оставьте свое сообщение