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

24.02.21

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

Есть база, с пользователем/паролем, нужно подключиться к 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 к другой базе отрабатывает как нужно.

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

 

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

 

интеграция интерфейс OData

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

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

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

36000 руб.

03.08.2020    15933    13    18    

13

Интеграция 1С — Битрикс24. Обмен задачами

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

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17888    6    15    

13

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

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

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88944    163    216    

318

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

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

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

8400 руб.

01.02.2019    25873    9    0    

7

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

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

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

12000 руб.

02.02.2021    16479    42    49    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kirillkr 29 24.02.21 14:44 Сейчас в теме
(0)
Сам доходил до такого же, пока не попробовал авторизацию средствами самого HTTPСоединение. Если передать логин и пароль - пройдет Basic авторизация без ручного кодирования и добавления заголовка.
ovasiliev; +1
2. user823999 21 24.02.21 15:05 Сейчас в теме
(1)
же, пока не попробовал авторизацию средствами самого HTTPСоединение. Если передать логин и пароль - пройдет Basic авторизация без ручного кодирования и добавления заголовка.

Спасибо, попробую такой вариант, я что-то до этого не додумалась.
+
3. ltfriend 962 24.02.21 18:57 Сейчас в теме
Авторизация в одну строку при создании HTTPСоединения
Новый HTTPСоединение("www.excample.com",  , ИмяПользователя, Пароль)
bashta.aleksey; dsdred; Cmapnep; valeraContek; kondrat230386; +5
4. dsdred 3324 01.03.21 10:39 Сейчас в теме
Иногда нужно просто прочитать статью в которой уже все разжевано. Например: https://infostart.ru/1c/articles/885287/


перСервер = "127.0.0.1";
перПользователь = "Администратор (ОрловАВ)";
перПароль = "";

//Формируем запрос для OData
перРесурсНаСервере = "/DemoEnterprise2_4_3_145/odata/standard.odata/";	
перРесурсНаСервереФин = перРесурсНаСервере + 
"Catalog_Склады?$select=Ref_Key,Description&$filter=DeletionMark eq false and IsFolder eq false&$format=json;odata=nometadata";
HTTPСоединение = Новый HTTPСоединение(перСервер,,перПользователь,перПароль);
Ответочка = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Показать


И все работает
+
5. user823999 21 01.03.21 10:54 Сейчас в теме
(4)
перСервер = "127.0.0.1";
перПользователь = "Администратор (ОрловАВ)";
перПароль = "";

//Формируем запрос для OData
перРесурсНаСервере = "/DemoEnterprise2_4_3_145/odata/standard.odata/";
перРесурсНаСервереФин = перРесурсНаСервере +
"Catalog_Склады?$select=Ref_Key,Description&$filter=DeletionMark eq false and IsFolder eq false&$format=json;odata=nometadata";
HTTPСоединение = Новый HTTPСоединение(перСервер,,перПользователь,перПароль);
Ответочка = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Ну, это то же самое, что и в (2) предложили.

Меня смутило в данном случае то, что написано в синтаксис-помощнике про HTTP-соединение:
HTTPСоединение (HTTPConnection)
По умолчанию
Синтаксис:
Новый HTTPСоединение(<Сервер>, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <Таймаут>, <ЗащищенноеСоединение>, <ИспользоватьАутентификациюОС>)
Параметры:
<Сервер> (обязательный)
Тип: Строка. 
Хост сервера, с которым осуществляется соединение.
Примечание: Имя хоста не должно содержать указание протокола. Например, example.com.
<Порт> (необязательный)
Тип: Число. 
Порт сервера, с которым осуществляется соединение. 
Значение по умолчанию для HTTP соединений равно 80, для защищенных HTTPS соединений - 443.
Значение по умолчанию: порт по умолчанию для используемого протокола.
<Пользователь> (необязательный)
Тип: Строка. 
Имя пользователя на указанном сервере.
<Пароль> (необязательный)
Тип: Строка. 
Пароль пользователя на указанном сервере.
Показать
Что имя пользователя и пароль на указанном сервере... Собственно, я поэтому искала другой вариант.
+
6. dsdred 3324 01.03.21 11:08 Сейчас в теме
(5) Да тоже самое что во 2.

на счет "Пароль пользователя на указанном сервере."
Скорее всего это связано с "ИспользоватьАутентификациюОС"
+
Оставьте свое сообщение