УПП + Perco + SDK

24.10.14

Интеграция - Внешние источники данных

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

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

 

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

Вступайте в нашу телеграмм-группу Инфостарт

УПП PERCO perco SDK электронная Проходная

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    30514    42    49    

46

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

122000 руб.

19.08.2020    29197    27    3    

28

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (Базовая, ПРОФ, КОРП, ФРЕШ (тонкий клиент)).

17080 руб.

19.12.2016    53529    121    107    

83

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

05.10.2022    13106    14    8    

16

Внешние источники данных Программист Бизнес-аналитик 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Обработка для выгрузки данных из подготовленных СКД в фоновом режиме в базу ClickHouseDB, PostgreSQL, MySQL, в шину данных с поддержкой REST API (CSV, JSON. SQL), в локальные файлы (CSV, JSON, XLS, XLSX) или в Google Sheets. Это дополнительная подключаемая обработка.

18000 руб.

21.08.2024    8326    21    4    

18

Внешние источники данных Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Розница 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Платные (руб)

Быстро и легко. Выгрузка всех элементов и групп номенклатуры (с их иерархией), кроме помеченных на удаление. Без использования COM-объектов.

4880 руб.

16.08.2023    3746    7    8    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DrAku1a 1792 30.10.14 02:45 Сейчас в теме
Firebird (SQL) - ВК для чтения без дополнительных настроек (Native API) - делал как раз для P.E.R.C.o., есть даже рабочий проект на этом деле.
2. STEPPRK 31 19.12.14 05:41 Сейчас в теме
А где можно найти мануал по SDK Perco?
3. Alex33614 58 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 42 21.11.16 11:12 Сейчас в теме
Здравствуйте, по вашей статье написали процедуру добавления сотрудника из 1С в СКУД PERCo. Выполняется без ошибок, НО них**на не ложится в базу СКУД. В мануале по SDK проверяли файлик xml. Программно формируем такой же.. где косяк не поймем... может помимо staff - таблицы нужно еще что-то заполнить, чтобы новый сотрудник появился в базе СКУД?
7. gos 25.04.19 09:56 Сейчас в теме
Можете подсказать по какой причине могут не загружаться события из Perco при использовании этой обработки http://timeaccount.ru/files/formula_polucheniespiskasobitiiyizperkoposredstvoms­omsoedineniya.epf
Соединение устанавливается, но события входа-выхода не подгружаются
8. gos 26.04.19 09:19 Сейчас в теме
10. Sergio D 24.08.19 16:41 Сейчас в теме
(8) а подскажите в чем проблема?
я менял в обработке код на: COMОбъект("Perco_s20_SDK.ExchangeMain");
9. gospodenkods 21.05.19 14:15 Сейчас в теме
Интересно , а кто нибудь пробовал получить через SDK список пропусков , с зонами и датой действия ?
11. kazakoff 29.01.20 15:10 Сейчас в теме
Выложите пожалуйста SDK а что-то там много бумаг подписывать.
12. kazakoff 08.06.20 14:11 Сейчас в теме
А покажите сам СоздатьXMLОбъектПрименение()
14. trim74 14.06.24 14:06 Сейчас в теме
13. trim74 13.06.24 20:39 Сейчас в теме
Elem.setAttribute("shablon_id_internal",shablon_id_internal );

что возвращает эта функция?
ПолучитьИдШаблонаДоступа(бд);


Подскажите пожалуйста, тут достаточно просто передать id шаблона?
в числовом или строковом формате?

как только не пробовал не подхватывает система его
15. mpzflame 27.12.24 11:29 Сейчас в теме
(13)
вот вырезка из моего кода. Такой xml нужно послать в перко:

ОбъектХМЛ = Новый COMОбъект("MSXML2.DOMDocument.3.0");
Header =   ОбъектХМЛ.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"" standalone=""yes""");
ОбъектХМЛ.appendChild(Header);

documentrequest = ОбъектХМЛ.createElement("documentrequest");
documentrequest.setAttribute("type", "shablon");
documentrequest.setAttribute("mode_display", "staff_and_guest");
node_documentrequest = ОбъектХМЛ.appendChild(documentrequest);

ОтветПерко = ПеркоСоединение.GetData(ОбъектХМЛ);
Если ОтветПерко = 0 Тогда
	Сообщить(ОбъектХМЛ.XML); // здесь будут все id шаблонов
Иначе
	МассивОшибок = Перко_ПолучитьОшибкиСоединения(ПеркоСоединение, МассивОшибок);
КонецЕсли;
Показать
Для отправки сообщения требуется регистрация/авторизация