Добрый день.
Настраиваю выгрузку контрагентов из БП в УТ с помощью http-сервиса по заданному ИНН.
На стороне БП:
Http-сервис
Имя: Exchange
Синоним: Exchange
Корневой URL: Exchange
Метод
Имя: POST
Синоним: POST
HTTP-метод: POST
Обработчик:
Функция GetAnyRequestGET(Запрос)
JSON_Struktura = Запрос.ПолучитьТелоКакСтроку("UTF-8");
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(JSON_Struktura);
ЗапросПараметры = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Запрос = Новый Запрос;
Запрос.Текст = ЗапросПараметры.Запрос;
Для Каждого СтрСтр Из ЗапросПараметры.Параметры Цикл
Результат = "";
Значение1 = СтрЗаменить(СтрСтр.Значение,";",""); //запрет кода 1с с двумя и более операторами
Выполнить("Результат = " + Значение1);
Запрос.УстановитьПараметр(СтрСтр.Ключ,Результат);
КонецЦикла;
ТЗ = Запрос.Выполнить().Выгрузить();
Текст = ЗначениеВСтрокуВнутр(ТЗ);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(Текст);
Возврат Ответ;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
На стороне УТ. Обработка
Реквизиты:
ИмяКомпьютера (тип.строка)
ИНН (тип.строка)
Команда: Получить
//Пишем процедуру обращения к HTTP- сервису.
//Описываем запрос который будет выполнен в другой базе.
//Заворачиваем запрос в JSON.
//Делаем POST-запрос к адресу http-сервиса.
//Получаем текст из тела ответа.
//Преобразуем ее в Таблицу значений методом ЗначениеИзСтрокиВнутр.
&НаКлиенте
Процедура Получить(Команда)
ПолучитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПолучитьНаСервере()
//Реквизиты обработки
РеквизитИмяКомпьютера = Строка(Элементы.ИмяКомпьютера);
РеквизитИНН = Строка(Элементы.ИНН);
//Описываем запрос который будет выполнен в другой базе.
ТекстЗапроса = "ВЫБРАТЬ
| Контрагенты.Наименование,
| Контрагенты.ИНН,
| Контрагенты.НаименованиеПолное
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН";
Стр = Новый Структура;
Стр.Вставить("Запрос", ТекстЗапроса);
Параметры1 = Новый Структура;
Параметры1.Вставить("ИНН","РеквизитИНН");
Стр.Вставить("Параметры",Параметры1);
//Заворачиваем запрос в JSON.
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Стр);
СтрокаJSON = ЗаписьJSON.Закрыть();
//Делаем POST-запрос к адресу http-сервиса.
Пользователь = "admin";
Пароль = "123";
Запрос = Новый HTTPЗапрос;
Запрос.АдресРесурса = "/GetAnyRequest";
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, "UTF-8");
//Получаем текст из тела ответа.
Соединение2 = Новый HTTPСоединение(РеквизитИмяКомпьютера+"/BPdemo/hs/Exchange",,Пользователь,Пароль);
ОтветHTTP = Соединение2.ОтправитьДляОбработки(Запрос);
//Преобразуем ее в Таблицу значений методом ЗначениеИзСтрокиВнутр.
ТекстТЗ = ОтветHTTP.ПолучитьТелоКакСтроку();
Если ЗначениеИзСтрокиВнутр(ТекстТЗ) Тогда
ТЗ2 = ЗначениеИзСтрокиВнутр(ТекстТЗ);
Для Каждого Стр Из ТЗ2 Цикл
Сообщить(Стр.Код + " " + Стр.Наименование+ " " + Стр.Наименование);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
Показать
При попытке получить контрагента получаю ошибку:
Ошибка работы с Интернет: Couldn't resolve host name
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(50)}: ОтветHTTP = Соединение2.ОтправитьДляОбработки(Запрос);
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(10)}: ПолучитьНаСервере();
по причине:
Ошибка работы с Интернет: Couldn't resolve host name
(1) Здесь очевидно проблемы с таблицей маршрутизации вашей сети
в браузере пробовали обратиться к веб серверу по имени компьютера? Все It's Work отображается?
Попробуйте вместо имени компьютера подставить его IP адрес
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(53)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки)
ОтветHTTP = Соединение2.ОтправитьДляОбработки(Запрос);
по причине:
Ошибка работы с Интернет: Couldn't resolve host name
по причине:
Ошибка работы с Интернет: Couldn't resolve host name
(9) Это сервер к которому идет запрос. Т.е. адрес хоста. Пусть на хоcте передается в Запросе. Конечно странно, что текстом передается непосредственно запрос к базе данных. Обычно передают параметры, а уж на сервере формируют запрос к данным. Но тут все зависит от того, как переданная структура на сервере обрабатывается.
Если тебе пишет Couldn't resolve host name, то это значит, что она не может найти сервер, к которому идет HTTPСоединение. Смотри внимательно, что там написано.
(10) нашёл!!!
В переменную РеквизитИмяКомпьютера передал неверное значение.
//Получаем текст из тела ответа.
Соединение2 = Новый HTTPСоединение(РеквизитИмяКомпьютера,,Пользователь,Пароль);
ОтветHTTP = Соединение2.ОтправитьДляОбработки(Запрос);
Ошибка формата потока
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(59)}: Если ЗначениеИзСтрокиВнутр(ТекстТЗ) Тогда
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(10)}: ПолучитьНаСервере();
по причине:
Ошибка преобразования
по причине:
Ошибка формата потока
(13) Хмммм. Судя по всему возвращаются какие-то хитрые данные, которые в строку добром не переведешь. Посмотри в отладчике на ТекстТЗ. Что там за данные? Ответ-то ты получаешь, а вот потом с ним как со строкой работать не получается похоже.
Надеюсь последняя ошибка:
//////////////////////////////////////////////////////////Ошибка//////////////////////////////////////////////////////
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(56)}: Преобразование значения к типу Булево не может быть выполнено
Если ЗначениеИзСтрокиВнутр(ТекстТЗ) Тогда
//Преобразуем ее в Таблицу значений методом ЗначениеИзСтрокиВнутр.
ТекстТЗ = ОтветHTTP.ПолучитьТелоКакСтроку();
Если ЗначениеИзСтрокиВнутр(ТекстТЗ) Тогда /////////////////////////////////////////////////////////Здесь вылетает
ТЗ2 = ЗначениеИзСтрокиВнутр(ТекстТЗ);
Для Каждого Стр Из ТЗ2 Цикл
Сообщить(Стр.Код + " " + Стр.Наименование+ " " + Стр.Наименование);
КонецЦикла;
КонецЕсли;
Функция GetAnyRequestGET(Запрос)
JSON_Struktura = Запрос.ПолучитьТелоКакСтроку("UTF-8");
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(JSON_Struktura);
ЗапросПараметры = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Запрос = Новый Запрос;
Запрос.Текст = ЗапросПараметры.Запрос;
Для Каждого СтрСтр Из ЗапросПараметры.Параметры Цикл
Результат = "";
Значение1 = СтрЗаменить(СтрСтр.Значение,";",""); //запрет кода 1с с двумя и более операторами
Выполнить("Результат = " + Значение1); // Не понятно, зачем эта строка? Из строки получаю число, в итоге запрос не собирает данные
//Запрос.УстановитьПараметр(СтрСтр.Ключ,Результат);
Запрос.УстановитьПараметр(СтрСтр.Ключ,Значение1); // Устанавливаю параметры запроса
КонецЦикла;
ТЗ = Запрос.Выполнить().Выгрузить(); // Получаю контрагента
Текст = ЗначениеВСтрокуВнутр(ТЗ);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(Текст);
Возврат Ответ;
КонецФункции
Функция GetAnyRequestМетод1(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
КонецФункции
Была та же ощибка: "Ошибка работы с Интернет: Couldn't resolve host name". Пробовал подключаться по разному: с указанием полного адреса, с указанием адреса в запросе и без него, менял параметры SSL, заголовки и пр. Ничего не помогало, в итоге администратор на сервере DNS поменял, если не ошибаюсь, и всё заработало.
Обратите внимание на подсказку serg33rus: "Если Couldn't resolve host name, это значит, что она не может найти сервер, к которому идет HTTPСоединение". По-идее логи винды на сервере, где публикация, могут помочь