Имя: Пароль:
1C
1С v8
Интеграция 1с с Perco.
0 Юзер123
 
naïve
15.10.14
14:59
Всем привет. Как и обещал ранее делюсь наработками.

На данный момент 1С умеет записывать данные в Perco, но не получается научить аппаратуру  понимать то что я сделал, хотя через SDK  модуль данные передаются.

По порядку.

Подключение к базе Perco (FDB файлик где то у вас на диске локальном).
//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 - Сотрудники.

ЗапросНаДобавление = Новый 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 . он бесплатный. Нужен для связи базы и аппаратуры.

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

http://i.gyazo.com/b8d8452f40b9bb216d6cc92d272bfcd7.png
1 Юзер123
 
naïve
15.10.14
15:09
код корявый.  Все запросы без соединений.  Пишу быстро время поджимает) на коленках практически.
2 Йохохо
 
15.10.14
15:12
(0) в орионе после апдейта бп, надо еще "обновить БД в оперативной задаче" и "Перезаписать ключи в приборах", мб что то похожее и в перко
3 Юзер123
 
naïve
15.10.14
15:16
(2)  у меня подозрение что я куда то что то не дописываю.  Я через 1С создаю сотрудника, даю ему карту и доступы, открываю Базу перко. Вижу все изменения которые  я сделал.  Все корректно.  Но аппаратура не реагирует. Даже если через консоль прки передаю данные руками в аппаратуру.  Толку нет.
4 Юзер123
 
naïve
15.10.14
15:20
интересная аудитория

http://i.gyazo.com/c69bda7c9847067e5e2190dea423b26f.png
5 Жан Пердежон
 
15.10.14
15:27
(3) с этого и надо начинать - натрави на сервер какой-нибудь sqlmonitor, fbscanner и т.д., чтобы узнать, какие запросы шлет программа (наверняка дергается какая-нибудь хранимая процедура, которая пишет во все нужные таблицы)
6 silent person
 
15.10.14
15:28
7 Юзер123
 
naïve
15.10.14
15:32
(6)  и? мне кажется в  первом посте инфы больше раза в 4
8 Юзер123
 
naïve
15.10.14
15:32
(5)  как это работает?
9 Юзер123
 
naïve
15.10.14
15:34
(6)  да и автор не особо общительный =) деньгу хочет за любые наводки
10 Юзер123
 
naïve
16.10.14
09:14
никто не делал?
11 Krolik Bezobraznik
 
16.10.14
09:36
На Перке контроллеры перезагружал после заливки на них данных?
12 Krolik Bezobraznik
 
16.10.14
09:39
(10) Не хочу вводит в заблуждение, давно с перкой не имел дело, но помоему в настройках карты должна быть привязка к зонам и уровням доступа а так же еще какой то херне, то ли это называлось домен (не путать с доменом АД) то ли головной узал.. вот хоть убей не помню. Так вот без этой привязки правила для карты не работали.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн