Новичок новичку: PERCo-Web и 1С

08.10.25

Интеграция - WEB-интеграция

Рассказываю на примере, как получать данные из PERCo-Web через api.

Здравствуйте.

Если задать поиск в сети Internet по ключевым словам PERCo-Web и 1С Вы найдете совсем немного статей на эту тему. А те что найдете, будут касаться устаревшей версии PERCo-S-20. Про PERCo-Web будет лишь информация, что где-то есть написанный модуль для 1С, и что его нужно будет купить.

Если Вам нужно получить данные из этой СКУД, то у Вас есть 2 пути: делать запросы к MySQL, на которой, скорее всего, "крутится" PERCo-Web или использовать API. 

MySQL хоть и дает полный доступ к данным, но по умолчанию, не дает доступа с других ПК и моих знаний не хватило, как победить этот момент. API, к сожалению, ограничен данными, и выдает лишь только те, которые предусмотрел разработчик.

Все API инструкции Вы можете увидеть по адресу ВашСерверPERCo-Web/dev. Инструкций довольно много, но кому-то их может и не хватить.

Данные в этой статье мы будем получать через API путем HTTPЗапросов. HTTPЗапросов будет два вида: POST и GET. На самом деле, их больше, но для старта нам этого хватит. Остальное - сами или в комментариях.

Небольшое отступление. В 1С есть метод ВызватьHTTPМетод, в котором можно указать, какой в запросе метод post  или get. Но он используется только для относительно новых версий платформы и только на сервере. Будем стремиться к универсальности. Поэтому, мы будем использовать методы: ОтправитьДляОбработки для post и Получить для get. По этой же причине, я буду показывать код для простого приложения. Для управляемого Вы переделаете его сами.

Для начала, нужно понять, что для получения данных, как и в любом другом случае, нам нужно авторизоваться на сервере. Авторизация здесь происходит не по логину паролю, а по длинной строке различных символов. Такая строка называется ключом или токеном. А вот сам токен уже можно получить по логину и паролю.

Вы можете получить токен, при помощи API запроса /system/auth. В документации есть подробный раздел даже с примерами для разных языков программирования, но, видимо, разработчик 1С за язык не считает, потому его (примера) для 1С нет. В документации написано, что следует использовать метод POST. Для получения токена я написал такую функцию:

Функция ВернутьТокен (server, login, password)
	// Заголовок запроса.
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-type", "application/json; charset=UTF-8");
	Заголовки.Вставить("Authorization", "Bearer null");
	
	// Запрос     
	АдресЗапроса = "/system/auth";
	Запрос = Новый HTTPЗапрос(АдресЗапроса, Заголовки);
	
	// Параметры запроса.
	ПараметрыЗапроса = Новый Структура;
	ПараметрыЗапроса.Вставить("login", login);
	ПараметрыЗапроса.Вставить("password", password);
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.ПроверятьСтруктуру = Ложь;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
	тхтJSON = ЗаписьJSON.Закрыть();
	Запрос.УстановитьТелоИзСтроки(тхтJSON);
	
	// Соединение
	Соединение  =  Новый HTTPСоединение(server);
	Попытка
		Ответ = Соединение.ОтправитьДляОбработки(Запрос);
		ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
		Если Ответ.КодСостояния = 200 Тогда
			Чтение = Новый ЧтениеJSON;
			Чтение.УстановитьСтроку(ТекстОтвета);
			Данные = ПрочитатьJSON(Чтение);
			Чтение.Закрыть();
			Возврат Данные.token;
		Иначе
			Возврат Неопределено;
		КонецЕсли;
	Исключение
		Соединение = Неопределено;
		Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
		Возврат Неопределено;
	КонецПопытки;
КонецФункции

Теперь для получения токена следует выполнить код вида:

Токен = ВернутьТокен("server/api","login","password"); //вставьте реальные данные вместо server, login, password  

Затем, желательно, проверить, что токен это не Неопределено и только тогда использовать его для авторизации (аутентификации). Способы передачи токена для запроса:

  • В заголовке «Авторизация»: «Bearer [ТОКЕН]»
  • В параметре запроса ?token=[ТОКЕН]

Способ передачи токена в параметре запроса небезопасен, поэтому эта возможность будет удалена в ближайшее время.

Токен имеет короткое время действия, по окончании которого, он перестает действовать. Поэтому, мы будем его получать перед каждым запросом, и каждый раз он будет разным.

Теперь получим список сотрудников. Метод GET:

Процедура СписокСотрудников(Кнопка)
	server = "server/api"; //вставьте реальные данные вместо server
	Токен = ВернутьТокен(server,"login","password"); //вставьте реальные данные вместо login, password
	 
	// Заголовок запроса.
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-type", "application/json; charset=UTF-8");
	Заголовки.Вставить("Authorization", "Bearer " + Токен);
	
	// Запрос     
	АдресЗапроса = "/users/staff/fullList";
	Запрос = Новый HTTPЗапрос(АдресЗапроса, Заголовки);
		
	// Соединение
	Соединение  =  Новый HTTPСоединение(server);
	Попытка
		Ответ = Соединение.Получить(Запрос);
		ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
		Если Ответ.КодСостояния = 200 Тогда
			Чтение = Новый ЧтениеJSON;
			Чтение.УстановитьСтроку(ТекстОтвета);
			Данные = ПрочитатьJSON(Чтение);
			Чтение.Закрыть(); 
		КонецЕсли;
	Исключение
		Соединение = Неопределено;
		Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
	КонецПопытки;
КонецПроцедуры

Данные будут в массиве Данные. Разработчик понимает, что все сотрудники нам не нужны, поэтому в эту инструкцию встроен отбор по ids. Это параметр, но вставить его в тело, как в POST не получится, поэтому, добавим его просто изменив URL. Приведу пример для ids=2450,2040:

Процедура ОтборПоID(Кнопка)
	idсотрудников = "2450,2040"; //вставьте реальные данные вместо 2450,2040. можно один, можно больше двух
	server = "server/api"; //вставьте реальные данные вместо server
	Токен = ВернутьТокен(server,"login","password"); //вставьте реальные данные вместо login, password
	 
	// Заголовок запроса.
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-type", "application/json; charset=UTF-8");
	Заголовки.Вставить("Authorization", "Bearer " + Токен);
	
	// Запрос     
	АдресЗапроса = "/users/staff/fullList";
	Запрос = Новый HTTPЗапрос(АдресЗапроса, Заголовки);
	Запрос.АдресРесурса = Запрос.АдресРесурса + "?ids=" + idсотрудников;
		
	// Соединение
	Соединение  =  Новый HTTPСоединение(server);
	Попытка
		Ответ = Соединение.Получить(Запрос);
		ТекстОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
		Если Ответ.КодСостояния = 200 Тогда
			Чтение = Новый ЧтениеJSON;
			Чтение.УстановитьСтроку(ТекстОтвета);
			Данные = ПрочитатьJSON(Чтение);
			Чтение.Закрыть();
		КонецЕсли;
	Исключение
		Соединение = Неопределено;
		Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
	КонецПопытки;
КонецПроцедуры

Третий пример - получение картинки. Там есть свои нюансы.

Процедура Картинка(Кнопка)
	server = "server/api"; //вставьте реальные данные вместо server
	Токен = ВернутьТокен(server,"login","password"); //вставьте реальные данные вместо login, password
	idсотрудника = "2450"; //вставьте реальные данные вместо 2450
	 
	// Заголовок запроса.
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-type", "application/json; charset=UTF-8");
	Заголовки.Вставить("Authorization", "Bearer " + Токен);
	
	// Запрос     
	АдресЗапроса = "/users/" + idсотрудника + "/image";
	АдресЗапроса = АдресЗапроса + "?field_id=1";
	Запрос = Новый HTTPЗапрос(АдресЗапроса, Заголовки);
	
	// Соединение
	Соединение  =  Новый HTTPСоединение(server);
	Попытка
		Ответ = Соединение.Получить(Запрос);
		ТекстОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
		Если Ответ.КодСостояния = 200 Тогда
			Чтение = Новый ЧтениеJSON;
			Чтение.УстановитьСтроку(ТекстОтвета);
			Данные = ПрочитатьJSON(Чтение);
			Чтение.Закрыть();
			ДД = Base64Значение(СтрЗаменить(Данные.image,"data:image/jpeg;base64,", "")); //убираем лишние данные из Base64строки, они в картинку не входят, в отличие от строки 
			кр = Новый Картинка(ДД);
			ЭлементыФормы.Картинка.Картинка = кр; //не забудьте на форме создать элемент управления поле картинки  "Картинка"
		КонецЕсли;
	Исключение
		Соединение = Неопределено;
		Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
	КонецПопытки;
КонецПроцедуры

Адрес запроса формируется довольно сложно. Упростить его у меня не получилось.

Следующий пример - получение подробной информации о сотруднике:

Процедура ПодробнаяИнформация(Кнопка)
	ОчиститьСообщения();
	server = "server/api"; //вставьте реальные данные вместо server
	Токен = ВернутьТокен(server,"login","password"); //вставьте реальные данные вместо login, password
	id = "121"; //вставьте реальные данные вместо 121
	 
	// Заголовок запроса.
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-type", "application/json; charset=UTF-8");
	Заголовки.Вставить("Authorization", "Bearer " + Токен);
	
	// Запрос     
	АдресЗапроса = "/users/staff";
	АдресЗапроса = АдресЗапроса + "/" + id;
	//
	Запрос = Новый HTTPЗапрос(АдресЗапроса, Заголовки);
	
	// Соединение
	Соединение  =  Новый HTTPСоединение(server);
	Попытка
		Ответ = Соединение.Получить(Запрос);
		ТекстОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
		Если Ответ.КодСостояния = 200 Тогда
			Чтение = Новый ЧтениеJSON;
			Чтение.УстановитьСтроку(ТекстОтвета);
			Данные = ПрочитатьJSON(Чтение,Истина); //обратите внимание на параметр Истина. Получаем данные в виде соответствий
			Чтение.Закрыть();
			Сообщить("Код:" + id);
			Сообщить("Найдены карты:");
			Для Каждого identifier Из Данные["identifier"] Цикл
				Сообщить("КодПропуска:" + identifier["identifier"]);
			КонецЦикла;
			Сообщить("Фото:" + Данные["photo"]);
			HTTPСоединение = Новый HTTPСоединение("server"); //вставьте реальные данные вместо server
			HTTPЗапрос = Новый HTTPЗапрос(Данные["photo"]);
			HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
			ДвоичныеДанныеКартинки = HTTPОтвет.ПолучитьТелоКакДвоичныеДанные();
			ЭлементыФормы.Картинка.Картинка = Новый Картинка(ДвоичныеДанныеКартинки); //не забудьте на форме вставить картинку
			Сообщить("ТабНомер:" + Данные["tabel_number"]);
			Сообщить("Фамилия:" + Данные["last_name"]);
			Сообщить("Имя:" + Данные["first_name"]);
			Сообщить("Отчество:" + Данные["middle_name"]);
			Сообщить("Подразделений у сотрудника тут может быть несколько. Найдены следующие:");
			Для Каждого division Из Данные["division"] Цикл
				Сообщить(division.Значение);
			КонецЦикла;
			Сообщить("ДействительноПо:" + Данные.Получить("end_datetime"));			
			Сообщить("Найдены доступы:");
			Для Каждого access_template Из Данные["access_template"] Цикл
				Для Каждого Элемент Из access_template Цикл
					Сообщить(Элемент.Ключ + ":" + Элемент.Значение);
				КонецЦикла;
			КонецЦикла;			
		КонецЕсли;
	Исключение
		Соединение = Неопределено;
		Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
	КонецПопытки;
КонецПроцедуры

Покажу, как использовать фильтр. Фильтр представляет собой неформатированный JSON - в одну строчку вида: {"type": "", "rows": [{"column": "", "value": ""}]} type: 'and' или 'or' - условие выборки, логическое И или ИЛИ. rows - массив объектов, содержащий название колонки и значение для поиска. Например, найдем сотрудника не по ID, а по табельному номеру "007", использовав фильтр {"type": "and","rows": [{"column": "tabel_number","value": "007"}]}

Процедура ПоискПоТабельному(Кнопка)
	ОчиститьСообщения();
	server = "server/api"; //вставьте реальные данные вместо server
	Токен = ВернутьТокен(server,"login","password"); //вставьте реальные данные вместо login, password
	tabel_number = "007"; //вставьте реальные данные вместо 007
	 
	// Заголовок запроса.
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-type", "application/json; charset=UTF-8");
	Заголовки.Вставить("Authorization", "Bearer " + Токен);
	
	// Параметры запроса.
	Фильтр = Новый Структура;
	Фильтр.Вставить("column","tabel_number");
	Фильтр.Вставить("value",tabel_number);
	Колонки = Новый Массив;
	Колонки.Добавить(Фильтр);
	ПараметрыЗапроса = Новый Структура;
	ПараметрыЗапроса.Вставить("type", "and");
	ПараметрыЗапроса.Вставить("rows", Колонки);
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.ПроверятьСтруктуру = Ложь;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
	тхтJSON = ЗаписьJSON.Закрыть();
	//Уберем форматирование в JSON, сделаем в одну строку
	тхтJSON = СтрЗаменить(СтрЗаменить(тхтJSON,Символы.ПС,""),Символы.ВК,"");
	
	// Запрос     
	АдресЗапроса = "/users/staff/table";
	АдресЗапроса = АдресЗапроса + "?status=active" + "&filters=" + тхтJSON; //данная инструкция позволяет искать или только действующих, или только уволенных сотрудников, вставляем параметр действующих, второй параметр идет через знак &
	//
	Запрос = Новый HTTPЗапрос(АдресЗапроса, Заголовки);
	
	// Соединение
	Соединение  =  Новый HTTPСоединение(server);
	Попытка
		Ответ = Соединение.Получить(Запрос);
		ТекстОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
		Если Ответ.КодСостояния = 200 Тогда
			Чтение = Новый ЧтениеJSON;
			Чтение.УстановитьСтроку(ТекстОтвета);
			Данные = ПрочитатьJSON(Чтение);
			Чтение.Закрыть();
			Сообщить(ТекстОтвета);
		КонецЕсли;
	Исключение
		Соединение = Неопределено;
		Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
	КонецПопытки;
КонецПроцедуры

Будьте внимательны! Фильтр ищет не по строгому соответствию, а по вхождению, то есть будут найдены все сотрудники, у которых в табельном встречается 007, например, не только 007, а еще и 0007 и 0070...

И последний пример - запись в СКУД - поменяем табельный номер 007, на 001. Тут следует использовать метод POST:

Процедура КнопкаВыполнитьНажатие(Кнопка)
	server = "server/api"; //вставьте реальные данные вместо server
	Токен = ВернутьТокен(server,"login","password"); //вставьте реальные данные вместо login, password
	ID = "007"; //вставьте реальные данные вместо 007
	 
	// Заголовок запроса.
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-type", "application/json; charset=UTF-8");
	Заголовки.Вставить("Authorization", "Bearer " + Токен);
	
	// Запрос     
	АдресЗапроса = "/users/staff";
	АдресЗапроса = АдресЗапроса + "/" + ID;
	Запрос = Новый HTTPЗапрос(АдресЗапроса, Заголовки);
	
	// Параметры запроса.
	ПараметрыЗапроса = Новый Структура;
	ПараметрыЗапроса.Вставить("tabel_number", "001"); //вставьте реальные данные вместо 001
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.ПроверятьСтруктуру = Ложь;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
	тхтJSON = ЗаписьJSON.Закрыть();
	Запрос.УстановитьТелоИзСтроки(тхтJSON);
		
	// Соединение
	Соединение  =  Новый HTTPСоединение(server);
	Попытка
		Ответ = Соединение.ОтправитьДляОбработки(Запрос);
		ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
		Если Ответ.КодСостояния = 200 Тогда
			Чтение = Новый ЧтениеJSON;
			Чтение.УстановитьСтроку(ТекстОтвета);
			Данные = ПрочитатьJSON(Чтение);
			Чтение.Закрыть(); 
		КонецЕсли;
	Исключение
		Соединение = Неопределено;
		Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
	КонецПопытки;
КонецПроцедуры

На сегодня это все! Жду вопросов, ответов на них, критики и пожеланий.... Вопрос от меня: Как получить доступ к MySQL PERCo-Web? Кто знает - пишите!  

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

См. также

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

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    6409    4    3    

7

SALE! 15%

WEB-интеграция Программист Бизнес-аналитик 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17280 14688 руб.

20.12.2024    3726    18    2    

20

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    21505    29    24    

24

WEB-интеграция 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Оптовая торговля, дистрибуция, логистика Россия Платные (руб)

В расширении реализован механизм интеграции между системой поставщика и Личным кабинетом СДТ. Реализован обмен заказами и реализациями (накладными), предусмотрено отслеживание статусов документов. Расширение предназначено для 1С:УТ 11.4.

35856 руб.

27.11.2024    2009    1    0    

1

Оптовая торговля WEB-интеграция Бюджетный учет Обмен с ГосИС Бухгалтер Пользователь 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Государственные, бюджетные структуры Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обмен данными с "Порталом поставщиков" zakupki.mos.ru Москвы и Московской области с целью создания оферт для закупок государственными учреждениями. Модуль устраняет рутину, минимизирует ошибки и помогает выигрывать больше закупок. Работает строго по требованиям 44-ФЗ.

14400 руб.

13.12.2016    41125    54    39    

37
Для отправки сообщения требуется регистрация/авторизация