Имя: Пароль:
1C
1С v8
1C HTTP сервисы. GET и POST запросы.
0 andrey i1c
 
17.01.20
15:51
Доброго времени суток! Необходимо из 1С посредством POST запроса передавать данные, в частности справочник Номенклатуру, на веб сервер. Ссылка API имеется. Скажите, если инструкция какая что то вроде мануала по шагам? или хотя бы описать все по шагам. Если кто сталкивался, отпишитесь пожалуйста. Буду благодарен!
1 mikecool
 
17.01.20
15:53
мануалов не видел, яндексишь, читаешь, затык - спрашиваешь
2 lodger
 
17.01.20
15:56
на курсах за N рублей, наверняка барыжат step-by-step мануалами и примерами.
на всяких ресурсах наверняка есть статьи в духе "смотрите, я написал хелловорлд с помощью пост запроса".

что не понятно то?
делаешь

HTTPСоединение = Новый HTTPСоединение("твои параметры");
HTTPСоединение.ОтправитьДляОбработки(ТелоЗапроса, ТекстЗапроса, "еще какие-то флажки\параметры");
3 LOLYBUF
 
17.01.20
15:57
http://catalog.mista.ru/public/671511/

Отпиши если поможет
4 mikecool
 
17.01.20
15:57
(2) после курсов иногда заходишь в еще больший тупняк, ибо в курсах все работает, а в реалиях - не всегда )))
5 azernot
 
17.01.20
16:05
Простой пример выгрузки в формате JSON

МассивRoot = Новый Массив;
Пока ВыборкаПоНоменклатуре.Следующий() Цикл
    ДанныеНоменклатуры = Новый Структура;
    ДанныеНоменклатуры.Вставить("ID", Строка(ВыборкаПоНоменклатуре.Ссылка.УникальныйИдентификатор()));
    ДанныеНоменклатуры.Вставить("name", ВыборкаПоНоменклатуре.Наименование);
    ДанныеНоменклатуры.Вставить("code", ВыборкаПоНоменклатуре.Код);
    МассивRoot.Добавить(ДанныеНоменклатуры);
КонецЦикла;
        
// вставляем наш массив в еще одну структуру
СтруктураRoot = Новый Структура;
СтруктураRoot.Вставить("root", МассивRoot);

ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);  
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураRoot);
СтрокаJS = ЗаписьJSON.Закрыть();

ЗащищенноеСоединение = Ложь;
Если ЗащищенноеСоединение Тогда
    HTTPСоединение         = Новый HTTPСоединение(АдресСайта,443,Логин,Пароль,,,Новый ЗащищенноеСоединениеOpenSSL(Неопределено,Неопределено));
Иначе
    HTTPСоединение         = Новый HTTPСоединение(АдресСайта, ПортСайта, Логин, Пароль);
КонецЕсли;
            
//создаем запрос данных методом POST
запросPOST = Новый HTTPЗапрос();
запросPOST.Заголовки.Вставить("Content-type", "application/json");
запросPOST.АдресРесурса = АдресРесурса;
            
//Здесь задаем текст нашей отформатированной строки + задаем формат сроки
запросPOST.УстановитьТелоИзСтроки(СтрокаJS);
            
//Отправляем для обрааботки на сервер
ОтветHTTP = HTTPСоединение.ОтправитьДляОбработки(запросPOST);
Если НЕ (ОтветHTTP.КодСостояния >= 200 И ОтветHTTP.КодСостояния < 300) Тогда
    Сообщить("Выгрузка пакета не произведена: Код ответа сервера - "+ОтветHTTP.КодСостояния+", Ответ: "+ОтветHTTP.ПолучитьТелоКакСтроку());
Иначе    
    Сообщить("Успешно выгружен пакет");
КонецЕсли;
6 azernot
 
17.01.20
16:07
(3)  А, ну я видимо оттуда и воровал :)
7 pechkin
 
17.01.20
16:11
зачем люди такие конструкции ставят?    

Исключение
        #Если клиент Тогда
           Сообщить(ОписаниеОшибки());
        #КонецЕсли  
    КонецПопытки;

на каких курсах этому учат?
8 mikecool
 
17.01.20
16:14
(7) это с бородатых времен осталось
9 pechkin
 
17.01.20
16:21
разве были времена когда Сообщить на сервере не работало?
10 novichok79
 
17.01.20
16:35
(0) открываете ERP, смотрите работу с объектами httpсоединение, httpзапрос
11 novichok79
 
17.01.20
16:36
виды HTTP-запросов достаточно знать
12 azernot
 
17.01.20
17:02
(9) Были такие времена. Без скобок "Клиент" система вылетала по ошибке ещё при инициализации кода на сервере (Процедура или функция не обнаружена)
13 andrey i1c
 
17.01.20
18:00
(2) (5) (3) хотел обратиться для примера к сайту http://www.inmr.ru https соединением, а не http.

Пишу

ssl1 = Новый ЗащищенноеСоединениеOpenSSL(неопределено, неопределено);
HTTPСоединение = Новый HTTPСоединение("http://www.inmr.ru";, 443,,,,,ssl1);

Но ответ не приходит как таковой. Что тут не так?

также делал с параметрами ssl1  

    ssl1 = Новый ЗащищенноеСоединениеOpenSSL(
    Новый СертификатКлиентаWindows(),
    Новый СертификатыУдостоверяющихЦентровWindows());

    //здесь надо указать путь к сайту
    HTTPСоединение = Новый HTTPСоединение("http://www.inmr.ru";, 443,,,,, ssl1);
приходит ответ такой
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://inmr.ru/POST">here</a>.</p>;
<hr>
<address>Apache/2.4.10 (Unix) Server at http://www.inmr.ru Port 80</address>
</body></html>

в чем может быть дело?
14 lodger
 
17.01.20
18:20
(13) дело в том, что ты сам и привел.
...Новый HTTPСоединение("http://www.inmr.ru";...

сервер тебе говорит:
301 Moved Permanently
The document has moved http://inmr.ru/POST
15 andrey i1c
 
17.01.20
18:22
(14) как исправить можно?
16 lodger
 
17.01.20
18:22
(15) перепиши
Новый HTTPСоединение("http://www.inmr.ru";
на
Новый HTTPСоединение("http://inmr.ru/POST";
17 andrey i1c
 
17.01.20
18:25
(16) а ЗащищенноеСоединениеOpenSS в параметры HTTPСоединение прописывать?
если да, то с параметрами, или в параметрах Неопределено?
18 andrey i1c
 
17.01.20
18:30
//здесь пишем и выполняем запрос, в котором выбираем данные о нашем товаре
    //Код товара (code1c), наименование(представление) товара (name)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    Номенклатура.Код КАК code1c,
    |    Номенклатура.Представление КАК name
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    НЕ Номенклатура.ЭтоГруппа
    |    И НЕ Номенклатура.ПометкаУдаления";
    
    Результат = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    
    //Создали запись ЗаписьJSON
    ЗаписьJSON = Новый ЗаписьJSON;
    
    //Задаем параметры без переноса строк, можно сделать и с переносом
    тПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина);  
    ЗаписьJSON.УстановитьСтроку(тПараметрыJSON);
    
    
    МассивДанныхJSON = Новый Массив;
    СтруктураДанныхJSON = Новый Структура;
    
    //Выбираем данные из запроса и записываем в массив "МассивДанныхJSON"      
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        // Каждая запись товара у нас отдельная структура...
        тДанные = Новый Структура;
        тДанные.Вставить("code1c", ВыборкаДетальныеЗаписи.code1c);
        тДанные.Вставить("name", ВыборкаДетальныеЗаписи.name);
        
        //Добавляем структуру с информацией о товаре в наш массив "МассивДанныхJSON"
        МассивДанныхJSON.Добавить(тДанные);
        
    КонецЦикла;    
    
    //вставляем наш массив в еще одну структуру
    СтруктураДанныхJSON.Вставить("test", МассивДанныхJSON);
    
    ЗаписатьJSON(ЗаписьJSON, СтруктураДанныхJSON);
    
    //Здесь нам платформа переделала нашу сложную структуру в строку данных в формате JSON
    СтрокаJS = ЗаписьJSON.Закрыть();
    
    //В этот файл для примера наш сайт сформирует ответ после отправки на него данных методом POST
    ФайлОтвета = "C:\Users\User\Documents\temp\test.txt";
    
    ssl1 = Новый ЗащищенноеСоединениеOpenSSL(
    Неопределено,
    Неопределено);

    //здесь надо указать путь к сайту
    HTTPСоединение = Новый HTTPСоединение("http://www.inmr.ru/POST";, 443,,,,, ssl1);
    
    //создаем запрос данных методом POST
    запросPOST = Новый HTTPЗапрос("POST");
    
    //это обязательный заголовок тела запроса
    запросPOST.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
    
    //Здесь задаем текст нашей отформатированной строки + задаем формат сроки
    запросPOST.УстановитьТелоИзСтроки("mData="+СтрокаJS,"windows-1251",ИспользованиеByteOrderMark.НеИспользовать);
    
    Попытка
        //Отправляем для обрааботки на сервер
        HTTPСоединение.ОтправитьДляОбработки(запросPOST, ФайлОтвета);
        
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Пакет успешно был выгружен!";
        Сообщение.Сообщить();
    Исключение
        #Если клиент Тогда
            Сообщить(ОписаниеОшибки());
        #КонецЕсли  
    КонецПопытки;
19 andrey i1c
 
17.01.20
18:31
выше описал весь код проблема я думаю все таки тут

    ssl1 = Новый ЗащищенноеСоединениеOpenSSL(

    Неопределено,

    Неопределено);



    //здесь надо указать путь к сайту

    HTTPСоединение = Новый HTTPСоединение("http://www.inmr.ru/POST";;, 443,,,,, ssl1);
20 andrey i1c
 
17.01.20
18:31
что тут не так?
21 azernot
 
17.01.20
18:51
HTTPСоединение = Новый HTTPСоединение("http://www.inmr.ru";;, 443,,,,, ssl1);

//создаем запрос данных методом POST
запросPOST = Новый HTTPЗапрос("POST");
запросPOST.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
запросPOST.АдресРесурса = "/POST";

Вот так попробуй
22 azernot
 
17.01.20
18:55
+(21)
Точнее даже так:

Новый HTTPСоединение("http://inmr.ru";;;, 443,,,,, ssl1);

и далее по тексту
23 andrey i1c
 
17.01.20
18:56
(21) (22)  а тут параметры оставить неопределно или прописать?

ssl = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
24 andrey i1c
 
18.01.20
11:05
(5) Спасибо. Высылаю рабочий код, может кому пригодится. Соединение нужно делать напрямую inmr.ru (без www) и в запросе адрес ресурса закоментить. Тема закрыта. Всем спасибо!

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    Номенклатура.Код КАК code1c,
    |    Номенклатура.Представление КАК name
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    НЕ Номенклатура.ЭтоГруппа
    |    И НЕ Номенклатура.ПометкаУдаления";
    
    Результат = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    
    МассивRoot = Новый Массив;
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        ДанныеНоменклатуры = Новый Структура;
        ДанныеНоменклатуры.Вставить("code1c", ВыборкаДетальныеЗаписи.code1c);
        ДанныеНоменклатуры.Вставить("name", ВыборкаДетальныеЗаписи.name);
        МассивRoot.Добавить(ДанныеНоменклатуры);
    КонецЦикла;
    
    СтруктураRoot = Новый Структура;
    СтруктураRoot.Вставить("root", МассивRoot);
    
    СтруктураRoot = Новый Структура;
    СтруктураRoot.Вставить("root", МассивRoot);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);  
    ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
    ЗаписатьJSON(ЗаписьJSON, СтруктураRoot);
    СтрокаJS = ЗаписьJSON.Закрыть();
    
    //В этот файл для примера наш сайт сформирует ответ после отправки на него данных методом POST
    ФайлОтвета = "C:\Users\User\Documents\temp\test.txt";
    
    ЗащищенноеСоединение = Истина;
    Если ЗащищенноеСоединение Тогда
        HTTPСоединение         = Новый HTTPСоединение("inmr.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL(Неопределено,Неопределено));
    Иначе
        HTTPСоединение         = Новый HTTPСоединение("inmr.ru", 80, , );
    КонецЕсли;
    
    //создаем запрос данных методом POST
    
    запросPOST = Новый HTTPЗапрос();
    запросPOST.Заголовки.Вставить("Content-type", "application/json");
//    запросPOST.АдресРесурса = "inmr.ru";
    
    //Здесь задаем текст нашей отформатированной строки + задаем формат сроки
    
    запросPOST.УстановитьТелоИзСтроки(СтрокаJS);
    
    //Отправляем для обработки на сервер
    
    ОтветHTTP = HTTPСоединение.ОтправитьДляОбработки(запросPOST, ФайлОтвета);
    Если НЕ (ОтветHTTP.КодСостояния >= 200 И ОтветHTTP.КодСостояния < 300) Тогда
        Сообщить("Выгрузка пакета не произведена: Код ответа сервера - "+ОтветHTTP.КодСостояния+", Ответ: "+ОтветHTTP.ПолучитьТелоКакСтроку());
    Иначе    
        Сообщить("Успешно выгружен пакет");
    КонецЕсли;
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой