Имя: Пароль:
1C
 
Вызвать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) Или так, что логичнее.

СоединениеHTTP.Пользователь = "123";
СоединениеHTTP.Пароль = "123";
СоединениеHTTP.ВызватьHTTPМетод(МетодHTTP, ЗапросHTTP);

Зависит от метода авторизации на вебсервере
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
Если так коробит в редактировании конфы, то все это можно в расширении развернуть.