Каталог решений - Доступ из базы 1С к стандартному интерфейсу Odata базы 1С, в которой заведен пользователь

Доступ из базы 1С к стандартному интерфейсу Odata базы 1С, в которой заведен пользователь

Доступ из базы 1С к стандартному интерфейсу Odata базы 1С, в которой заведен пользователь

В наличии

Есть база, с пользователем/паролем, нужно подключиться к Odata из другой базы 1С, получить элементы справочника.

Категория:

Описание

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

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

Первая ошибка, с которой я столкнулась, еще при попытке подключения из браузера (см.ниже), решилась просто: с помощью метода  "УстановитьСоставСтандартногоИнтерфейсаOData([МассивМетаданных])".

{
"odata.error": {
"code": "8",
"message": {
"lang": "ru",
"value": "Сущность 'Catalog_Маркет' не найдена"
}
}
}

После поправления — при запросе в браузере отображается запрос на ввод логина и пароля от базы 1С и все отрабатывает как и должно. 

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

Код для подключения к OData — обычный,  см. ниже: 

//создаем соединение
Попытка    		
		HTTPСоединение = Новый HTTPСоединение(СтруктураСоединения.СерверИсточник);
	Исключение
		Сообщение.Текст = "Не удалось соединиться с сервером: " + 	СтруктураСоединения.СерверИсточник;
		Сообщение.Сообщить();
		Сообщение.Текст = ОписаниеОшибки();
		Сообщение.Сообщить();
		
		Возврат Неопределено;
КонецПопытки;

//формируем URL
АдресРесурса = "/[имя базы на веб-сервере]/odata/standard.odata/Catalog_[Имя справочника]?$format=application/json"; 

//создаем  http-запрос
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса); 
	
	Попытка
		// Получаем ответ сервера в виде объекта HTTPОтвет.
		Ответ = HTTPСоединение.Получить(HTTPЗапрос); 
		
		//обработаем ответ, если нужно
		Если Ответ.КодСостояния > 300 тогда 

		КонецЕсли; 
        
        //получаем ответ в том виде, который нам нужен

		//ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();     		
		ТелоОтвета = Ответ.ПолучитьТелоКакПоток(); 

	Исключение

		Сообщение.Текст = ОписаниеОшибки();
		Сообщение.Сообщить();

	КонецПопытки; 	
	

Я посмотрела заголовки на открытой странице базы (изображение к публикации) и сравнила их с теми, которые я передавала в httpзапросе.

Оказалось, что  мне нужно было в httpзапросе указать заголовок Autorization (у меня базовая авторизация, по логину паролю, закодированному в формате base64, есть еще Digital, но в нее я не углублялась, потому что в моем случае в ней нет необходимости — моя база видна только в локальной сети).

Дальше казалось все просто — я закодировала логин и пароль в нужном формате следующим образом (есть еще вариант, как это сделать, с меньшим количеством строк кода, но я сделала так):


	ПотокВПамяти = Новый ПотокВПамяти();
	ЗаписьДанных = Новый ЗаписьДанных(ПотокВПамяти);
	ЗаписьДанных.ЗаписатьСтроку([тут логин и пароль]);
		
	ДД = ПотокВпамяти.ЗакрытьИПолучитьДвоичныеДанные();
	
	СтрокаЛогинПароль = Base64Строка(ДД);
	Заголовки.Вставить("Authorization" , "Basic "+СтрокаЛогинПароль);

И…не сработало —  все та же ошибка авторизации, с кодом ответа 401…

По причине, что при преобразовании строки важна как кодировка текста, так и разделитель строк: его быть не должно. Я после создания записи данных убираю разделитель строк: 

ЗаписьДанных.РазделительСтрок = "";

 И вуаля, все работает. Подключение и получение данных из базы 1С через OData к другой базе отрабатывает как нужно.

Публикация, которая мне помогла, спасибо автору): //sale.itcity.ru/public/392252/

 

	ЗаписьДанных.РазделительСтрок = "";

 

has been added to your cart:
Оформление заказа