Надеюсь, что статья уменьшит чьи-то мучения по поиску информации, у меня при решении вроде бы несложного вопроса возник ряд проблем, решением которых хочу поделиться.
У меня возникла необходимость получения элементов справочника из базы, опубликованной на веб-сервере, через 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/
ЗаписьДанных.РазделительСтрок = "";