Доброго всем времени суток. Поделюсь с Вами опытом, который приобрел совсем недавно, решая задачу по организации доступа к данным базы 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. Он бесплатный. Нужен для связи базы и аппаратуры.
Собственно пока сделал вот так. Сотрудник в базе появляется. Карта и доступы ему присваиваются. Но через турникет не пускает. Буду копать дальше. Если есть идеи или вопросы - пишите.