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

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

Интеграция - 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
50
.epf 1.0 16,91Kb 50 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. bulpi 209 06.09.18 12:50 Сейчас в теме
Автор, просмотрите статью. Похоже, какие-то рисунки должны быть, но их нет и ничего не понятно.
meowmeow; +1 Ответить
2. VZhulanov 4 08.11.18 19:50 Сейчас в теме
Спасибо за примеры
Долго мучался с авторизацией и получением токена
помогла строка
XTTPЗапрос.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")

только ее мне и не хватало
chemezov; +1 Ответить
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 Ответить
4. uno-c 215 01.05.19 09:30 Сейчас в теме
access token для google api можно также получать с помощью авторизации сервер-сервер, без редиректов и подтверждения пользователя.
chemezov; +1 Ответить
5. chemezov 47 10.06.19 15:29 Сейчас в теме
Опять пропали две картинки в последнем разделе. Продублирую лучше в комментарии.
Дополнительно:
Помимо этой проблемы стоит так же предусмотреть возможные проблемы при работе в IE. Рекомендую выполнить следующие настройки в своей системе:
1. IE свойства браузера - зайти в вкладку "Дополнительно" и установить флаг «Разрешать запуск активного содержимого файлов на моем компьютере»;

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

Помог комментарий из https://infostart.ru/1c/articles/1024217/
У меня windows 7 помогло конкретно вот это:
далее еще запустить фикс - делает тоже что описано в этой статье, только автоматом
https://support.microsoft.com/en-us/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi
13. LineykaSBK 5 01.11.22 12:43 Сейчас в теме
Подскажите пож-та. У яндекса так же и у майла при настройки почты в 1С ошибки, мол зайдите и настройте почту для приложения. настраиваю и там и там, в 1С все время говорит что не удалось авторизоваться. Делал пароли и для приложений и пробовал через них и главным паролем пробовал - ни как.
В итоге решил попробовать настроить почту через вэб авторизацию. настроил на стороне почтового сервера все, только вот вопрос, 1С говорит в помощнике, скопируйте этот Callback URL и вставьте http://localhost/oauth2 в соответствующее поле на стороне настройки приложения в почте.
копирую это из помощника настройки подключения почты http://localhost/oauth2, вставляю, пытаюсь и все, ничего дальше не происходит, висит пустое окно.
Я так и не понял что это за ссылка такая у 1С генерируется в поле http://localhost/oauth2
14. chemezov 47 03.11.22 10:15 Сейчас в теме
(13)
Я так и не понял что это за ссылка такая у 1С генерируется в поле http://localhost/oauth2

Боюсь не смогу подсказать. Очень давно я писал эту обработку и в такие детали насколько я помню не углублялся. Я уже успел забыть весь синтаксис JavaScript слишком другие задачи за прошедшее время мне приходилось решать.

Если удастся разобраться, и вы напишите на инфостарте статью с решением этой проблемы, просьба оставить ссылку на вашу статью с решением в комментариях тут. Возможно кому-то в последствии это очень поможет.
Оставьте свое сообщение

См. также

Обмен 1С с порталом госзакупок (ЕИС)

Оптовая торговля WEB-интеграция Файловый обмен (TXT, XML, DBF), FTP Обмен с ГосИС Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Государственные, бюджетные структуры Россия Бухгалтерский учет Платные (руб)

Данное расширение позволяет выгрузить универсальный передаточный документ (УПД) и счет-фактуру на портал Госзакупок (44-ФЗ). Выгрузка документов производится из 1С в XML файл для дальнейшей загрузки в ЕИС из 1С Бухгалтерия, редакция 3.0.

18000 руб.

19.08.2022    14906    64    48    

31

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Данная обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.

6000 руб.

02.02.2021    12632    28    43    

15

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ 3. Отчеты по данным загруженным в регистры сведений. Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен.

11856 руб.

25.05.2021    9626    6    4    

6

Драйвер облачной кассы для Бизнес.РУ Чеки

ККМ WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Универсальный драйвер для фискализации чеков для сервиса Бизнес.РУ. Чеки (https://online-check.business.ru/). Работает с любой кассой, подключенной к сервису, в том числе и без физической кассы (Аренда облачной ККТ в датацентре). Принцип работы аналогичен наличию физической кассы, подключенной к рабочему месту 1С. Фискализация выполняется с любого рабочего места через интернет. Нет ограничений на количество рабочих мест, касс, компьютеров. Поддерживает печать с нескольких рабочих мест на одну кассу. Работает в любой операционной системе (Windows, Linux) и в любом клиенте (Тонкий, Толстый, Web, Мобильный клиент).

6000 руб.

03.06.2021    10697    8    0    

5

Contragent+ 9.1 для 1С 8.2/8.3

Обработка справочников Обмен с ГосИС Взаиморасчеты WEB-интеграция Платформа 1С v8.3 Платформа 1C v8.2 Конфигурации 1cv8 Платные (руб)

Универсальная обработка для экспресс-регистрации новых и обновления реквизитов существующих элементов справочников «Контрагенты» & «Организации» по данным Федеральной Налоговой Службы РФ (ЕГРЮЛ&ЕГРИП). Минимизация ручного ввода и соответствие данных 1С учредительным сведениям юр. лиц & ИП.

3600 руб.

13.12.2012    88901    173    308    

248

SALE! 10%

Автоматическая загрузка файлов (например, прайс-листов) из электронной почты, FTP, HTTP, их обработка и выгрузка на FTP (на сайт) и для других целей

Прайсы WEB-интеграция Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Автомобили, автосервисы Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа с заданным интервалом времени (или по ручной команде) скачивает файлы (например, прайс-листы поставщиков) из различных источников: письма электронной почты, FTP или HTTP-адреса, и сохраняет их в каталог упорядоченной структуры. При этом извлекает файлы из архивов, может переименовывать файлы и менять их формат (csv, xls, txt). Можно настроить выгрузку обработанных файлов на сайт (через FTP-подключение). Программа будет полезна компаниям, у которых есть большое количество поставщиков и/или прайс-листы поставщиков обновляются часто (необязательно прайс-листы, файлы могут быть любого назначения). Собранные таким образом актуальные версии прайс-листов можно выгрузить с помощью программы себе на сайт (или на любой FTP-сервер) или выполнить другие необходимые задачи.

10600 9540 руб.

28.05.2015    81646    25    51    

49

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    23032    7    0    

6

Расширение 1СПАРК риски для 1С:Документооборот 8 КОРП

WEB-интеграция Управление взаимоотношениями с клиентами (CRM) Документооборот и делопроизводство (СЭД) Взаиморасчеты Платформа 1С v8.3 1С:Документооборот Бухгалтерский учет Управленческий учет Платные (руб)

Расширение для конфигурации 1С:Документооборот 8 КОРП, позволяющее с помощью сервиса "1СПАРК риски" проверять благонадежность контрагентов непосредственно из программы 1С.

7200 руб.

23.05.2018    26994    17    7    

14

Sync1C: Синхронизация 1С и OpenCart

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

Внешняя обработка для обмена данными с интернет-магазином OpenCart. Позволяет быстро наполнить магазин товарами, затем обновлять цены и добавлять новые товары. Далее можно средствами OpenCart настраивать и дополнять карточки товаров как надо для магазина, при этом связь товаров с 1С не теряется.

3840 руб.

30.03.2018    39781    73    133    

77

Справочник кодов ТНВЭД

Обработка справочников WEB-интеграция Операции по ВЭД Учет ТМЦ Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием Платные (руб)

Загрузка справочника ТНВЭД в базу данных 1С без изменения конфигурации. База кодов загружается с сайта www.nalog.ru или локального ресурса. После загрузки - справочник всегда под рукой! Реализован поиск по загруженной базе. Доступны примечания для групп справочника (комментарии налогового органа). Дополнительно реализовано занесение кодов ТНВЭД в справочники ИБ (например, справочник Номенклатура) как реквизита или свойства справочника. Подходит для всех стандартных конфигураций (БП 2.0, УПП 1.3, КА 1.1, УТ 10.3, Розница 1 и пр., написанных под обычные формы).

3100 руб.

29.09.2015    51856    13    4    

36

Прайс-лист с фотографиями, выгрузкой в Excel с подсчетом суммы заказа, загрузкой заказа в Управление торговлей 11 (Россия) и Управление торговлей для Беларуси 3

Прайсы Загрузка и выгрузка в Excel Оптовая торговля WEB-интеграция Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Прайс-лист для программы 1С: Управление торговлей 11 и Управление торговлей для Беларуси 3, позволяющий: 1) Формировать прайс-лист с фотографиями; 2) Сохранить прайс-лист в Excel с формулами, подсчитывающими количество и сумму заказа; 3) Передать сформированный прайс-лист по каналу ftp на сайт; 4) Сохранить прайс-лист в формате CSV; 5) Загрузить сделанный по прайс-листу заказ обратно в программу.

6000 руб.

04.09.2014    117930    41    105    

51

#KafkaЭтоПросто: Kafka Adapter 1С (Confluent) - отправляем сообщения

Инструментарий разработчика Внешние источники данных WEB-интеграция Платформа 1С v8.3 Абонемент ($m)

Сегодня поднимем в docker kafka с confluent'om, а в 1С, в EDT загрузим проект из репозитория, создадим обработку, в которой несколькими строчками отправим сообщение в kafka через rest proxy и в confluent control center посмотрим на него. Если коротко, то: как отправить сообщение в Kafka несколькими строчками кода без компонент, регистраций и смс.

5 стартмани

24.07.2022    10270    21    huxuxuya    29    

79

Яндекс.Метрика - загрузка статистики в 1С:Предприятие 8

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Хорошая основа вашего решения импорта данных статистики Яндекс.Метрики в информационную базу 1С. Получение счетчиков, запрос статистики, получение данных - все в одной обработке.

3600 руб.

21.06.2022    6414    1    0    

3

Заполнение контрагентов по ИНН для УТ 10.3

Обработка справочников WEB-интеграция Платформа 1С v8.3 1С:Управление торговлей 10 Россия Абонемент ($m)

Заполнение контрагентов по ИНН (1С: Управление торговлей 10.3).

6 стартмани

17.05.2022    7811    37    kostyan7    20    

1

Сервис push-уведомлений для 1С (Push Notification Service For 1C - PNS4OneS)

WEB-интеграция Платформа 1С v8.3 Абонемент ($m)

Сервис предназначен для передачи сообщений от сервера 1С клиентским сеансам. В простом случае полученное сообщение отображается у клиента в виде всплывающего окна (процедура 1С ПоказатьОповещениеПользователя). С использованием данного сервиса можно оповещать пользователей о новых задачах, полученных электронных письмах, менеджеров о новых заказах, загруженных с сайта и т. п. Дополнительно имеется возможность передавать произвольные данные и обрабатывать самостоятельно полученные сообщения на клиенте, что позволяет реализовать более сложные сценарии (чаты, отображение прогресса длительной операции на сервере и т. п.).

1 стартмани

02.02.2022    14342    38    ltfriend    9    

89

Интеграция 1С:БИТ.Управление медицинским центром и amoCRM

Управление взаимоотношениями с клиентами (CRM) WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Здравоохранение, медицина, стоматология Россия Управленческий учет Платные (руб)

Это законченное решение, которое позволяет в amoCRM получать данные о врачах и их свободном времени, в 1С создавать документ "Заявка", выгружать оплаты от клиента в лид. Тестировалось на конфигурации БИТ.Управление медицинским центром (2.0.46.43), платформа 1С:Предприятие 8.3 (8.3.16.1063), версия Python 3.10.1.

5400 руб.

28.01.2022    9569    1    2    

2

Обмен со СДЭК

WEB-интеграция Учет ТМЦ Платформа 1С v8.3 Конфигурации 1cv8 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Обработка позволяет производить обмен между 1С Альфа Авто 5.1 и СДЭК по протоколу API.

6000 руб.

21.12.2021    8622    1    0    

2

Интеграция с КОМТЕТ Касса Курьер

WEB-интеграция Учет ТМЦ Платформа 1С v8.3 1С:Управление торговлей 10 Платные (руб)

Внешняя обработка предназначена для интеграции конфигурации Управление торговлей 10.3 с веб-сервисом КОМТЕТ Касса Курьер. КОМТЕТ Касса Курьер это сервис с возможностью распределения заказов по курьерам, быстрой корректировке заказов в момент доставки, печати чеков по 54-ФЗ в момент расчета с покупателем.

3480 руб.

20.12.2021    7852    1    0    

1

Работа с 1С через протокол OData

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

В данной статье мы будем рассматривать работу с данными информационной базы через протокол OData (далее OData).

17.12.2021    35308    ProgrammingStore    27    

88

Подключение к HTTP-сервису с авторизацией посредством передачи клиентского SSL-сертификата

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

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

07.12.2021    11583    kholkin    12    

106

WEB/HTTP сервисы. Базовые отличия и применение на практике

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

Рассказываем о WEB и HTTP сервисах, их практическом применении, о шишках, которые мы набили, и о выводах, которые сделали. Спойлер: тех, кто дочитает статью до конца, ждет бонус от автора.

04.10.2021    30260    Neti    23    

114

HTTP-клиент

WEB-интеграция Платформа 1С v8.3 Мобильная платформа Конфигурации 1cv8 Абонемент ($m)

Подсистема 1С для работы с HTTP.

1 стартмани

28.07.2021    17090    55    SpaceOfMyHead    51    

94

Работа с картами в 1С на примере бесплатной библиотеки Leaflet

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Разработка функционала отображения и выбора пунктов доставки на карте прямо в 1С с помощью бесплатной библиотеки Leaflet. Тестирование производилось на платформе 8.3.15.1534 на тонком клиенте.

1 стартмани

31.03.2021    26043    71    Parsec1C    20    

83

Правила обмена больше не нужны

Внешние источники данных Обмен между базами 1C WEB-интеграция Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Бесплатно (free)

Есть несколько общепринятых подходов к написанию обмена между 1С-системами, каждый из которых упирается в длительное изучение технологии, мучительную отладку правил конвертации и написание большого количества сервисного кода, в котором потом тяжело разобраться. О принципах работы универсального фреймворка liteExchange, который реализует быстрые обмены между 1С и внешними системами, и берет на себя всю техническую обвязку по стандартному преобразованию данных, на INFOSTART MEETUP Saint Petersburg.Online рассказал Николай Крылов.

17.03.2021    19812    Nikola23    41    

80

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions

WEB-интеграция Облачные сервисы, хостинг Платформа 1С v8.3 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    12912    comol    32    

108

BIM: взаимодействие с платформой Autodesk Forge

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Строительство Абонемент ($m)

Предлагаемый пример демонстрирует широкие возможности для взаимодействия «1С:Предприятие» с платформой Autodesk Forge и позволяет вам получить базовые представления о применения технологий информационного моделирования в строительстве. Поддерживаются все версии платформы от 8.3.12 и выше до 8.3.18.

1 стартмани

25.11.2020    83397    16    kandr    3    

6

Поиск номенклатуры в интернете (Розница 2.3, Управление торговлей 11.4)

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

Альтернатива сервису 1С Номенклатура, не требует подписки ИТС, ищет данные в открытых источниках. Для поиска товара по штрихкоду в сети интернет, полезно для первоначального заполнения базы.

1999 руб.

15.10.2020    15927    20    55    

23

Самый простой парсинг и обработка веб-страниц в 1С

WEB-интеграция Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим самый простой парсинг веб-страниц средствами платформы 1С и еще некоторые полезные приемы работы с веб-страницами.

07.08.2020    24990    Infostart    30    

146

Ограничение доступа к HTTP публикациям 1С сервера используя NGINX

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В статье опишу вариант ограничения доступа к HTTP публикациям 1С сервера используя NGINX.

02.07.2020    14661    malikov_pro    14    

87