Доступ из базы 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

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL, 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    2108    2    0    

9

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

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

57600 руб.

26.11.2024    1849    1    1    

4

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

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

60000 руб.

07.05.2019    34147    63    45    

24

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

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    3333    3    2    

4

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

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

12000 руб.

02.02.2021    18512    53    50    

29

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

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

36000 руб.

03.08.2020    18760    20    22    

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

Спасибо, попробую такой вариант, я что-то до этого не додумалась.
3. ltfriend 24.02.21 18:57 Сейчас в теме
Авторизация в одну строку при создании HTTPСоединения
Новый HTTPСоединение("www.excample.com",  , ИмяПользователя, Пароль)
bashta.aleksey; dsdred; Cmapnep; valeraContek; kondrat230386; +5 Ответить
4. dsdred 3786 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 22 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 3786 01.03.21 11:08 Сейчас в теме
(5) Да тоже самое что во 2.

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