Имя: Пароль:
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) Не хочу вводит в заблуждение, давно с перкой не имел дело, но помоему в настройках карты должна быть привязка к зонам и уровням доступа а так же еще какой то херне, то ли это называлось домен (не путать с доменом АД) то ли головной узал.. вот хоть убей не помню. Так вот без этой привязки правила для карты не работали.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.