|
ВызватьHTTPМетод как задать параметры? | ☑ | ||
---|---|---|---|---|
0
НоваяВолна
18.01.23
✎
08:08
|
Нарвалсяя на тему Как складывается HTTP адрес при вызове ВызватьHTTPМетод Прочитал, но остались вопросы. По идее мне надо из локальной базы создать документ в другой базе, опубликованной на web. Метод POST. Но как задать вид создаваемоего документа?
по идее сам метод, как я понял работает так: Ответ = Соединение.ВызватьHTTPМетод("POST","/api/v4/contacts/?type=json?, <ИмяВыходногоФайла>")? может я не прав. Не понятно что есть <ИмяВыходногоФайла>? В СП написано, что <ИмяВыходногоФайла> (необязательный) Тип: Строка. Имя файла, в который записывается тело ответа. Если не задано, то тело ответа может быть получено из объекта HTTPОтвет. Значение по умолчанию: Пустая строка. Как мне использовать этот метод с параметром POST или я воообще не туда капаю и вы можете подсказать другое решение? |
|||
1
Смотрящий
18.01.23
✎
08:14
|
МетодHTTP = "POST";
РесурсHTTP = "/api/v4/contacts/?type=json?"; СтруктураПараметры = Новый Структура; СтруктураПараметры.Вставить("id", 123); СтруктураПараметры.Вставить("charged", 0); СтруктураПараметры.Вставить("category", 0); JSONЗапись = Новый ЗаписьJSON; JSONЗапись.УстановитьСтроку(); ЗаписатьJSON(JSONЗапись, СтруктураПараметры, JSONНастройкиСериализацииПолучить()); JSONСтрока = JSONЗапись.Закрыть(); // Для отладки ЗапросHTTP = Новый HTTPЗапрос(РесурсHTTP, HTTPЗапросЗаголовкиПолучить()); // Формируем заголовки ЗапросHTTP.УстановитьТелоИзСтроки(JSONСтрока); // Формируем запрос Попытка ОтветHTTP = СоединениеHTTP.ВызватьHTTPМетод(МетодHTTP, ЗапросHTTP); // Получаем ответ сервера Исключение КонецПопытки; Если ТипЗнч(ОтветHTTP) = Тип("HTTPОтвет") Тогда // Разбираемся что прилетело Если ОтветHTTP.КодСостояния > 199 И ОтветHTTP.КодСостояния < 300 Тогда // Сервер отвечает вразнобой |
|||
2
НоваяВолна
18.01.23
✎
08:29
|
(1) а впорос ещё такой. В СтруктураПараметры я могу задать Пользователя и Пароль для подцепления к web сайту, на котором опубликована база? и если да, то как это будет выглядить?
КАК : СтруктураПараметры.Вставить("user", <ИмяПользователя>); СтруктураПараметры.Вставить("password", <Пароль>); |
|||
3
Смотрящий
18.01.23
✎
08:39
|
Функция HTTPЗапросЗаголовкиПолучить()
HTTPЗапросЗаголовки = Новый Соответствие; HTTPЗапросЗаголовки.Вставить("content-type", "application/json"); HTTPЗапросЗаголовки.Вставить("Connection", "Keep-Alive"); // Зависит от варианта авторизации на сервере, взять языка из одминов сервака // Или так, например, если через соль HTTPЗапросЗаголовки.Вставить("Authorization", Токен); // Или так, если открытым текстом HTTPЗапросЗаголовки.Вставить("user", ""); HTTPЗапросЗаголовки.Вставить("password", ""); Возврат HTTPЗапросЗаголовки; КонецФункции |
|||
4
arsik
гуру
18.01.23
✎
08:43
|
(3) Или так, что логичнее.
Зависит от метода авторизации на вебсервере |
|||
5
НоваяВолна
18.01.23
✎
09:00
|
Самое прикольное что я так и не увидел ответа на главный вопрос: Куда мне сунуть вид документа (конкретно ПеремещениеТоваров), который я и хчу (пока хотя бы пустой) создать в web базе
|
|||
6
НоваяВолна
18.01.23
✎
09:20
|
Может кто ответит на вопрос, как мне подствить вид записываемого файла? Какой сущностью про соединении с web это будет?
|
|||
7
FIXXXL
18.01.23
✎
09:46
|
(5) у тебя же запрос на той стороне обрабатывется? вставь в параметры видДок, "Перемещение"
а уже при обработке запроса на той стороне делай что нужно |
|||
8
Kassern
18.01.23
✎
09:54
|
(5) (6) Вы своим запросом к сервису создаете событие на другой стороне. Обычно постом в теле запроса отправляется json/xml данные, а наименование запроса отражает, что с этими данными сделать.
К примеру вы в теле запроса передали данные по документу?а запрос называется /document/adding.php. На той стороне сервис читает тело вашего запроса и создает документ по переданным данным, в ответ вам выплевывает 200, если все хорошо. |
|||
9
НоваяВолна
18.01.23
✎
10:01
|
(8) ищ наименования запроса я смогу получить доступ к метаданным на той стороне?
или тупо НазваниеЗапроса.Документы.ПеремещениеТоваров.Создать() что-то в таком виде смогу выполнить? |
|||
10
Kassern
18.01.23
✎
10:03
|
(9) Вы походу не поняли...
Вы делаете запрос и передаете данные. С той стороны читают переданные данные, делают с ними манипуляции в базе и возвращают ответ, если упрощенно. |
|||
11
Kassern
18.01.23
✎
10:04
|
Наименование нужно для понимания, что этот запрос должен делать.
|
|||
12
Kassern
18.01.23
✎
10:05
|
То о чем вы пишите, это больше к Odata протоколу.
https://infostart.ru/1c/articles/1570140/?ysclid=ld1bklssbt753812073 |
|||
13
НоваяВолна
18.01.23
✎
10:10
|
(12) Ну POST как и GET и т.д. и есть команды OData протокола.
Так вот суть моей задачи через протокол OData из озной базы 1С (локальной) подключится к другой базе 1С, которая опубликованиа на web. Причем никаких данных из первой базы во вторую мне передавать не надо. Надо подключится и обработкой, запущеннной в первой базе создать документ во второй. Пока пустой. |
|||
14
Kassern
18.01.23
✎
10:27
|
(13) " Ну POST как и GET и т.д. и есть команды OData протокола" - это не команды, а методы http сервиса. Просто одата вшита в платформу. Вам проще свой http сервис поднять с простенькой процедурой создания документа, достаточно обычного метода GET, если ничего передавать не нужно.
|
|||
15
НоваяВолна
18.01.23
✎
10:51
|
(14) как бы OData уже настроена, и мне надо создавать документ через него по техзаданию
|
|||
16
BaZZiL
18.01.23
✎
12:28
|
Функция ЗапоститьОбъектОДата(ДанныеОбъекта,АдресРесурса)
HTTPСоединение = Новый HTTPСоединение(ПараметрыПодключения.ИмяСервера,80,ПараметрыПодключения.ИмяПользователя,ПараметрыПодключения.Пароль); АдресРесурсаСтрока = ПараметрыПодключения.ИмяБазы+"/odata/standard.odata/"+АдресРесурса+"?&$format=json"; HTTPЗапрос = Новый HTTPЗапрос(АдресРесурсаСтрока); HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json"); ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб); Запись = Новый ЗаписьJSON; Запись.УстановитьСтроку(ПараметрыЗаписиJSON); ЗаписатьJSON(Запись,ДанныеОбъекта); ТелоЗапросаКакСтрока = Запись.Закрыть(); HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаКакСтрока,КодировкаТекста.UTF8); Попытка ОтветСервера = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос); Если ОтветСервера.КодСостояния = 201 Тогда ТелоОтветаКакСтрока = ОтветСервера.ПолучитьТелоКакСтроку(); ЧтениеJSON = Новый ЧтениеJSON(); ПрочитатьВСоответствие = Истина; ЧтениеJSON.УстановитьСтроку(ТелоОтветаКакСтрока); Данные = ПрочитатьJSON(ЧтениеJSON,ПрочитатьВСоответствие); ЧтениеJSON.Закрыть(); Возврат Новый Структура("Успех,ДанныеОбъекта",Истина,Данные); ИначеЕсли ОтветСервера.КодСостояния >= 400 Тогда ТелоОтветаКакСтрока = ОтветСервера.ПолучитьТелоКакСтроку(); ЧтениеJSON = Новый ЧтениеJSON(); ПрочитатьВСоответствие = Истина; ЧтениеJSON.УстановитьСтроку(ТелоОтветаКакСтрока); ОтветДанные = ПрочитатьJSON(ЧтениеJSON,ПрочитатьВСоответствие); ЧтениеJSON.Закрыть(); ОшибкаОдата = ОтветДанные.Получить("odata.error"); КодОшибки = ОшибкаОдата.Получить("code"); ТекстОшибки = ОшибкаОдата.Получить("message"); ТекстОшибкиЗначение = ТекстОшибки.Получить("value"); ОписаниеОшибки = "Ответ сервера "+Строка(ОтветСервера.КодСостояния)+" Код ошибки: "+КодОшибки+" "+ТекстОшибкиЗначение; ЗаписьЖурналаРегистрации(НСтр("ru = 'Создание документа через OData'"),УровеньЖурналаРегистрации.Информация, , , "Адрес ресурса: "+Символы.ПС+АдресРесурсаСтрока+ Символы.ПС+ "Тело запроса: "+Символы.ПС+ТелоЗапросаКакСтрока); Возврат Новый Структура("Успех,ОписаниеОшибки",Ложь,ОписаниеОшибки); Иначе ОписаниеОшибки = "Ответ сервера: "+Строка(ОтветСервера.КодСостояния); Возврат Новый Структура("Успех,ОписаниеОшибки",Ложь,ОписаниеОшибки); КонецЕсли; Исключение Возврат Новый Структура("Успех,ОписаниеОшибки",Ложь,"Нет ответа от сервера"); КонецПопытки; КонецФункции Процедура СоздатьРеализацию(ИННКонтрагента) ДанныеРеализации = Новый Структура(); ДанныеРеализации.Вставить("Date",ЗаписатьДатуJSON(ДатаРеализации,ФорматДатыJSON.ISO)); Организация = ОбщегоНазначенияБПВызовСервера.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация",); ИННОрганизации = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Организация,"ИНН"); ДанныеРеализации.Вставить("Организация_Key",РеквизитыПродажи.Получить("Организация_Key")); ДанныеРеализации.Вставить("БанковскийСчетОрганизации_Key",РеквизитыПродажи.Получить("БанковскийСчетОрганизации_Key")); ДанныеРеализации.Вставить("Контрагент_Key",РеквизитыПродажи.Получить("Контрагент_Key")); ДанныеРеализации.Вставить("ДоговорКонтрагента_Key",РеквизитыПродажи.Получить("ДоговорКонтрагента_Key")); ДанныеРеализации.Вставить("ВалютаДокумента_Key",РеквизитыПродажи.Получить("ВалютаДокумента_Key")); ДанныеРеализации.Вставить("Склад_Key",РеквизитыПродажи.Получить("Склад_Key")); ДанныеРеализации.Вставить("ТипЦен_Key",РеквизитыПродажи.Получить("ТипЦен_Key")); //ДанныеРеализации.Вставить("СчетУчетаРасчетовСКонтрагентом_Key",РеквизитыПродажи.Получить("СчетУчетаРасчетовСКонтрагентом_Key")); //ДанныеРеализации.Вставить("СчетУчетаРасчетовПоАвансам_Key",РеквизитыПродажи.Получить("СчетУчетаРасчетовПоАвансам_Key")); //ДанныеРеализации.Вставить("СчетУчетаРасчетовПоТаре_Key",РеквизитыПродажи.Получить("СчетУчетаРасчетовПоТаре_Key")); ДанныеРеализации.Вставить("ВидОперации","Товары"); ДанныеРеализации.Вставить("DeletionMark",false); ДанныеРеализации.Вставить("Posted",false); ДанныеРеализации.Вставить("СпособЗачетаАвансов","Автоматически"); ДанныеРеализации.Вставить("КурсВзаиморасчетов",1); ДанныеРеализации.Вставить("КратностьВзаиморасчетов","1"); ДанныеРеализации.Вставить("СуммаВключаетНДС",true); ДанныеРеализации.Вставить("Комментарий",КомментарийКДокументу); ДанныеРеализации.Вставить("ЭтоУниверсальныйДокумент",Истина); ТекущаяДатаПользователя = ОбщегоНазначения.ТекущаяДатаПользователя(); ДокТовары = Новый Массив(); НомерСтроки = 0; Для Каждого Стр Из НоменклатураКонтрагента Цикл СтрТовар = Новый Структура; НомерСтроки = НомерСтроки+1; СтрТовар.Вставить("LineNumber",НомерСтроки); СтрТовар.Вставить("Номенклатура_Key",Стр.НоменклатураКонтрагентаИД);//гуид номенклатуры в базе-приемнике СтрТовар.Вставить("КоличествоМест",0); СтрТовар.Вставить("ЕдиницаИзмерения_Key",Стр.ЕдиницаИзмеренияИД);// гуид еи в базе-приемнике СтрТовар.Вставить("Коэффициент",1); НоменклатураКод = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Стр.Номенклатура,"Код"); ОтветЦенаНоменклатуры = ПолучитьЦенуНоменклатурыКонтрагента(Стр.Номенклатура); // СтрТовар.Вставить("СтавкаНДС",XMLСтрока(СтрТоварСтавкаНДС)); СтрТовар.Вставить("СтавкаНДС","НДС20"); Если ОтветЦенаНоменклатуры.Успех Тогда СтрТовар.Вставить("Цена",ОтветЦенаНоменклатуры.ДанныеЦены.ЦенаНоменклатуры); СтрТовар.Вставить("Сумма",(СтрТовар.Цена * СтрТовар.Количество)); // СтрТовар.Вставить("СуммаНДС",УчетНДСКлиентСервер.РассчитатьСуммуНДС(СтрТовар.Сумма,Истина,УчетНДСВызовСервераПовтИсп.ПолучитьСтавкуНДС(СтрТоварСтавкаНДС))); СуммаНДС = Окр(СтрТовар.Сумма-СтрТовар.Сумма/1.2,2); СтрТовар.Вставить("СуммаНДС",СуммаНДС); // СтрТовар.Вставить("СуммаНДС",УчетНДСКлиентСервер.РассчитатьСуммуНДС(СтрТовар.Сумма,Истина,20); Иначе ОбщегоНазначения.СообщитьПользователю(ПараметрыПодключения.ПредставлениеБД+": Ошибка получения цены : "+ОтветЦенаНоменклатуры.ОписаниеОшибки+" "+Стр.Номенклатура); ЕстьОшибки = Истина; Возврат; КонецЕсли; СтрТовар.Вставить("СчетУчета_Key",РеквизитыПродажи.Получить("СчетУчета_Key")); СтрТовар.Вставить("СчетДоходов_Key",РеквизитыПродажи.Получить("СчетДоходов_Key")); СтрТовар.Вставить("СчетРасходов_Key",РеквизитыПродажи.Получить("СчетРасходов_Key")); СтрТовар.Вставить("СчетУчетаНДСПоРеализации_Key",РеквизитыПродажи.Получить("СчетНДС_Key")); // СтрТовар.Вставить("ПереданныеСчетУчета_Key",""); СтрТовар.Вставить("Субконто",РеквизитыПродажи.Получить("СубконтоНоменклатуры_Key")); СтрТовар.Вставить("Субконто_Type","StandardODATA.Catalog_НоменклатурныеГруппы"); ДокТовары.Добавить(СтрТовар); КонецЦикла; ДанныеРеализации.Вставить("Товары",ДокТовары); ШкУпак = Новый Массив(); //штрихкоды упаковок товаров Цикл Стр = Новый Структура("ШтрихкодУпаковки_Key",ИД_ШтрихкодУпаковкиКонтрагента); НомерСтроки = НомерСтроки + 1; Стр.Вставить("LineNumber",НомерСтроки); ШкУпак.Добавить(Стр); КонецЦикла; ДанныеРеализации.Вставить("ШтрихкодыУпаковок",ШкУпак); АдресРесурса = "Document_РеализацияТоваровУслуг"; СозданиеРеализации = ЗапоститьОбъектОДата(ДанныеРеализации,АдресРесурса); Если СозданиеРеализации.Успех Тогда ТекстСообщения = ПараметрыПодключения.ПредставлениеБД+": создана реализация "+СозданиеРеализации.ДанныеОбъекта.Получить("Number")+" "+КомментарийКДокументу; ОбщегоНазначения.СообщитьПользователю(ТекстСообщения); ЗаписьЖурналаРегистрации(НСтр("ru = 'Создание документа через OData'"),УровеньЖурналаРегистрации.Информация, , ,ТекстСообщения); Иначе ТекстСообщения = ПараметрыПодключения.ПредставлениеБД+": Ошибка создания реализации: "+СозданиеРеализации.ОписаниеОшибки; ОбщегоНазначения.СообщитьПользователю(ТекстСообщения); ЗаписьЖурналаРегистрации(НСтр("ru = 'Создание документа через OData'"),УровеньЖурналаРегистрации.Информация, , ,ТекстСообщения); КонецЕсли; КонецПроцедуры |
|||
17
BaZZiL
18.01.23
✎
12:44
|
Чтобы создать документ через OData нужно иметь наготове гуиды всех справочников, которые встретятся в документе.
Для этого их сперва нужно запросить из базы-приемника по штрихкодам, артикулам или как-то ещё, а потом добавлять в структуру документа. |
|||
18
Fram
18.01.23
✎
13:13
|
(16) ну вот! А ТС надеялся как через ком.. бац бац и в дамки
|
|||
19
Kassern
18.01.23
✎
13:38
|
(18) Так и тут все очень быстро. Делаешь на коленке http сервис, добавляешь там 1 метод ГЕТ. При его вызове создаешь док пустышку и все дела. Работы на 5мин.
|
|||
20
Kassern
18.01.23
✎
13:38
|
Если так коробит в редактировании конфы, то все это можно в расширении развернуть.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |