Http-Сервисы:Обмен данными

1. applesound 1 08.07.20 11:08 Сейчас в теме
Добрый день.
Настраиваю выгрузку контрагентов из БП в УТ с помощью http-сервиса по заданному ИНН.
На стороне БП:
Http-сервис
Имя: Exchange
Синоним: Exchange
Корневой URL: Exchange

Шаблон URL
Имя: GetAnyRequest
Синоним: GetAnyRequest
Шаблон: /GetAnyRequest

Метод
Имя: 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

В чем может быть беда? Где не досмотрел?


Большую часть материала взял из https://infostart.ru/public/955078/
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. andy_zhav 197 08.07.20 11:23 Сейчас в теме
(1) Здесь очевидно проблемы с таблицей маршрутизации вашей сети

в браузере пробовали обратиться к веб серверу по имени компьютера? Все It's Work отображается?
Попробуйте вместо имени компьютера подставить его IP адрес
3. lmnlmn 69 08.07.20 11:25 Сейчас в теме
(1) Имя хоста надо указывать в HTTPСоединение, а в HTTPЗапрос только адрес ресурса без измени хоста. У вас в соединении еще и адрес ресурса добавлен.
andy_zhav; +1 Ответить
4. andy_zhav 197 08.07.20 11:28 Сейчас в теме
(3)
Согласен. тож не сразу увидел
Запрос.АдресРесурса = РеквизитИмяКомпьютера;

Запрос.УстановитьТелоИзСтроки(СтрокаJSON, "UTF-8");

//Получаем текст из тела ответа.
Соединение2 = Новый HTTPСоединение("/BPdemo/hs/Exchange/GetAnyRequest",,Пользователь,Пароль);
5. lmnlmn 69 08.07.20 11:32 Сейчас в теме
(4) Наоборот.
Запрос.АдресРесурса = "/BPdemo/hs/Exchange" + "/GetAnyRequest";
Новый HTTPСоединение(РеквизитИмяКомпьютера,,Пользователь,Пароль);
6. applesound 1 08.07.20 16:09 Сейчас в теме
(5) Поправил.

{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(53)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки)
ОтветHTTP = Соединение2.ОтправитьДляОбработки(Запрос);
по причине:
Ошибка работы с Интернет: Couldn't resolve host name

по причине:
Ошибка работы с Интернет: Couldn't resolve host name
Прикрепленные файлы:
8. lmnlmn 69 08.07.20 18:22 Сейчас в теме
(6) Посмотрите, что в РеквизитИмяКомпьютера содержится. Может там заведомо недоступный хост, тег протокола или символ лишний прилип.
7. serg33rus 35 08.07.20 16:55 Сейчас в теме
А РеквизитИмяКомпьютера чему равен? Это действительно комп где стоит сервер 1С? http сервис на стороне сервера крутится.
unknow_user; +1 Ответить
9. applesound 1 13.07.20 12:13 Сейчас в теме
(7) РеквизитИмяКомпьютера - это имя самого компьютера.
Прикрепленные файлы:
POSTзапрос.epf
10. serg33rus 35 13.07.20 13:30 Сейчас в теме
(9) Это сервер к которому идет запрос. Т.е. адрес хоста. Пусть на хоcте передается в Запросе. Конечно странно, что текстом передается непосредственно запрос к базе данных. Обычно передают параметры, а уж на сервере формируют запрос к данным. Но тут все зависит от того, как переданная структура на сервере обрабатывается.
Если тебе пишет Couldn't resolve host name, то это значит, что она не может найти сервер, к которому идет HTTPСоединение. Смотри внимательно, что там написано.
unknow_user; +1 Ответить
11. applesound 1 17.07.20 10:29 Сейчас в теме
(10) нашёл!!!
В переменную РеквизитИмяКомпьютера передал неверное значение.
//Получаем текст из тела ответа.
Соединение2 = Новый HTTPСоединение(РеквизитИмяКомпьютера,,Пользователь,Пароль);
ОтветHTTP = Соединение2.ОтправитьДляОбработки(Запрос);
12. serg33rus 35 17.07.20 10:36 Сейчас в теме
(11) Бывает :-). Главное, что поборол :-).
unknow_user; +1 Ответить
13. applesound 1 17.07.20 10:37 Сейчас в теме
Одну победил, следующую ошибку получил:

Ошибка формата потока
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(59)}: Если ЗначениеИзСтрокиВнутр(ТекстТЗ) Тогда
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(10)}: ПолучитьНаСервере();

по причине:
Ошибка преобразования
по причине:
Ошибка формата потока
Прикрепленные файлы:
14. serg33rus 35 17.07.20 10:49 Сейчас в теме
(13) Хмммм. Судя по всему возвращаются какие-то хитрые данные, которые в строку добром не переведешь. Посмотри в отладчике на ТекстТЗ. Что там за данные? Ответ-то ты получаешь, а вот потом с ним как со строкой работать не получается похоже.
unknow_user; +1 Ответить
15. applesound 1 17.07.20 15:29 Сейчас в теме
(14) Нашёл.
ИНН перевожу из стоки в число и запрос не смог получить данные.
Прикрепленные файлы:
16. applesound 1 17.07.20 15:43 Сейчас в теме
Надеюсь последняя ошибка:
//////////////////////////////////////////////////////////Ош­ибка//////////////////////////////////////////////////////

{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(56)}: Преобразование значения к типу Булево не может быть выполнено
Если ЗначениеИзСтрокиВнутр(ТекстТЗ) Тогда

//////////////////////////////////////////////////////////Ош­ибка////////////////////////////////////////////////////////­

//Преобразуем ее в Таблицу значений методом ЗначениеИзСтрокиВнутр.
ТекстТЗ = ОтветHTTP.ПолучитьТелоКакСтроку();
Если ЗначениеИзСтрокиВнутр(ТекстТЗ) Тогда /////////////////////////////////////////////////////////Зде­сь вылетает
ТЗ2 = ЗначениеИзСтрокиВнутр(ТекстТЗ);
Для Каждого Стр Из ТЗ2 Цикл
Сообщить(Стр.Код + " " + Стр.Наименование+ " " + Стр.Наименование);
КонецЦикла;
КонецЕсли;

ТекстТЗ содержит значение типа строка.

{"#",acf6192e-81ca-46ef-93a6-5a6968b78663,
{9,
{3,
{0,"Наименование",
{"Pattern",
{"S",100,1},
{"L"}
},"Наименование",100},
{1,"ИНН",
{"Pattern",
{"S",50,1},
{"L"}
},"ИНН",50},
{2,"НаименованиеПолное",
{"Pattern",
{"S",250,1},
{"L"}
},"НаименованиеПолное",250}
},
{2,3,0,0,1,1,2,2,
{1,1,
{2,0,3,
{"S","Конфетпром ООО"},
{"S","7799555550"},
{"S","ООО ""Конфетпром"""},0}
},2,0},
{0,0}
}
}
Прикрепленные файлы:
17. applesound 1 17.07.20 16:18 Сейчас в теме
Разобрался. Так и не понял для каких целей это условие - убрал проверку.
Рабочий текст обработки
&НаКлиенте
Процедура Получить(Команда)
	ПолучитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПолучитьНаСервере()
	//Реквизиты обработки
	РеквизитИмяКомпьютера = Объект.ИмяКомпьютера; 
	РеквизитИНН = Объект.ИНН;
	
	//Описываем запрос который будет выполнен в другой базе.
	ТекстЗапроса = "ВЫБРАТЬ
	               |	Контрагенты.Наименование,
	               |	Контрагенты.ИНН,
	               |	Контрагенты.НаименованиеПолное
	               |ИЗ
	               |	Справочник.Контрагенты КАК Контрагенты
	               |ГДЕ
	               |	Контрагенты.ИНН = &ИНН";
	
	Стр = Новый Структура;
	Стр.Вставить("Запрос", ТекстЗапроса);
	Параметры1 = Новый Структура;
	Параметры1.Вставить("ИНН",РеквизитИНН);
	Стр.Вставить("Параметры",Параметры1);
	
	//Заворачиваем запрос в JSON.
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, Стр);
	СтрокаJSON = ЗаписьJSON.Закрыть();
	
	//Делаем POST-запрос к адресу http-сервиса.
	Пользователь = "admin";
	Пароль = "123";
	Запрос = Новый  HTTPЗапрос;
	//Запрос.АдресРесурса = "/GetAnyRequest";
	Запрос.АдресРесурса = "/BPdemo/hs/Exchange" + "/GetAnyRequest";
	Запрос.УстановитьТелоИзСтроки(СтрокаJSON, "UTF-8");
	
	//Получаем  текст из тела ответа.
	Соединение2 = Новый HTTPСоединение(РеквизитИмяКомпьютера,,Пользователь,Пароль);
	ОтветHTTP = Соединение2.ОтправитьДляОбработки(Запрос);
	
	//Преобразуем ее в Таблицу значений методом ЗначениеИзСтрокиВнутр.
	ТекстТЗ = ОтветHTTP.ПолучитьТелоКакСтроку();
	//Если ЗначениеИзСтрокиВнутр(ТекстТЗ) Тогда // Если ТаблицаЗначений Тогда. Что тогда?, почему тогда?, с чего это вдруг ТЗ в булево?
	ТЗ2 = ЗначениеИзСтрокиВнутр(ТекстТЗ);
	Для Каждого Стр Из ТЗ2 Цикл
		Сообщить(Стр.ИНН + " " + Стр.Наименование + " " + Стр.НаименованиеПолное);
	КонецЦикла;
	//КонецЕсли;	
КонецПроцедуры
Показать
Прикрепленные файлы:
POSTзапрос.epf
18. applesound 1 17.07.20 16:41 Сейчас в теме
Рабочий текст сервиса:
Функция GetAnyRequestGET(Запрос)
	JSON_Struktura = Запрос.ПолучитьТелоКакСтроку("UTF-8");
	
	ЧтениеJSON =  Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(JSON_Struktura);
	ЗапросПараметры = ПрочитатьJSON(ЧтениеJSON);
	ЧтениеJSON.Закрыть();
	
	Запрос = Новый Запрос;
	Запрос.Текст = ЗапросПараметры.Запрос;
	Для Каждого СтрСтр Из ЗапросПараметры.Параметры Цикл
		Результат = "";
		Значение1 = СтрЗаменить(СтрСтр.Значение,";",""); //запрет кода 1с с двумя и более операторами		
		Выполнить("Результат = " + Значение1);   // Не понятно, зачем эта строка? Из строки получаю число, в итоге запрос не собирает данные
		//Запрос.УстановитьПараметр(СтрСтр.Ключ,Результат);
		Запрос.УстановитьПараметр(СтрСтр.Ключ,Значение1); // Устанавливаю параметры запроса
	КонецЦикла;
	ТЗ = Запрос.Выполнить().Выгрузить(); // Получаю контрагента
	Текст = ЗначениеВСтрокуВнутр(ТЗ);
	
	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.УстановитьТелоИзСтроки(Текст);
	Возврат Ответ;
КонецФункции

Функция GetAnyRequestМетод1(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	Возврат Ответ;
КонецФункции
Показать
19. serg33rus 35 20.07.20 14:21 Сейчас в теме
(18) Круто. Поздравляю. Когда сам расковырял, то второй раз в это уже не упрешься.
unknow_user; +1 Ответить
20. unknow_user 01.07.23 06:52 Сейчас в теме
Была та же ощибка: "Ошибка работы с Интернет: Couldn't resolve host name". Пробовал подключаться по разному: с указанием полного адреса, с указанием адреса в запросе и без него, менял параметры SSL, заголовки и пр. Ничего не помогало, в итоге администратор на сервере DNS поменял, если не ошибаюсь, и всё заработало.
Обратите внимание на подсказку serg33rus: "Если Couldn't resolve host name, это значит, что она не может найти сервер, к которому идет HTTPСоединение". По-идее логи винды на сервере, где публикация, могут помочь
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот