Имя: Пароль:
1C
 
Отправка POST запроса к 1С
0 PR2
 
21.12.14
13:48
Почитал http://v8.1c.ru/o7/201312rest/index.htm, заинтересовала возможность через POST запрос что-то создавать в 1С, например элемент справочника Ref.
Сделал базу, опубликовал, получение данных просто через забивание URL в браузере типа http://xxx.xxx.xxx.xxx/my_base/odata/standard.odata/Catalog_Ref идет нормально.
А вот как послать POST запрос, как написано в статье, не понял.
Это где "Создание нового элемента данных выполняется POST-запросом. В качестве значения ссылки передается нулевой GUID. При создании и модификации объектов значения свойств передаются в теле запроса в формате XML (здесь текст запроса приведён полностью):...".
Уж по всякому попробовал.
Пробую что-то типа такого:

МойIP = "xxx.xxx.xxx.xxx";

ПутьКБазе = "/my_base";
//Или ПутьКБазе должен быть "/my_base/"?
//Или ПутьКБазе должен быть "/my_base/odata/standard.odata/Catalog_Ref"?
//Или ПутьКБазе должен быть "/my_base/odata/standard.odata/Catalog_Ref/"?

ТекстЗапроса =
"POST  /my_base/odata/standard.odata/Catalog_Ref HTTP/1.1
|Content-Type: application/atom+xml
|DataServiceVersion: 3.0;NetFx
|MaxDataServiceVersion: 3.0;NetFx
|Accept: application/atom+xml,application/xml
|Accept-Charset: UTF-8
|User-Agent: 1C-Enterprise
|Host: " + МойIP + "
|Content-Length: 1610
|
|<?xml  version=""1.0"" encoding=""utf-8""?>
|<entry  xmlns=http://www.w3.org/2005/Atom
|        xmlns:d=http://schemas.microsoft.com/ado/2007/08/dataservices
|        xmlns:m=http://schemas.microsoft.com/ado/2007/08/dataservices/metadata
|        xmlns:georss=http://www.georss.org/georss
|        xmlns:gml=http://www.opengis.net/gml>;
|
|   <category term=""EnterpriseV8.CatalogRef""  scheme=http://schemas.microsoft.com/ado/2007/08/dataservices/scheme />
|   <id />
|   <title />
|   <content type=""application/xml"">
|      <m:properties>
|         <d:Code>999</d:Code>
|         <d:DeletionMark>false</d:DeletionMark>
|         <d:Description>888</d:Description>
|         <d:IsFolder>false</d:IsFolder>
|         <d:Parent_Key m:null=""true"" />
|         <d:Ref_Key m:type=""Edm.Guid"">00000000-0000-0000-0000-000000000000</d:Ref_Key>
|      </m:properties>
|   </content>
|</entry>";

Соединение = Новый HTTPСоединение(МойIP);

ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Content-Type", "application/atom+xml");
//Я так понимаю, здесь должны быть еще параметры или все параметры можно в само тело запроса запихнуть?

Запрос = Новый HTTPЗапрос(ПутьКБазе, ЗаголовокHTTP);
Запрос.УстановитьТелоИзСтроки(ТекстЗапроса);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ОтветВВидеСтроки = Ответ.ПолучитьТелоКакСтроку("UTF-8");


Никак не соображу, что писать в текст запроса?
Кто силен в POST, подскажите.
1 SanGvin
 
21.12.14
14:00
А вы ваши заголовки засуньте куда следует (HTTPЗапрос.Заголовки)
2 SanGvin
 
21.12.14
14:03
POST  /my_base/odata/standard.odata/Catalog_Ref HTTP/1.1
|Content-Type: application/atom+xml
|DataServiceVersion: 3.0;NetFx
|MaxDataServiceVersion: 3.0;NetFx
|Accept: application/atom+xml,application/xml
|Accept-Charset: UTF-8
|User-Agent: 1C-Enterprise
|Host: " + МойIP + "
|Content-Length: 1610

-- это вообще в тело запроса не надо пихать. УРЛ в АдресРесурса положите
3 PR2
 
21.12.14
14:14
Написал

ТекстЗапроса =
"<?xml  version=""1.0"" encoding=""utf-8""?>
|<entry  xmlns=http://www.w3.org/2005/Atom
|        xmlns:d=http://schemas.microsoft.com/ado/2007/08/dataservices
|        xmlns:m=http://schemas.microsoft.com/ado/2007/08/dataservices/metadata
|        xmlns:georss=http://www.georss.org/georss
|        xmlns:gml=http://www.opengis.net/gml>;
|
|   <category term=""EnterpriseV8.CatalogRef""  scheme=http://schemas.microsoft.com/ado/2007/08/dataservices/scheme />
|   <id />
|   <title />
|   <content type=""application/xml"">
|      <m:properties>
|         <d:Code>999</d:Code>
|         <d:DeletionMark>false</d:DeletionMark>
|         <d:Description>888</d:Description>
|         <d:IsFolder>false</d:IsFolder>
|         <d:Parent_Key m:null=""true"" />
|         <d:Ref_Key m:type=""Edm.Guid"">00000000-0000-0000-0000-000000000000</d:Ref_Key>
|      </m:properties>
|   </content>
|</entry>";

Путь = "/notes/odata/standard.odata/Catalog_Ref";

Соединение = Новый HTTPСоединение("xxx.xxx.xxx.xxx");
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("POST  /notes/odata/standard.odata/Catalog_Ref HTTP/1.1");
ЗаголовокHTTP.Вставить("Content-Type", "application/atom+xml");
ЗаголовокHTTP.Вставить("DataServiceVersion", "3.0;NetFx");
ЗаголовокHTTP.Вставить("MaxDataServiceVersion", "3.0;NetFx");
ЗаголовокHTTP.Вставить("Accept", "application/atom+xml,application/xml");
ЗаголовокHTTP.Вставить("Accept-Charset", "UTF-8");
ЗаголовокHTTP.Вставить("User-Agent", "1C-Enterprise");
ЗаголовокHTTP.Вставить("Host", "xxx.xxx.xxx.xxx");
ЗаголовокHTTP.Вставить("Content-Length", "1610");
Запрос = Новый HTTPЗапрос(Путь, ЗаголовокHTTP);
Запрос.УстановитьТелоИзСтроки(ТекстЗапроса);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ОтветВВидеСтроки = Ответ.ПолучитьТелоКакСтроку("UTF-8");
Соединение = Неопределено;

Теперь виснет.
Нужно ли писать

ЗаголовокHTTP.Вставить("POST  /notes/odata/standard.odata/Catalog_Ref HTTP/1.1");

и

ЗаголовокHTTP.Вставить("Content-Length", "1610");

?
Размер чего вставлять в "Content-Length"?
4 PR2
 
21.12.14
14:24
+(3) При таком
ЗаголовокHTTP.Вставить("Content-Length", СтрДлина(ТекстЗапроса));
не виснет, но вроде как ничего и не делает, то есть элемент справочника не появляется.
Или я что-то не понимаю и так элемент справочника не создашь?
5 ASV
 
21.12.14
14:42
http://trade.demo.1c.ru/trade/odata/standard.odata/

Catalog_Ref ?? у тебя справочник ref??
6 PR2
 
21.12.14
14:44
(5) Да. Могу по-другому назвать для примера, вообще сиренево. Сейчас попробую назвать myref.
7 PR2
 
21.12.14
14:46
+(6) Поменял. Ничего не поменялось, все по прежнему.
8 PR2
 
21.12.14
14:48
(5) Кстати, выдается авторизационное окно, ХЗ что в него забивать
9 ASV
 
21.12.14
14:51
(8)логин пароль 1с
10 ASV
 
21.12.14
14:51
11 PR2
 
21.12.14
14:52
(9) Не подходит
12 PR2
 
21.12.14
14:53
(10) Да фиг с ней с авторизацией, я в default.vrd автоматическую авторизацию прописал, то есть сразу указал Usr и Pwd.
Сейчас важнее разобраться с самим POST запросом. Как послать-то?
13 PR2
 
21.12.14
14:55
+(11) А, хотя пардон, я пытался в окне, появляющемся после перехода по http://trade.demo.1c.ru/trade/odata/standard.odata/ указать логин пароль. Возможно, что при программном запросе прокатит.
Но, блин, как запрос-то послать?
14 ASV
 
21.12.14
15:09
ОтветВВидеСтроки что говорит
15 ASV
 
21.12.14
15:25
на питоне.
не нравилось что xmlns:m="http://.."; было без кавычек

    base64string = base64.encodestring('%s:%s' % ('Федоров (администратор)', '')).replace('\n', '')
    postData = '''
    <?xml  version="1.0" encoding="utf-8"?>
    <entry xmlns="http://www.w3.org/2005/Atom";
        xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices";
        xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
        xmlns:georss="http://www.georss.org/georss";
        xmlns:gml="http://www.opengis.net/gml">;
    <category term="EnterpriseV8.Catalog_Проекты"  scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"; />
    <id />
    <title />
    <updated>2013-08-12T11:48:25Z</updated>
    <author />
    <content type="application/xml">
      <m:properties>
         <d:DeletionMark>false</d:DeletionMark>
         <d:Description>135</d:Description>
        <d:Комментарий/>
         <d:Ref_Key m:type="Edm.Guid">00000000-0000-0000-0000-000000000000</d:Ref_Key>
      </m:properties>
    </content>
    </entry>
    '''.strip()

    conn = httplib.HTTPConnection("trade.demo.1c.ru")
    headers = {"Content-type": "application/atom+xml; charset=UTF-8",
        "Accept": "application/atom+xml,application/xml",
        "Authorization": "Basic %s" % base64string, #
        "Accept-Language": "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
        "DataServiceVersion": "3.0;NetFx",
        "MaxDataServiceVersion": "3.0;NetFx",
        "User-Agent": "Mozilla/5.0 (Windows NT 5.1; rv:32.0) Gecko/20100101 Firefox/32.0"}
    conn.request("POST", '/trade/odata/standard.odata/Catalog_Проекты', postData, headers)
    res = conn.getresponse()
    content='-'
    status=res.status
    #if str(status)=='200':
    content= str(res.read())#.decode('utf-8'))
16 ASV
 
21.12.14
15:26
Content-Length вообще убрать. 1С либо сама посчитает, либо сервер с 0 пропустит
17 ASV
 
21.12.14
15:30
18 PR2
 
21.12.14
15:31
Ахренеть! Свершилось!
После указания всяких кавычек во всяких "http://www.w3.org/2005/Atom"; наконец-то создался элемент!
19 PR2
 
21.12.14
15:32
+(18) Да, по ходу в (15) чувак то же самое словил.
20 PR2
 
21.12.14
15:35
+(19) Просто до последнего не верил, что у 1С в их статейке неправильно написано.
21 PR2
 
21.12.14
15:39
Кстати, прекраснейше пишутся элементы без проверки заполненности того же наименования, например.
22 PR2
 
21.12.14
15:45
(14) Раньше в ответе ругалось на отсутствие кавычек, сейчас в ответе возвращается xml нового элемента.
Примерно так (Р и R — это реквизиты справочника):

<?xml version="1.0" encoding="UTF-8"?><entry xmlns="http://www.w3.org/2005/Atom";
        xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices";
        xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
        xml:base="http://xxx.xxx.xxx.xxx/my_base/odata/standard.odata/">;
    <id>http://xxx.xxx.xxx.xxx/my_base/odata/standard.odata/Catalog_myref(guid'3949677f-890e-11e4-82df-d43d7eed38ac')</id>;
    <category term="StandardODATA.Catalog_myref"
            scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>;
    <title type="text"/>
    <updated>2014-12-21T15:38:12</updated>
    <author/>
    <summary/>
    <link rel="edit"
            href="Catalog_myref(guid'3949677f-890e-11e4-82df-d43d7eed38ac')"
            title="edit-link"/>
    <content type="application/xml"><m:properties xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"; xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">;
    <d:Description/>
    <d:DeletionMark>false</d:DeletionMark>
    <d:Р/>
    <d:DataVersion/>
    <d:Code>997</d:Code>
    <d:R/>
    <d:Ref_Key>3949677f-890e-11e4-82df-d43d7eed38ac</d:Ref_Key>
</m:properties>
    </content>
</entry>
23 PR2
 
21.12.14
17:43
Чертовщина какая-то.
Все это тестил в левой базе, сейчас сделал специальную базу для этих целей.
Опубликовал, все настроил, щелкаю в браузере http://IP/post/odata/standard.odata, не вижу метаданных.
Что за хрень?
24 PR2
 
21.12.14
17:56
+(23) Блин, вот это фокус, поставил режим совместимости с 8.3.4, все показалось. Что за хрень?
25 PR2
 
21.12.14
18:17
А вот уникальность кода, кстати, проверяется, при такой записи нового.
26 PR2
 
21.12.14
18:26
Хм, дальнейшее изучение показало, что заголовки тоже можно не заполнять, все работает и без них :))
27 PR2
 
21.12.14
18:46
Конечный код кнопки на форме, для потомков, так сказать :))
В конфигурации, в которой пытаемся создать нового контрагента, ессно должны быть справочник Контрагенты с реквизитами Комментарий и Город и справочник Города.
Заполнение города специально сделал через указание ГУИДа, для наглядности.

&НаКлиенте
Процедура СоздатьНовогоКонтрагентаЧерезPOSTЗапрос(Команда)
    
    Сервер = "77.37.142.90";
    ИмяБазы = "post";
    ИмяМетаданных = "Catalog";
    ИмяСправочника = "Контрагенты";
    АдресРесурса = "/" + ИмяБазы + "/odata/standard.odata/" + ИмяМетаданных + "_" + ИмяСправочника;
    
    ТекстЗапроса =
    "<?xml  version=""1.0"" encoding=""utf-8""?>
    |<entry  xmlns=""http://www.w3.org/2005/Atom"";
    |        xmlns:d=""http://schemas.microsoft.com/ado/2007/08/dataservices"";
    |        xmlns:m=""http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"";
    |        xmlns:georss=""http://www.georss.org/georss"";
    |        xmlns:gml=""http://www.opengis.net/gml"">;
    |
    |   <category term=""EnterpriseV8." + ИмяМетаданных + ИмяСправочника + """  scheme=""http://schemas.microsoft.com/ado/2007/08/dataservices/scheme""; />
    |   <id />
    |   <title />
    |   <content type=""application/xml"">
    |      <m:properties>
    |         <d:DeletionMark>false</d:DeletionMark>
    |         <d:IsFolder>false</d:IsFolder>
    |         <d:Parent_Key m:null=""true"" />
    |         <d:Ref_Key m:type=""Edm.Guid"">00000000-0000-0000-0000-000000000000</d:Ref_Key>";
    
    Если ЗначениеЗаполнено(КодНового) Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |         <d:Code>" + КодНового + "</d:Code>";
    КонецЕсли;
    
    Если ЗначениеЗаполнено(НаименованиеНового) Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |         <d:Description>" + НаименованиеНового + "</d:Description>";
    КонецЕсли;
    
    Если ЗначениеЗаполнено(КомментарийНового) Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |         <d:Комментарий>" + КомментарийНового + "</d:Комментарий>";
    КонецЕсли;
    
    Если ЗначениеЗаполнено(ГУИДГородаНового) Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |         <d:Город_Key>" + ГУИДГородаНового + "</d:Город_Key>";
    КонецЕсли;
    
    ТекстЗапроса = ТекстЗапроса + "
    |      </m:properties>
    |   </content>
    |</entry>";
    
    Соединение = Новый HTTPСоединение(Сервер, , "Пользователь", "password");
    
    ЗаголовокHTTP = Новый Соответствие();
    //ЗаголовокHTTP.Вставить("POST  /" + ИмяБазы + "/odata/standard.odata/" + ИмяМетаданных + "_" + ИмяСправочника + " HTTP/1.1");
    //ЗаголовокHTTP.Вставить("Content-Type", "application/atom+xml");
    //ЗаголовокHTTP.Вставить("DataServiceVersion", "3.0;NetFx");
    //ЗаголовокHTTP.Вставить("MaxDataServiceVersion", "3.0;NetFx");
    //ЗаголовокHTTP.Вставить("Accept", "application/atom+xml,application/xml");
    //ЗаголовокHTTP.Вставить("Accept-Charset", "UTF-8");
    //ЗаголовокHTTP.Вставить("User-Agent", "1C-Enterprise");
    //ЗаголовокHTTP.Вставить("Host", Сервер);
    Запрос = Новый HTTPЗапрос(АдресРесурса, ЗаголовокHTTP);
    Запрос.УстановитьТелоИзСтроки(ТекстЗапроса);
    ОтветОтСоединения = Соединение.ОтправитьДляОбработки(Запрос);
    Ответ = ОтветОтСоединения.ПолучитьТелоКакСтроку("UTF-8");
    
    Соединение = Неопределено;
    
КонецПроцедуры
28 PR2
 
21.12.14
18:50
+(27) Кто хочет погонять, пароль на пользователя "password" :))
29 PR2
 
22.12.14
11:23
Что-то так и не понял на простом понятийном уровне разницу между SOAP и REST.
Только в том, что SOAP тяжелее, а REST оперирует меньшим объемом данных?
На мой взгляд не принципиально. А принципиальные различия какие?
30 PR2
 
22.12.14
11:25
(29) А, ну и уникальные URL в REST.
На мой взгляд, REST — подчасть SOAP. Не?
31 PR2
 
12.01.15
13:10
(25) Оказывается, что дело в том, что нужно было использовать УстановитьСоставСтандартногоИнтерфейсаOData.
А в режиме совместимости с 8.3.4 доступно всё.
32 Serginio1
 
12.01.15
13:23