В прошлой теме //infostart.ru/public/307641/ выкладывал "труды" по интеграции УПП с системой электронной проходной Perco. Данные записывал напрямую в базу данный электронной проходной , затем передавал в апаратуру но ничего не работало.
Все дело в том , что после очередного обновления разработчики Perco добавили несколько таблиц, в которые так же надо писать данные. Поэтому код, который представлен был в прошлой статье, не приносил желаемого результата.
Читал в комментариях где то здесь, что работа через SDK модуль очень нудная, и процедуры отрабатывают долго. Изучил мануал и решил попробовать. Все оказалось очень даже красиво и просто. Выдача карты доступа занимает порядка 2-3 секунд. Так же удаляются карты и изменяются права.
Делюсь наработками.
Принцип системы достаточно прост. Вы подключаете dll -ку SDK ,заполняете XML файлик определенного формата, вызываете процедуру и в качестве параметра передаете этот XML.
1. Подключение DLL - Открываете командную строку под администратором и пишите regsvr32 "Полный путь до dll". Например
regsvr32 "C:\123.dll"
2. Подключаетесь к DLL через 1С .
Попытка
Соединение = Новый COMОбъект("Perco_s20_SDK.ExchangeMain");
Исключение
Предупреждение("ОШИБКА: Не удалось установить COM соединение с ПО PERCo-S-20. Возможная причина: Отсутствует или не зарегистрирована библиотека ""PERCo_S20_1C.dll"". См. описание ПО ""Perco-S-20""",10);
КонецПопытки;
3. Формируете XML файлик. В качестве примера покажу как делал файл для Добавление Сотрудника с картой и изменения сотрудника.
СоздатьXMLОбъект(БД,mode) Экспорт
Попытка
id_internal = ПолучитьИдСотрудника(БД);
ЛЛ = Сокрлп(id_internal);
id_internal = УбратьПробелы(ЛЛ);
subdiv_id_external = ПолучитьИДПодразделение(БД);
//Должность
ЛЛ = Сокрлп(Должность_.ИД);
ИДДолжности = УбратьПробелы(ЛЛ);
appoint_id_external = ИДДолжности;
//
//Карта
ЛЛ = Сокрлп(Номер);
Л_номер = УбратьПробелы(ЛЛ);
лл= Сокрлп(Семейство);
л_Семейство = УбратьПробелы(ЛЛ);
identifier = ПолучитьНомерКарты(бд);
shablon_id_internal = ПолучитьИдШаблонаДоступа(бд);
КолДней = 365;
КолДнейДобавить = КолДней*24*60*60;
ДатаБезВремени_1 = Формат(ДатаБезВремени,"ДЛФ=Д");
ДатаБезВремени_2 = Формат(ДатаБезВремени+КолДнейДобавить,"ДЛФ=Д");
ТекущаяДата = Формат(ТекущаяДата(),"ДЛФ=Д");
//
XML_DOM = Новый COMОбъект("Microsoft.XMLDOM");
Header = XML_DOM.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"" standalone=""yes""");
XML_DOM.appendChild(Header);
Elem = XML_DOM.createElement("documentrequest");
Elem.setAttribute("type", "staff");
//Elem.setAttribute("mode", "withdraw_one_card_selected_employ");
NodeRoot = XML_DOM.appendChild(Elem);
Elem = XML_DOM.createElement("login");
Elem.setAttribute("loginname", "ADMIN");
NodeRoot = NodeRoot.appendChild(Elem);
Elem = XML_DOM.createElement("workmode");
Elem.setAttribute("mode", Сокрлп(mode));
NodeRoot = NodeRoot.appendChild(Elem);
Elem = XML_DOM.createElement("staff");
NodeRoot = NodeRoot.appendChild(Elem);
Elem.setAttribute("photo", ""); //фотография путь
Elem.setAttribute("date_begin", Формат(ДатаБезВремени,"ДЛФ=Д")); // Дата приема
Elem.setAttribute("graph_id_internal", "0"); // -//- график работы
//Elem.setAttribute("appoint_id_internal",""); // значение Внутреннего ключевого поля Должность
//Elem.setAttribute("subdiv_id_internal",""); // Значение внутреннего ключевого поля подразделение
Elem.setAttribute("graph_id_external", ""); // -//- график работы
Elem.setAttribute("appoint_id_internal", Сокрлп(appoint_id_external)); // значение внешнего ключевого поля Должность
Elem.setAttribute("subdiv_id_internal", Сокрлп(subdiv_id_external)); // Значение внешнего ключевого поля подразделение
Elem.setAttribute("id_internal", Сокрлп(id_internal)); // -//- график работы
Elem.setAttribute("tabl_id", Сокрлп(ТабельныйНомер)); //Табельный номер
Elem.setAttribute("middle_name", Сокрлп(Отчество)); //Отчество
Elem.setAttribute("first_name", Сокрлп(Имя)); // Фамилия
Elem.setAttribute("last_name", Сокрлп(Фамилия)); // Фамилия
Elem.setAttribute("id_external",""); // ID сотрудника в STAFF
//Доступы
Elem = XML_DOM.createElement("identifiers");
NodeRoot = NodeRoot.appendChild(Elem);
Elem = XML_DOM.createElement("identifier");
NodeRoot = NodeRoot.appendChild(Elem);
Elem.setAttribute("shablon_id_internal",shablon_id_internal ); //Ид шаблона доступов
Elem.setAttribute("prohibit", "false"); //Запред на использование карты
Elem.setAttribute("date_end_action", ДатаБезВремени_2); // дата окончания
Elem.setAttribute("date_begin_action",ДатаБезВремени_1); // дата начала действия карты
Elem.setAttribute("identifier",identifier ); // Значение идентификатора
Elem.setAttribute("type_identifier", "family_number"); // Тим идентификатора
//
XML_DOM.save("\\Путь\" + "ИмяФайла.xml");
Исключение
Сообщить("Не удалось создать XML объект.");
XML_DOM=Неопределено;
КонецПопытки;
Возврат XML_DOM;
КонецФункции
Данные для заполнения берем из базы perco через простые SQL запросы. Как подключить описано в предыдущей статье.
5. после заполнения файла подключаемся через SDK к базе и предаем данные.
Процедура SDK(БД)
//Обновляем данные или создаем нового сотрудника
Обновление = ПроверкаСотрудника(БД);
Если Обновление = 1 тогда
mode ="update";
Иначе
mode = "append";
КонецЕсли;
Если Обновление <> 3 тогда
ОбъектХМЛ = СоздатьXMLОбъект(БД,mode);
Попытка
Соединение = Новый COMОбъект("Perco_s20_SDK.ExchangeMain");
Исключение
Предупреждение("ОШИБКА: Не удалось установить COM соединение с ПО PERCo-S-20. Возможная причина: Отсутствует или не зарегистрирована библиотека ""PERCo_S20_1C.dll"". См. описание ПО ""Perco-S-20""",10);
КонецПопытки;
Если Соединение.SetConnect(Сокрлп("ip_адрес_сервера_системы_perco"),Сокрлп("211"),Сокрлп("admin"),Сокрлп("Пароль"))<> 0 тогда
Сообщить("Соединение с сервером системы не установлено!!!");
Иначе
Соединение.SendData(ОбъектХМЛ);
КонецЕсли;
Соединение.Disconnect();
Соединение = Неопределено;
КонецЕсли;
КонецПроцедуры
6. передаем данные в аппаратуру по той же системе. Формируем XML и передаем его через процедуру.
ОбъектХМЛ_1 = СоздатьXMLОбъектПрименение();
Попытка
Соединение = Новый COMОбъект("Perco_s20_SDK.ExchangeMain");
Исключение
Предупреждение("ОШИБКА: Не удалось установить COM соединение с ПО PERCo-S-20. Возможная причина: Отсутствует или не зарегистрирована библиотека ""PERCo_S20_1C.dll"". См. описание ПО ""Perco-S-20""",10);
КонецПопытки;
Если Соединение.SetConnect(Сокрлп("АдресСервера"),Сокрлп("211"),Сокрлп("admin"),Сокрлп("ПарольАдмина"))<> 0 тогда
Сообщить("Соединение с сервером системы не установлено!!!");
Иначе
Соединение.ExecuteAccessCardsAction(ОбъектХМЛ_1);
КонецЕсли;
Соединение.Disconnect();
Соединение = Неопределено;
формат файла XML для передачи карт в апаратуру описан в мануале. Я использовал "Передать Все Изменения" .
Так же для удобства я в УПП сделал справочник "Должности Perco" в который загрузил Все ID должностей в базе перки и Наименования. Чтобы процесс выбора должности занимал меньше времени.
Все работает, все проверено. Если будут вопросы - обращайтесь.