Подключение к REST API через OAuth протокол из 1С

Публикация № 889724

Разработка - Системная интеграция - Интеграция с WEB

OAuth REST API

В статье описаны варианты подключения И решение граблей по подключению к REST API через протокол OAuth 2.0 из 1С. При разработке такого подключения для получения данных и загрузки в базу 1С я столкнулся с некоторыми проблемами, решил их и хочу поделиться этими наработками.

Введение

Задача: подключение к REST API по протоколу Oauth 2.0 и получение данных от API для дальнейшего парсинга и загрузки в БД.

Решение состоит из:
* Получение токена авторизации;
* Получение данных с использованием токена авторизации.

Получение токена авторизации

Получение токена авторизации выполняется при помощи POST запроса XTTP, при этом есть нюансы реализации этого запроса для x32 и x64 разрядных версий сервера 1С, а также особенности при работе этого запроса в веб клиенте.

XTTP запрос для получения токена OAuth выглядит следующим образом:

 
&НаКлиенте
Функция XTTPЗапросАвторизации()
	
	XTTPЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
    Скрипт.language = "javascript";
    Скрипт.AddObject("XTTPЗапрос", XTTPЗапрос);
    Скрипт.Eval("XTTPЗапрос.Option(4)=13056");
    
    XTTPЗапрос.Open("Post", "https://ваш_url/connect/token", 0);
    XTTPЗапрос.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    
    ПараметрыPOST = "client_id=ваш_client_id" + "&";
    ПараметрыPOST = ПараметрыPOST + "grant_type=ваш_grant_type" + "&";
    ПараметрыPOST = ПараметрыPOST + "username=" + Логин + "&";
    ПараметрыPOST = ПараметрыPOST + "password=" + Пароль + "&";
    ПараметрыPOST = ПараметрыPOST + "redirect_uri=https://ваш_redirect_uri/callback";
	
    XTTPЗапрос.send(ПараметрыPOST);
	
	Возврат XTTPЗапрос;
	
КонецФункции

&НаКлиенте
Процедура Войти(Команда)
	
	Ответ = XTTPЗапросАвторизации();
    Если Ответ.Status = 200 Тогда
		СтрокаОтвета = Ответ.ResponseText;
	
		РезультатЧтения = ДесериализироватьJSONОтвет(СтрокаОтвета);
		Токен = РезультатЧтения.token; 
	КонецЕсли;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ДесериализироватьJSONОтвет(СтрокаОтвета)
	
	ОтветJSON	= Новый ЧтениеJSON;
	ОтветJSON.УстановитьСтроку(СтрокаОтвета);

	РезультатЧтения	= ПрочитатьJSON(ОтветJSON);
	
	ОтветJSON.Закрыть();

	Возврат РезультатЧтения;

КонецФункции

 

Проблемы при работе с POST XTTP подключением авторизации

1. Ошибка при получении токена на x64 разрядном сервере 1С.

Можно столкнуться с проблемой, когда у клиента 1С в развернута в платном облачном сервисе, где возможности изменить параметры сервера или зарегистрировать дополнительные dll нет возможности, либо запрещено выполнять JavaScript, который в нашем коде создается в строке COMОбъект("MSScriptControl.ScriptControl").

То есть, если подключение XTTP описано на сервере, например в модуле объекта обработки и при этом сервер 1С x64 разрядный, то можно получить следующую ошибку: 

{ВнешняяОбработка.ЗагрузкаЧеков.МодульОбъекта(336)}: Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Class not registered.

2. Ошибка при получении токена при помощи объекта "WinHttp.WinHttpRequest.5.1" на клиенте при работе в веб клиенте 1С.

Если XTTP подключение описано на клиенте в форме обработки, то при выполнении этого кода в браузере Chrome, можно получить следующую ошибку: 

{ВнешняяОбработка.ЗагрузкаЧеков.Форма.ФормаНастроек.Форма(187)}: Тип не определен (COMObject).

Ошибка связана с особенностями запуска ActiveX объектов в браузерах. В Internet explorer текст ошибки может отличаться.

Решение ошибок 

Для решения проблемы с исполнением кода на x64 разрядном сервере нужно перенести код подключения на клиент в форму обработки, так как это представлено в примере кода выше. Но при этом получается что в браузере это решение всё ещё работать не будет. Потому что браузер с нужным нам COM объектом работать не может и углубляться в причины этой проблемы будет просто потерей времени. Гораздо более быстрым решением станет реализация этого запроса при помощи JavaScript помещенного в элемент формы с видом ПолеHTMLдокумента.

Решение получения токена в веб клиенте

Есть различные варианты реализации подхода через ПолеHTMLДокумента. Например можно сделать кнопку "Войти" на форме и по этой кнопке вызывать скрипт описанный в HTML документе, а можно сверстать HTML, поместить его в ПолеHTMLДокумента, то есть кнопка "Войти" будет элементом HTML страницы. Я реализовывал второй вариант.

 
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
// Для веб клиента отключаем элементы формы для подключения через запрос XTTP описанный выше, для не веб клиента соответственно наоборот.
	#Если ВебКлиент Тогда
		ЗаполнитьHTML();
		Элементы.ГруппаНастройкиСоединенияCOM.Видимость = Ложь;
// ГруппаНастройкиСоединенияCOM - содержит поля "Логин", "Пароль", и кнопку "Войти".
	#Иначе
		Элементы.ГруппаНастройкиСоединенияHTML.Видимость = Ложь;
// ГруппаНастройкиСоединенияHTML - содержит строковый реквизит Авторизация, который на форме имеет вид ПолеHTMLДокумента
	#КонецЕсли

КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьHTML()
	
	JavaScript = ПолучитьСкриптАвторизации();

	ТекстХТМЛ = 
	#Область HTMLДокумент
	"<html>
	|<head>
	|    <meta charset=""UTF-8"">
	|    <title>Авторизация</title>
	|</head>
	|<body>
	|    <form>
	|        <table>
	|            <tr>
	|                <td><label for=""loginField"">Логин</label></td>
	|                <td><input id=""loginField"" type=""text"" name=""login""></td>
	|            </tr>
	|            <tr>
	|                <td><label for=""passwordField"">Пароль</label></td>
	|                <td><input id=""passwordField"" type=""password"" name=""password""></td>
	|            </tr>
	|            <tr>
	|                <td colspan=""2"" style=""text-align: center"">
	|                    <input type=""button"" onClick=""authorize()"" value=""Войти"">
	|                </td>
	|            </tr>
	|        </table>
	|    </form>
	|	 <div id=""result"" style=""display:none""></div><div id=""status"" style=""display:none""></div>
	|	 <div id=""showMessage""></div>
	|</body>" + JavaScript + "
	|</html>";
	#КонецОбласти
	
	Авторизация = ТекстХТМЛ;

КонецПроцедуры

&НаКлиенте
Функция ПолучитьСкриптАвторизации()
	
	JavaScriptChrome = 
	#Область JavaScript
	"<script>
	|	window.onload
	|	{
// Если у нас отдельная форма настроек, то при первом открытии этой формы можно "запомнить"
//  значения логина и пароля, а при повторном открытии эти сохраненные данные заполнить в соответствующие поля в HTML.
	|	    var username = document.getElementById(""loginField"");
	|	    username.value = ""%1"";
	|	    var password = document.getElementById(""passwordField"");
	|	    password.value = ""%2"";
	|	}	
// Выполняем запрос к API и полученные данные помещаем в div result.
// А также вызываем функцию showMessage в которой выводим в форму сообщение 
//  о положительном или отрицательном результате выполнения запроса.
	|    function authorize() {
	|        var username = document.getElementById(""loginField"");
	|        var password = document.getElementById(""passwordField"");
	|        var details = {
	|            'client_id': 'ваш_client_id',
	|            'grant_type': 'ваш_grant_type',
	|            'username': username.value,
	|            'password': password.value,
	|            'redirect_uri': 'https://ваш_redirect_uri.com/callback'
	|        };
	|        var formBody = [];
	|        for (var property in details) {
	|            var encodedKey = encodeURIComponent(property);
	|            var encodedValue = encodeURIComponent(details[property]);
	|            formBody.push(encodedKey + ""="" + encodedValue);
	|        }
	|        formBody = formBody.join(""&"");
	|        fetch('https://ваш_url/connect/token', {
	|            method: 'POST',
	|            headers: {
	|                'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
	|            },
	|            body: formBody
	|        }).then(function(response) {
	|    		var status = document.getElementById(""status"");
	|  	  		status.innerHTML = response.status;
	|    		showMessage(response.status);
	|    		return response.json();
	|		}).then(function(answer) {
	|    		var result = document.getElementById(""result"");
	|  		  	result.innerHTML = answer.token;
	|		});
	|    }
	|	function showMessage(statusCode){
	|    	var showMessage = document.getElementById(""showMessage"");
	|    	if(statusCode == ""200"") {
	|        showMessage.innerHTML = ""Подключение выполнено, можно загружать данные."";
	|    	} else {
	|        showMessage.innerHTML = ""Подключение не выполнено, проверьте данные авторизации. Код ответа: "" + statusCode;
	|    	}
	|	}	
	|</script>";
	#КонецОбласти
	
// У Internet Explorer есть ограничения по использованию некоторых методов. 
// Поэтому лучше использовать древние проверенные методы.
	JavaScriptIE = 
	#Область JavaScript
	"<script>
// Аналогично сначала заполняем пароль и логин, если мы повторно открываем форму настроек.
	|	window.onload
	|	{
	|	    var username = document.getElementById(""loginField"");
	|	    username.value = ""%1"";
	|	    var password = document.getElementById(""passwordField"");
	|	    password.value = ""%2"";
	|	}	
// Выполняем запрос получения токена от API.
	|	function authorize() {
	|    	var username = document.getElementById(""loginField"");
	|    	var password = document.getElementById(""passwordField"");
	|		if (window.XMLHttpRequest) {
	|    		xmlhttp = new XMLHttpRequest();
	|		} else {
	|    		xmlhttp = new ActiveXObject(""Microsoft.XMLHTTP"");
	|		}
// Т.к. в 1С встроена 7я версия IE, рекомендую не писать циклов по конкатенации списка параметров, а просто описать их одной строкой,
//  иначе встроенный браузер может ругаться на ошибки скрипта.
	|		var data = ""password=""+password.value+""&username=""+username.value+""&grant_type=ваш_grant_type&client_id=ваш_client_id"";
	|		var xhr = xmlhttp;
	|		xhr.addEventListener(""readystatechange"", function () {
	|    		if (xhr.readyState == 4 && xhr.status == 200) {
	|        		var obj = JSON.parse(xhr.responseText);
	|        		result.innerHTML = obj.token;
	|        		status.innerHTML = xhr.status;
	|				showMessage(xhr.status);				
	|    		}
	|   		if (xhr.readyState == 4 && xhr.status != 200) {
	|        		status.innerHTML = xhr.status;
	|    		}
	|		});
	|		xhr.open(""POST"", ""https://ваш_url/connect/token"");
	|		xhr.setRequestHeader(""Content-Type"", ""application/x-www-form-urlencoded"");
	|		xhr.send(data);	
	|   }
	|	function showMessage(statusCode){
	|    	var showMessage = document.getElementById(""showMessage"");
	|    	if(statusCode == ""200"") {
	|        	showMessage.innerHTML = ""Подключение выполнено, можно загружать данные."";
	|    	} else {
	|        	showMessage.innerHTML = ""Подключение не выполнено, проверьте данные авторизации. Код ответа: "" + statusCode;
	|    	}
	|	}	
	|</script>";
	#КонецОбласти
	
	ТекущийБраузер = ОпределитьБраузер();
	
// Определяем браузер и используем подходящий нам скрипт.
	Если ТекущийБраузер = "IE" Тогда
		JavaScript = JavaScriptIE;
	Иначе
// Данный скрипт так же работает и в Firefox, на остальных браузерах не тестировал, т.к. посчитал это нецелесообразным 
//  и в случае необходимости за доп. время буду дорабатывать по требованию клиента
		JavaScript = JavaScriptChrome;
	КонецЕсли;
	
	JavaScript = СтрШаблон(JavaScript, Логин, Пароль);

	Возврат JavaScript;
	
КонецФункции

&НаКлиенте
Функция ОпределитьБраузер()
	
	СистемнаяИнформация = Новый СистемнаяИнформация; 
	ТекущаяСистема = СистемнаяИнформация.ИнформацияПрограммыПросмотра;
	
	Если ПустаяСтрока(ТекущаяСистема) Тогда
		Возврат "ТонкийКлиент";
	ИначеЕсли СтрНайти(ВРег(ТекущаяСистема), "CHROME") Тогда
		Возврат "Chrome";
	ИначеЕсли СтрНайти(ВРег(ТекущаяСистема), "FIREFOX") Тогда 
		Возврат "Firefox";
	Иначе
		Возврат "IE";
	КонецЕсли;
	
КонецФункции

Токен получен. Соответственно токен нужно положить в какой-нибудь реквизит, либо передать токен в основную форму обработки, если форму авторизации вы сделали как отдельную форму настройки.

Получение данных из API с использованием токена авторизации

Для получения данных с использованием токена нужно описать XTTP запрос, но уже GET. Аналогично получению токена, реализация для веб клиента и тонкого клиента будут различаться. Для веб клиента это HTML+JavaScript, для тонкого клиента это XTTP с использованием COM "WinHttp.WinHttpRequest.5.1".

Есть некоторые общие функции для формирования параметров, которые подставляются в запрос.

 
#Область ВспомогательныеПроцедурыИФункции

&НаСервереБезКонтекста
Функция ПараметрыURLЗапроса(ДатаНачала, ДатаОкончания)
	
	ПараметрыURLЗапроса	= Новый Структура;
	ПараметрыURLЗапроса.Вставить("skip", 0);
	ПараметрыURLЗапроса.Вставить("take", 50);
	ПараметрыURLЗапроса.Вставить("fromDate", XMLСтрока(ДатаНачала)+"Z");
	ПараметрыURLЗапроса.Вставить("toDate", XMLСтрока(ДатаОкончания)+"Z");
	
	Возврат ПараметрыURLЗапроса;
	
КонецФункции

&НаСервереБезКонтекста
Функция СтрокаПараметровURLЗапроса_Преобразовать(ПараметрыURLЗапроса) 
	
	СтрокаПараметровURLЗапроса	= "";
	
	Для каждого КлючЗначение из ПараметрыURLЗапроса Цикл
		
		СтрокаПараметровURLЗапроса	= СтрокаПараметровURLЗапроса + КлючЗначение.Ключ + "=" + КодироватьСтроку(КлючЗначение.Значение, СпособКодированияСтроки.КодировкаURL) + "&";
		
	КонецЦикла;
	
	Если Прав(СтрокаПараметровURLЗапроса, 1) = "&" Тогда
		СтрокаПараметровURLЗапроса	= Лев(СтрокаПараметровURLЗапроса, СтрДлина(СтрокаПараметровURLЗапроса) - 1);
	КонецЕсли;
	
	Возврат СтрокаПараметровURLЗапроса;
	
КонецФункции

#КонецОбласти

 

Реализация получения данных для тонкого клиента

 
&НаКлиенте
Функция XTTPЗапросДанных()
	
	XTTPЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
    Скрипт.language = "javascript";
    Скрипт.AddObject("XTTPЗапрос", XTTPЗапрос);
	Скрипт.Eval("XTTPЗапрос.Option(2)=1251");
	Скрипт.Eval("XTTPЗапрос.Option(4)=13056"); // intSslErrorIgnoreFlags
	Скрипт.Eval("XTTPЗапрос.Option(6)=true");  // blnEnableRedirects
	Скрипт.Eval("XTTPЗапрос.Option(12)=true"); // blnEnableHttpsToHttpRedirects 
	
	// Формирование GET запроса 
	АдресСервиса = "https://ваш_url/A/B/C";
	ПараметрыURLЗапроса = ПараметрыURLЗапроса(Объект.ДатаНачала, КонецДня(Объект.ДатаОкончания));
	
	СтрокаПараметровURLЗапроса = СтрокаПараметровURLЗапроса_Преобразовать(ПараметрыURLЗапроса);
	СтрокаGetЗапроса = АдресСервиса + "?" + СтрокаПараметровURLЗапроса;
	
    XTTPЗапрос.Open("GET", СтрокаGetЗапроса, 0);
	XTTPЗапрос.setRequestHeader("Origin", "*");
    XTTPЗапрос.setRequestHeader("Authorization", "Bearer " + Объект.Токен);
    XTTPЗапрос.setRequestHeader("Content-Type", "application/json");
	
	XTTPЗапрос.send();
	
	Объект.Статус = Строка(XTTPЗапрос.Status);
	Если XTTPЗапрос.Status = 200 Тогда
		Возврат XTTPЗапрос.ResponseText; // результат запроса JSON строка, которую будем парсить и грузить эти данные в БД.
	Иначе
		Возврат "";
	КонецЕсли;
	
КонецФункции

Есть нюанс в заголовке XTTPЗапрос.setRequestHeader("Origin", "*"), чтобы запрос к API работал с этим заголовком, нужно обсуждать параметры API с теми кто им заведует. Насколько я знаю, в настройку Origin на сервере API нужно устанавливать значение адреса домена с которого осуществляется подключение. Без настройки этого заголовка на сервере и установки этого заголовка в коде 1С может возникать ошибка авторизации 403.

Реализация получения данных для веб клиента

Аналогично авторизации, необходимо при создании формы заполнить содержание HTML документа на форме. При этом не получиться сделать поле HTML на форме 1С невидимым, иначе оно не инициализируется. Поэтому просто делаем все элементы HTML разметки невидимыми при помощи display:none.

 
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ТекстХТМЛ = 
	#Область HTMLДокумент
	"<html>
	|<head>
	|    <meta charset=""UTF-8"">
	|    <title>Загрузка данных</title>
	|</head>
	|<body>
	|    <form>
	|    	<input id=""enter"" type=""button"" value=""Загрузить данные"" style=""display:none"">
	|    </form>
	|	 <div id=""result"" style=""display:none""></div><div id=""status"" style=""display:none""></div>
	|</body> 
	|</html>";
	#КонецОбласти
	
	ЗагрузкаHTML = ТекстХТМЛ;

КонецПроцедуры

Т.к. время запроса к серверу может в зависимости от нагрузки на сервер быть разным, то нужно предусмотреть ожидание получения результата. Поэтому получения данных из HTML+JS у меня реалезовано не через функцию, а процедуру, в которой после выполнения скрипта подключается обработчик ожидания с вызовом функции, и в этой функции после того как мы увидели, что результат запроса был помещен в div "result" JavaScript'ом, мы получаем из этого div'а текст JSON и отправляем его на обработку в другие процедуры и функции.

 
#Область ЗагрузкаДанныхВебКлиент

&НаКлиенте
Процедура ЗагрузитьДанныеСПомощьюJavaScript()
	
	// Формирование GET запроса 
	АдресСервиса = "https://ваш_url/A/B/C";
	ПараметрыURLЗапроса = ПараметрыURLЗапроса(Объект.ДатаНачала, КонецДня(Объект.ДатаОкончания));
	
	СтрокаПараметровURLЗапроса = СтрокаПараметровURLЗапроса_Преобразовать(ПараметрыURLЗапроса);
	СтрокаGetЗапроса = АдресСервиса + "?" + СтрокаПараметровURLЗапроса;
	
	JavaScript = ПолучитьJavaСкриптЗагрузкиДанных(СтрокаGetЗапроса, Объект.Токен);
	
	ДИВ = Элементы.ЗагрузкаHTML.Документ.getElementById("enter");
    
    НашлиАтрибут = ДИВ.getAttributeNode("onclick");
    Если НашлиАтрибут <> Null Тогда
        ДИВ.removeAttribute("onclick");
    КонецЕсли; 
    
    Атрибут  = Элементы.ЗагрузкаHTML.Документ.createAttribute("onclick");
    Атрибут.value = JavaScript;
    ДИВ.attributes.setNamedItem(Атрибут); 
    
    ДИВ.click();
	
	КоличествоВызовов = 0;

// Ожидаем когда в div result появится текст JSON
	ПодключитьОбработчикОжидания("ПолучитьРезультатЗапросаВРежимеОжидания", 1, Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьРезультатЗапросаВРежимеОжидания()
	
	Отказ = Ложь;
	КоличествоВызовов = КоличествоВызовов + 1;
	
	ДИВResult = Элементы.ЗагрузкаHTML.Документ.getElementById("result");
	ДИВStatus = Элементы.ЗагрузкаHTML.Документ.getElementById("status");
	Объект.Статус = ДИВStatus.innerHTML;
	СтрокаJSON 	  = ДИВResult.innerHTML;
	
// Подождали 20 секунд, считаем что что то пошло не так и прекращаем загрузку. 
// Количество секунд регулируется на свое усмотрение.
	Если КоличествоВызовов > 20 Тогда
		ТекстОтказа = НСтр("ru='Данные от сервера не получены в течении %1 секунд'");
		ТекстОтказа = СтрШаблон(ТекстОтказа, КоличествоВызовов);
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОтказа);
		ОтключитьОбработчикОжидания("ПолучитьРезультатЗапросаВРежимеОжидания");
		Возврат;
	Иначе
		Если (Не ПустаяСтрока(СтрокаJSON) Или Не ПустаяСтрока(Объект.Статус)) Тогда
			
			ОтключитьОбработчикОжидания("ПолучитьРезультатЗапросаВРежимеОжидания");
			Если ПустаяСтрока(СтрокаJSON) Тогда
				ТекстОтказа = НСтр("ru='Данные от сервера не получены. Код ответа: %1'");
				ТекстОтказа = СтрШаблон(ТекстОтказа, Объект.Статус);
				ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОтказа);
				Возврат;
			Иначе
// Появился в div result текст JSON, отправляем его на обработку.
				ОбработкаДанныхНаСервере(СтрокаJSON, Отказ, ТекстОтказа);	
			КонецЕсли;
			
			Если Отказ Тогда
				ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОтказа);
			КонецЕсли;
			
		КонецЕсли;	
	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Функция ПолучитьJavaСкриптЗагрузкиДанных(СтрокаGetЗапроса, Токен)

	JavaScriptChrome = 
	#Область JavaScriptChrome
	"fetch(""%1"", {
	|		method: ""GET"",
	|		headers: {
	|			""Content-Type"": ""application/json"",
	|			""Authorization"": ""Bearer %2""}
	| }).then(function(response) {
	|
	|     var status = document.getElementById(""status"");
	|     status.innerHTML = response.status;
	|
	|	if(response.status==200) {
	|		return response.json();
	|	 }
	| }).then(function(data) {
	|     var result = document.getElementById(""result"");
	|     result.innerHTML = JSON.stringify(data);
	| }).catch(function(err) {  
	|	var result = document.getElementById(""result"");
	|     result.innerHTML = err;  
	|});";
	#КонецОбласти
		
	JavaScriptIE = 
	#Область JavaScriptIE
	"if (window.XMLHttpRequest) {
	|        xmlhttp = new XMLHttpRequest();
	|    } else {
	|        xmlhttp = new ActiveXObject(""Microsoft.XMLHTTP"");
	|    }
	|var xhr = xmlhttp;
	|xhr.onreadystatechange=function()
	|{
	|  if (xhr.readyState==4 && xhr.status==200)
	|  {
	|   var result = document.getElementById(""result"");
	|	result.innerHTML = xhr.responseText;	
	|  } 
	|  if (xhr.readyState==4 && xhr.status!=200)
	|  {
	|   var status = document.getElementById(""status"");
	|	status.innerHTML = xhr.status;	
	|  } 
	|} 
	|xhr.open(""GET"", ""%1"", false);
	|xhr.setRequestHeader(""Origin"", ""*"");
	|xhr.setRequestHeader(""Content-Type"", ""application/json"");
	|xhr.setRequestHeader(""Authorization"", ""Bearer %2"");
	|xhr.send();";
	#КонецОбласти
		 
	ТекущийБраузер = ОпределитьБраузер();
	
	Если ТекущийБраузер = "Chrome" Тогда
		JavaScript = JavaScriptChrome;
	Иначе
		JavaScript = JavaScriptIE;
	КонецЕсли;
	
	JavaScript = СтрШаблон(JavaScript, СтрокаGetЗапроса, Токен);

	Возврат JavaScript;
	
КонецФункции

&НаКлиенте
Функция ОпределитьБраузер()
	
	СистемнаяИнформация = Новый СистемнаяИнформация; 
	ТекущаяСистема = СистемнаяИнформация.ИнформацияПрограммыПросмотра;
	
	Если ПустаяСтрока(ТекущаяСистема) Тогда
		Возврат "ТонкийКлиент";
	ИначеЕсли СтрНайти(ВРег(ТекущаяСистема), "CHROME") Тогда
		Возврат "Chrome";
	ИначеЕсли СтрНайти(ВРег(ТекущаяСистема), "FIREFOX") Тогда 
		Возврат "Firefox";
	Иначе
		Возврат "IE";
	КонецЕсли;
	
КонецФункции

#КонецОбласти

 

Проблемы при работе с GET XTTP подключением получения данных

Чуть выше я уже кратко упомянул проблему, которая возникает при попытке получения данных, когда уже вроде бы должно всё работать. У нас есть токен авторизации, но когда мы пытаемся подключиться для получения данных, мы получаем ошибку авторизации 403. Она так же может отображаться в 1С следующим образом:

{ВнешняяОбработка.ЗагрузкаЧеков.МодульОбъекта(62)}: Ошибка при вызове метода контекста (Получить): Ошибка работы с Интернет:   Couldn't resolve host name.

Чтобы понять, что надо использовать заголовок Origin и настраивать его на сервере API, а не искать причину в чем то другом, нужно сделать следующее:

1. Создать и сохранить у себя на ПК новый HTML документ следующего вида

 
<!doctype html>

<head>
    <meta charset="UTF-8">
    <title>Авторизация</title>
</head>
<body>
    <form>
        <table>
            <tr>
                <td><label for="loginField">Логин</label></td>
                <td><input id="loginField" type="text" name="login"></td>
            </tr>
            <tr>
                <td><label for="passwordField">Пароль</label></td>
                <td><input id="passwordField" type="password" name="password" value=""></td>
            </tr>
            <tr>
                <td colspan="2" style="text-align: center">
                    <input type="button" onClick="authorize()" value="Войти">
                </td>
            </tr>
        </table>
    </form>
    <div id="result"></div>
    <div id="resultJSON"></div>
    <div id="status"></div>
    <div id="showResult"></div>

    <form>
        <input type="button" onClick="getData()" value="Получить данные по токену">
    </form>
    <div id="statusGet"></div>
</body>
<script>
    window.onload
    {
        var username = document.getElementById("loginField");
        var password = document.getElementById("passwordField");
    //Заполним сразу пользователя и пароль, чтобы спокойно экспериментировать и не вбивать эти данне при каждом обновлении страницы
        username.value = "";
        password.value = "";
    }

    function authorize() {

        var username = document.getElementById("loginField");
        var password = document.getElementById("passwordField");

        // Заполняем наши параметры
        var details = {
            'client_id': 'ваш_client_id',
            'grant_type': 'ваш_grant_type',
            'username': username.value,
            'password': password.value,
            'redirect_uri': 'https://ваш_redirect_uri/callback'
        };

        var formBody = [];
        for (var property in details) {
            var encodedKey = encodeURIComponent(property);
            var encodedValue = encodeURIComponent(details[property]);
            formBody.push(encodedKey + "=" + encodedValue);
        }
        formBody = formBody.join("&");

        // Заполняем наши параметры
        fetch('https://ваш_url/connect/token', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
            },
            body: formBody
        }).then(function(response) {
            var status = document.getElementById("status");
            status.innerHTML = response.status;
            showResult(response.status);

            return response.json();
        }).then(function(answer) {
            var result = document.getElementById("result");
            result.innerHTML = answer.token;
        })

    }
     function showResult(statusCode){
         var showResult = document.getElementById("showResult");
         if(statusCode == "200") {
             showResult.innerHTML = "Подключение выполнено, можно данные получены.";
         } else {
             showResult.innerHTML = "Подключение не выполнено, проверьте данные авторизации. Код ответа: " + statusCode;
         }
     }

    function getData() {

        // Указываем наш URL и наши параметры
        var result = document.getElementById("result");
        fetch('https://ваш_url_api/A/B/C?skip=0&take=50&fromDate=2018-08-01T08%3A56%3A35Z&toDate=2018-08-18T08%3A56%3A35Z', {
				method: 'GET',
				headers: {
					'Content-Type': 'application/json',
					'Authorization': 'Bearer ' + result.innerHTML} // должнен подставиться токен, можно его вставить сюда строкой напрямую
         }).then(function(response) {
        
             var status = document.getElementById("statusGet");
             status.innerHTML = response.status;
             showResult(response.status);
        
			if(response.status==200) {
				return response.json();
			 }
         }).then(function(data) {
            var resultJSON = document.getElementById("resultJSON");
            resultJSON.innerHTML = JSON.stringify(data);
         }).catch(function(err) {  
			var resultJSON = document.getElementById("resultJSON");
            resultJSON.innerHTML = err;
		});

    }

</script>
</html>

Заполняем собственные логин, пароль, и другие параметры в скрипте, и сначала нажимаем "Войти", чтобы получить токен в <div id="result">, а затем нажимаем "Получить данные по токену", чтобы получить данные JSON в <div id="resultJSON">.

2. Открываем этот HTML в специальном режиме браузера Chrome:

 
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="C://Chrome dev session" --disable-web-security

Открыв браузер таким образом, будет отключена защита браузера CORS, и можно проверить, наш запрос в 1С не работает потому что срабатывает эта защита, или по какой-то другой причине. То есть, если возникнет ошибка в этом режиме браузера и данные мы не получили, то дело НЕ в CORS, а если в этом режиме браузера загружается, а в 1С не грузится с ошибкой "Couldn't resolve host name", то это проблема связана с CORS.

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

Дополнительные настройки

Помимо этой проблемы стоит так же предусмотреть возможные проблемы при работе в IE. Рекомендую выполнить следующие настройки в своей системе:
1. IE свойства браузера - зайти в вкладку "Дополнительно" и установить флаг «Разрешать запуск активного содержимого файлов на моем компьютере»;

2. Если установлен Касперский - нужно снять флаг с настройки «Внедрять в трафик скрипт взаимодействия с веб-страницами», который находится в "Настройки"(шестеренка) -> "Сеть".

Скачать файлы

Наименование Файл Версия Размер
Подключение к REST API через OAuth протокол из 1С:

.epf 16,91Kb
06.09.18
28
.epf 1.0 16,91Kb 28 Скачать

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Дата
11. chemezov 32 24.01.20 03:08 Сейчас в теме
Эх, мдаа. Чудный редактор статьи. Поправил пару слов, теперь все вставки кода пропали...
10. user1074814 06.12.19 13:08 Сейчас в теме
Для тех кто на 64 сервере, и выдает ошибку класса на строке с MSScriptControl.ScriptControl
Вам нужно добавить на сервер новую dll, скачать её можно отсюда:
https://tablacus.github.io/scriptcontrol_en.html
9. chemezov 32 16.11.19 18:28 Сейчас в теме
(8)Затрудняюсь ответить. Не знаю как из 1С программно открыть Хром
8. Vix 27 12.11.19 15:20 Сейчас в теме
(7)Спасибо за пример, только начинаю разбираться с подобной задачей, разница только в том, что нужно на форме 1С нажимать кнопку авторизации, а открываться будет браузер гугл хром, откуда приходить будут токены, которые нужно встроить в заголовки запроса, а так же можно получить и json. По кнопке выход, допустим удалять токен. Что можете посоветовать к изучению данной задачи?
7. chemezov 32 08.10.19 08:30 Сейчас в теме
(6)Для этого нужно писать свой веб клиент. Стандартный такой возможности не предусматривает.
6. deman_ru 20 07.10.19 13:22 Сейчас в теме
Подскажите, а можно ли авторизоваться по token в базе опубликованной на web - сервере с использованием протокола OAuth?
5. chemezov 32 10.06.19 15:29 Сейчас в теме
Опять пропали две картинки в последнем разделе. Продублирую лучше в комментарии.
Дополнительно:
Помимо этой проблемы стоит так же предусмотреть возможные проблемы при работе в IE. Рекомендую выполнить следующие настройки в своей системе:
1. IE свойства браузера - зайти в вкладку "Дополнительно" и установить флаг «Разрешать запуск активного содержимого файлов на моем компьютере»;

2. Если установлен Касперский - нужно снять флаг с настройки «Внедрять в трафик скрипт взаимодействия с веб-страницами», который находится в "Настройки"(шестеренка) -> "Сеть".
Прикрепленные файлы:
4. uno-c 141 01.05.19 09:30 Сейчас в теме
access token для google api можно также получать с помощью авторизации сервер-сервер, без редиректов и подтверждения пользователя.
3. user774630 25.03.19 13:08 Сейчас в теме
Большое спасибо!
Для тонкого клиента заработал такой код (без COM-объектов)
МассивПараметров = Новый Массив;
	МассивПараметров.Добавить("client_id=***");	
	МассивПараметров.Добавить("client_secret=***");
	МассивПараметров.Добавить("grant_type=client_credentials");
	МассивПараметров.Добавить("redirect_uri=https://***/oauth/token");
	
	АдресРесурса = "?" + СтрСоединить(МассивПараметров, "&");
	
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
	
	HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
	
	HTTP = Новый HTTPСоединение("***/oauth/token",,,,,,Новый ЗащищенноеСоединениеOpenSSL,Истина);
	HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос);
	
	СтрокаОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
	
	СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON);
	
	Если СтруктураОтвета.Свойство("access_token") Тогда
		access_token = СтруктураОтвета.access_token;
	КонецЕсли;
Показать
chemezov; +1 Ответить
2. VZhulanov 3 08.11.18 19:50 Сейчас в теме
Спасибо за примеры
Долго мучался с авторизацией и получением токена
помогла строка
XTTPЗапрос.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")

только ее мне и не хватало
1. bulpi 174 06.09.18 12:50 Сейчас в теме
Автор, просмотрите статью. Похоже, какие-то рисунки должны быть, но их нет и ничего не понятно.
meowmeow; +1 Ответить
Оставьте свое сообщение

См. также

Внешняя компонента для работы по Web-socket протоколу Промо

Разработка внешних компонент WEB v8 Абонемент ($m)

Кто когда-нибудь сталкивался с обменом данными по Web-Socket (wss) протоколу из 1С, тому известно, что в платформе отсутствуют данные механизмы (не путать с HTTP запросами и WebServices). Предлагается использовать внешнюю компоненту, написанную по технологии NativeAPI, для подключения и обмена с серверами из 1С-Предприятия, работающими по протоколу Web-Socket.

5 стартмани

30.03.2018    22842    32    Ditron    68    

HTTP сервисы по OpenAPI спецификациям

Практика программирования WEB v8 1cv8.cf Абонемент ($m)

Начинаем путь разработки HTTP сервисов с создания спецификаций OpenAPI. Автодокументация сервисов формата Swagger UI без зависимостей. Настройка сервисов в режиме предприятия.

1 стартмани

29.06.2020    1874    1    shmalevoz    19    

Конструктор HTTP-соединений в 1С (обычные и управляемые формы)

WEB v8 v8::УФ 1cv8.cf Абонемент ($m)

Иногда возникают мысли о том, чтобы прикрутить сервисы, связанные с HTTP-соединениями, в 1С. Необходимо писать обработку и анализировать результат.

1 стартмани

02.06.2020    2411    21    Denr83    0    

Выбираем российского провайдера для интеграции с WhatsApp

WEB Интеграция v8 Россия Абонемент ($m)

Собственно, почему выбираем именно провайдера и почему российского? WhatsApp, создавая свое API, преследовал две цели - делать деньги и минимизировать спам. И чтобы убить сразу двух зайцев, было принято решение предлагать API исключительно через партнеров. Ну а вопрос по поводу российского партнера скорее уже риторический. И не только из-за курса рубля, но и из-за таланта работать с российскими телефонными номерами, коим одарены далеко не все провайдеры. Между тем статья не претендует на всесторонний анализ всех возможностей всех провайдеров. Мы копнем лишь верхушку айсберга этого немаленького рынка.

1 стартмани

19.05.2020    2908    0    ripreal1    1    

Работа с релизами 1С и договорами ИТС Промо

WEB БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Работа с релизами 1С и партнерским кабинетом.

2 стартмани

15.08.2019    12000    34    RocKeR_13    10    

DaJet QL - расширяемый язык запросов

Интеграция WEB v8 Абонемент ($m)

DaJet QL поддерживает практический полный синтаксис SQL Server 2005-2016. Кроме этого это расширяемый язык запросов. Обращение к объектам СУБД выполняется в терминах метаданных 1С. Доступ к возможностям этого языка запросов реализован в виде web api сервиса. Результаты запросов возвращаются в виде JSON.

1 стартмани

20.04.2020    4406    9    zhichkin    16    

Telegram bot API - разбор документации с примерами

WEB v8 Абонемент ($m)

Перевод документации на язык 1С.

1 стартмани

06.04.2020    20866    29    leongl    29    

Пример работы с Trello из 1С

WEB v8 1cv8.cf Россия УУ Абонемент ($m)

Небольшая конфигурация содержит примеры обмена с онлайн-сервисом Trello.

1 стартмани

15.02.2020    8557    35    terrorion    8    

Проверка VAT номеров Промо

WEB v8 1cv8.cf Абонемент ($m)

Обработка для вызова сервиса проверка VAT номера.

1 стартмани

26.11.2018    10533    0    wtlz    1    

Взаимодействие HTML (COM объект, WebKit) с 1С (обычные и управляемые формы)

Внешние источники данных WEB v8 v8::УФ 1cv8.cf Абонемент ($m)

Показан пример использования HTML (COM объект, WebKit) в 1С (8.3).

2 стартмани

18.01.2020    6078    19    Deniskinr83    0    

Google drive - менеджер файлов

WEB Внешние источники данных v8 1cv8.cf Россия Абонемент ($m)

Синхронизация с гугл диском легко и просто!

10 стартмани

05.12.2019    7454    22    zykov_vitaliy    22    

Автозаполнение адреса по КЛАДР в УПП при выгрузке контрагента с портала компании (API dadata)

WEB v8 1cv8.cf Абонемент ($m)

Заведение, согласование контрагентов организовано на портале компании. Далее по web-сервису контрагенты выгружаются в УПП (юр.адрес и факт.адрес выгружаются строкой). Задача автоматизировать заполнение адреса в УПП по КЛАДР.

1 стартмани

03.12.2019    5156    1    John_d    10    

Трекинг номеров РПО в Почте России Промо

WEB Оптовая торговля Оптовая торговля v8 Оптовая торговля, дистрибуция, логистика Абонемент ($m)

Относительно недавно Почта России стандартизировала и описала сервисы получения информации о регистрируемом почтовом отправлении (РПО). Представляю вашему вниманию конфигурацию-обертку над сервисами Почты России. Она позволяет просто (http-запросы) и без изменений конфигурации подключить сервисы отслеживания к своим информационным системам.

2 стартмани

28.03.2016    24633    9    Smaylukk    3    

Работа с Яндекс-картами в 1С (вывод меток, прокладка маршрута, отображение балуна, вывод меток в кластеры) (обычное и управляемое приложение)

WEB v8 v8::УФ 1cv8.cf Абонемент ($m)

Работа с Яндекс-картами в 1С (управляемое приложение). Обработка показывает, как можно найти адреса на карте Яндекс, проложить маршрут.

2 стартмани

20.11.2019    9686    97    Denr83    0    

Пример взаимодействия HTML (COM объект, WebKit) с 1С (динамический отбор) (обычные и управляемые формы)

WEB v8 v8::УФ 1cv8.cf Абонемент ($m)

Показан пример использования WebKit в 1С (8.3).

2 стартмани

18.11.2019    7526    12    Denr83    0    

"Живые" картинки со Snap.SVG

Практика программирования WEB Работа с интерфейсом v8 Абонемент ($m)

В статье рассмотрен пример использования http-сервисов для визуализации данных

1 стартмани

24.10.2019    12080    17    blackhole321    7    

Работа с картой. Кадастровый учет (Росреестр). Тематические карты Промо

WEB Рабочее место v8 v8::УФ 1cv8.cf Абонемент ($m)

Внешняя обработка для работы с картами в 1С. Получения изображения с публичной кадастровой карты России, построения тематических карт

5 стартмани

31.08.2017    15858    10    vipchep    0    

Яндекс сервисы [Расширение]

Универсальные обработки WEB v8 1cv8.cf Абонемент ($m)

Расширение для работы с Яндекс-сервисами (предиктор,переводчик,проверка орфографии)

1 стартмани

24.10.2019    9789    7    noprogrammer    8    

Интеграция 1С с сайтом (магазином) WordPress (WooCommerce) с помощью Rest API сайта. Часть 1. Авторизация

WEB v8 Абонемент ($m)

Интеграция 1С с сайтом (магазином) WordPress (WooCommerce) с помощью функционала Rest API предоставляемого платформой (CMS) WordPress (WooCommerce). Без дополнительных приложений на PHP/вставьте сюда любой другой язык программирования/.

1 стартмани

12.10.2019    19605    18    osivv    30    

Telegram бот на 1С

WEB v8 1cv8.cf Абонемент ($m)

Telegram бот на 1С в виде внешней обработки, встраиваемой в типовые 1С 8.3.

1 стартмани

24.09.2019    12109    28    budidich    19    

Работа с картами 1С 4 в 1: Яндекс, Google , 2ГИС, OpenStreetMap(OpenLayers) Промо

Универсальные обработки WEB v8 1cv8.cf Абонемент ($m)

С каждым годом становится все очевидно, что использование онлайн-сервисов намного упрощает жизнь. К сожалению по картографическим сервисам условия пока жестковаты. Но, ориентируясь на будущее, я решил показать возможности API выше указанных сервисов: Инициализация карты Поиск адреса на карте с текстовым представлением Геокодинг Обратная поиск адреса по ее координатами Взаимодействие с картами - прием координат установленного на карте метки Построение маршрутов по указанным точками Кластеризация меток на карте при увеличении масштаба Теперь также поддержка тонкого и веб-клиента

1 стартмани

28.12.2012    99912    1146    Smaylukk    348    

Выгрузка номенклатуры в социальную сеть Вконтакте

WEB Оптовая торговля Розничная торговля Оптовая торговля Розничная торговля v8 1cv8.cf Абонемент ($m)

Обработка для быстрой и легкой выгрузки товаров Вконтакт. Так просто еще не было)))

2 стартмани

14.08.2019    11678    41    kaliuzhnyi    43    

Путеводитель по истории релизов

WEB v8 1cv8.cf Абонемент ($m)

Отчет по истории выпуска релизов и анализа информации по обновлениям.

5 стартмани

13.08.2019    11550    10    YPermitin    18    

Подключение к сайту и отправка или получение данных по API (POST, GET...) (с описанием кода)

WEB v8 1cv8.cf Абонемент ($m)

Простая обработка по отправке или получение данных с любого сервера главное знать ресурс (выполняемую функцию) и тело запроса.

1 стартмани

12.08.2019    10065    17    MaxPowerr    5    

Пример использования REST API Яндекс Диска Промо

WEB v8 1cv8.cf Абонемент ($m)

Пример использования REST API Яндекс Диска: чтение диска, добавление каталога, загрузка файла, скачивание файлов или каталогов, удаление файлов или каталогов.

1 стартмани

26.06.2018    21415    33    MKFreeUser    14    

Использование HTTP-сервиса для создания "фронтенда" HTML/CSS/jQuery с кэшированием

WEB v8 1cv8.cf Абонемент ($m)

В статье описан способ создания "фронтенда" на HTML/CSS/jQuery и скрипт кеширования AJAX запросов на PHP.

1 стартмани

06.08.2019    12908    15    Sedaiko    24    

Конфигурация для обмена данными (интеграционная шина)

Внешние источники данных WEB v8 1cv8.cf Абонемент ($m)

Система позволяет организовать обмен данными, как с базами 1С, так и любыми другими приложениями. Система представляет собой отдельную конфигурацию. Система позволяет организовать гибкие возможности по настройке обмена. В качестве брокера сообщений, для передачи данных, используется отдельная самостоятельная конфигурация на 1С. Комплект поставки содержит файл расширения для "клиентской" части шины, данное расширение позволяет без снятия "ключа" организовать гибкий механизм обмена данными.

4 стартмани

08.07.2019    9471    26    miha-28    16    

Шаблон http-сервиса для вашего проекта

Внешние источники данных WEB Мобильная разработка v8 v8::Mobile 1cv8.cf Абонемент ($m)

Http-сервис для обмена данными в формате JSON. Обработчики этого сервиса находятся во внешней обработке, что позволяет дорабатывать его без изменения конфигурации. Также прилагаю пример мобильного приложения для работы с данным сервисом (получает номенклатуру и остатки на складе). Сервис очень быстро разворачивается и масштабируется под ваши задачи.

3 стартмани

04.05.2019    16975    66    MarkoSokolov    47    

Работа с публикациями "Инфостарт" Промо

Практика программирования О сообществе WEB v8 УУ Абонемент ($m)

Работа с рублевыми публикациями на сайте "Инфостарт": ведение клиентов, заказов, обновление файлов публикации, рассылка обновлений.

1 стартмани

13.09.2018    18716    12    RocKeR_13    16    

1C + Python + Django Rest Framework + Vue.js. Опыт несложной full-stack разработки

Практика программирования Внешние источники данных Обмен через XML WEB Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

22.04.2019    29392    32    riposte    63    

1С и WebKit. Вариант взаимодействия

WEB v8 1cv8.cf Абонемент ($m)

В результате перехода на WebKit тип свойства Документ у поля, имеющего вид ПолеHTMLДокумента, изменился с COMОбъект на ВнешнийОбъект. Также изменилась DOM модель документа, доступная через это свойство.

2 стартмани

23.02.2019    24374    69    mi1man    55    

Строим маршруты на картах в 1С с помощью OpenStreetMap, OSRM и Leaflet

WEB v8 1cv8.cf Транспорт, автопарки, такси Абонемент ($m)

Краткая статья о том как вывести на карту (в 1С) маршруты с помощью OpenStreetMap, OSRM и Leaflet. По данной системе очень мало примеров, но так как OpenStreetMap является бесплатным сервисом и не требует никаких ключей и регистраций, и является довольно мощным механизмом, решил написать небольшую статью "как это сделать?". В первую очередь скажу, все намного проще, если вы используете последнюю версию платформы (8.3.14), где есть поддержка практически всех браузеров (IE 11, EDGE, Mozilla), но что делать если у нас не самая свежая платформа, где поддержка только IE 9?

2 стартмани

12.02.2019    21118    83    Ditron    71    

Конфигурация для просмотра публичных телеграм каналов Промо

WEB v8 Абонемент ($m)

Просмотр и каталогизация в более удобном виде публичных телеграм каналов, групп и чатов.

1 стартмани

02.06.2018    16007    10    DO_WHILE_LOOP    7    

Яндекс карта в документе "Заказ клиента" на закладке "Доставка". (Расширение) УТ 11.4

Обработка документов WEB Оптовая торговля Оптовая торговля v8 УТ11 Россия УУ Абонемент ($m)

Показ яндекс карты в документе "Заказ клиента" на закладке "Доставка" и печать карты для курьера с контактными данными. (Расширение)

3 стартмани

05.02.2019    9346    12    ret    6    

Яндекс карты 2.1. Построение маршрута. Передача длины маршрута в реквизит формы

WEB v8 1cv8.cf Абонемент ($m)

Пригодится как пример использования Яндекс карты 2.1 для построения маршрута.

1 стартмани

24.01.2019    11555    67    John_d    32    

Веб-форма авторизации/регистрации/восстановления пароля для веб-клиента 1С с помощью HTML/CSS/PHP/HTTP-сервисов 1С

WEB v8 1cv8.cf Абонемент ($m)

Пришла в голову идея создать универсальную веб-форму входа в веб-клиент 1С на HTML/CSS/PHP/HTTP-сервисы 1С. Чтобы прямо как на нормальных сайтах. Заодно и для ознакомления с 1С с новой, для себя, стороны. Интересно было попробовать интеграцию PHP - 1С.

1 стартмани

08.11.2018    14995    25    Бэнни    18    

Обмен файловыми базами данных через Yandex диск Промо

WEB v8 Россия Абонемент ($m)

Выполнение операций обмена с Yandex диском для файловых БД, по протоколу WebDav, в автоматическом или ручном режимах.

1 стартмани

11.06.2018    15368    5    slimper    1    

Загрузка чека онлайн-касс (загрузка товаров из чека)

Внешние источники данных WEB Кассовые операции Розничная торговля Кассовые операции Розничная торговля v8 1cv8.cf Абонемент ($m)

Обработка-пример, позволяет любому и из любой конфигурации загрузить информацию о товарах из чека(и не только) с сервера ФНС proverkacheka.nalog.ru

2 стартмани

08.10.2018    17043    31    echo77    44    

SOAP для чайников

Обмен через XML WEB v8 1cv8.cf Абонемент ($m)

Немножко про SOAP сервис. И пример работы с подключением и получением данных по SOAP за 5 минут.

1 стартмани

05.09.2018    40376    36    dusha0020    18    

Класс-обработка “Работа с картами Яндекс”

Разработка внешних компонент WEB v8 Абонемент ($m)

Как показать точку или маршрут на карте Яндекс. Как получить координаты по строке адреса (геокодирование).

1 стартмани

01.08.2018    21250    182    RSConsulting    15    

Сервер push сообщений “Push0k“ 18.05 Промо

WEB v8 1cv8.cf Абонемент ($m)

Аналог других “мессенджеров“. Позволяет практически все то же самое, что и другие решения. За исключением смайлов, эмодзи, голосовой и видео связи. Основное отличие от других решений, открыта и доступна для изменения серверная и клиентская часть месенджера. Общедоступной серверной части нет, за серверную часть отвечаете вы сами.

1 стартмани

19.12.2017    16142    12    PloAl    20    

HTTP Сервисы: Путь к своему сервису. Часть 1

Практика программирования WEB v8 1cv8.cf Абонемент ($m)

Уже много было написано про http-сервисы, но то и дело всплывают «Новые» статьи по обмену между базами V8 по COM, что «Немножко» удивляет. Решил внести свои 5 копеек, поработаем с http-сервисом.

1 стартмани

15.07.2018    73171    23    dsdred    24    

Чтение сжатого gzip, deflate HTTP ответа сервера. Без ВК. Уменьши время загрузки и сократи трафик в 3 раза

WEB v8 1cv8.cf Абонемент ($m)

В платформе 1С:Предприятие не реализовано штатного механизма декодирования ответа веб серверов, в которых присутствует gzip сжатие. Некоторые использовали WinHttpRequest.5.1 , кто-то писал ВК. Друзья, хватит. Вот вам решение.

1 стартмани

08.06.2018    13533    69    Malfarion    16    

Интеграция между Atlassian Jira и 1С:Предприятие 8.3 используя Jira REST API (выборка, создание и изменение запросов, чтение, создание и удаление записей о работах, чтение комментариев и другие возможности)

Внешние источники данных WEB v8 v8::УФ 1cv8.cf Абонемент ($m)

Внешняя обработка на управляемой форме для 1С:Предприятие 8.3 по интеграции с Atlassian Jira используя Jira REST API. Ключевые функции: выборка запросов с использованием JQL; добавление и изменение запросов; добавление, изменение и удаление записей о работах; чтение комментариев к запросам; сохранение всех ключевых параметров между сеансами работы. Тестирование проводилось на платформе 1С (8.3.11.2954) совместно с JIRA Server platform (7.3.7)

1 стартмани

24.04.2018    27898    163    Ko1t    73    

Построение маршрута доставки с расчётом расстояния для любой базы УФ Промо

Универсальные обработки WEB Оптовая торговля Оптовая торговля v8 v8::УФ 1cv8.cf Абонемент ($m)

Графическое изображение маршрутного листа по картам гугл. Работает на любой конфигурации с управляемыми формами. Использует новую версию api google-карт от 13.02.2018 года под IE11.

10 стартмани

24.02.2018    32407    41    KorotkovRV    16    

Простая и пошаговая интеграция Яндекс-Алисы и 1С

WEB v8 Абонемент ($m)

Интеграция Алисы и 1С через http сервис на платформе 8.3.9. Используем виртуальный сервер, сертификат от letsencrypt, и делаем простые запросы к базе из Алисы.

1 стартмани

09.04.2018    20499    18    kiv1c    34    

Проверка контрагентов по ИНН и КПП через веб-сервис ФНС (внешняя) Промо

Обработка справочников WEB v8 1cv8.cf Россия Абонемент ($m)

Обработка проверяет контрагентов по ИНН и КПП через веб-сервис ФНС на наличие регистрации в ЕГРН. Может выполняться в любых типовых конфигурациях, при наличии справочника "Контрагенты" и реквизитов "ИНН" и "КПП"

1 стартмани

25.12.2014    38036    129    Willforre    12