gifts2017

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

Опубликовал Алексей Ст (Alex33614) в раздел Управление - Интеграция

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

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

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

Читал  тут статью  http://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) 22.10.14 11:20
У перки своя программа, сравнительно удобная, для работы с данными, отчетами и прочим.
Зачем велосипед?
Мы из нее получаем фотки и сотрудников запросом.
3. Алексей Штейнварг (alexstey) 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) 30.10.14 02:46
(2) нифига она не удобная у них. Да и свои отчеты в 1С налабать можно.
6. Алексей Ст (Alex33614) 30.10.14 12:36
Именно. + Программа от перко требует больше операций сделать. И она ( в нашем случае ) на 1 пользователя. а зачем покупать сетевую если моно реализовать это в 1с.
7. selv selv (selv) 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();

Кажется что касяк в самом запросе.??!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа