gifts2017

УПП + Perco + SDK

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

1С: УПП интеграция с Perco через SDK

В прошлой теме   http://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 должностей в базе перки и Наименования.  Чтобы  процесс выбора должности занимал меньше времени.

 

Все работает, все проверено.  Если будут вопросы  - обращайтесь. 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Андрей Акулов (DrAku1a) 30.10.14 02:45
Firebird (SQL) - ВК для чтения без дополнительных настроек (Native API) - делал как раз для P.E.R.C.o., есть даже рабочий проект на этом деле.
2. Степан Иванов (STEPPRK) 19.12.14 05:41
А где можно найти мануал по SDK Perco?
3. Алексей Ст (Alex33614) 30.12.14 22:25
(2) STEPPRK, он вместе с модулем поставляется.
4. Михаил Казаков (kazakoff) 07.07.15 13:24
Попытка
Соединение = Новый COMОбъект("Perco_s20_SDK.ExchangeMain");
Исключение
Предупреждение("ОШИБКА: Не удалось установить COM соединение с ПО PERCo-S-20. Возможная причина: Отсутствует или не зарегистрирована библиотека ""PERCo_S20_1C.dll"". См. описание ПО ""Perco-S-20""",10);
КонецПопытки;


Выходит ошибка!

Я думаю что этот объект "Perco_s20_SDK.ExchangeMain" по другому называется.
5. Михаил Казаков (kazakoff) 07.07.15 14:18
Разобрался, а как получить список проходящих?
6. selv selv (selv) 21.11.16 11:12
Здравствуйте, по вашей статье написали процедуру добавления сотрудника из 1С в СКУД PERCo. Выполняется без ошибок, НО них**на не ложится в базу СКУД. В мануале по SDK проверяли файлик xml. Программно формируем такой же.. где косяк не поймем... может помимо staff - таблицы нужно еще что-то заполнить, чтобы новый сотрудник появился в базе СКУД?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа