gifts2017

Как создать в 7.7 XML, проверить по схемам (XSD, XML) от заказчика и отправить на вебсервер методом Post

Опубликовал Михаил Эртель (artms) в раздел Программирование - Практика программирования

Немного об API из 1С. Или простой способ создать, проверить и отправить на вебсервер XML-файл.

1С 7.7 спокойно создает такие объекты windows api как  MSXML. Этого более чем достаточно для работы с XML без всяких там dll. Даже если вы не найдете ответа здесь примеры с использованием этой библиотеки, на других языках часто просто достаточно скопировать в 1С и они работают. Так или иначе, описание есть в википедии и на сайте майкрософта.

DOMDocument - объектная модель документа часть библиотеки MSXML и позволяет довольно просто создать XML-файл. Причем может обмениваться данными с другими частями этой библиотеки.

Итак, создаем XML. 4.0 в конце обозначает версию. Если необходима более поздняя - вперед, меняйте.

XML_DOM=CreateObject("MSXML2.DOMDocument.4.0"); 

//Создадим документ опишим его заголовок
Header = XML_DOM.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""" ); 

//Если нужен загловок то пишем:
XML_DOM.appendChild(Header);

//для создания тегов используется функция createElement("Имя_Тега")
Тегcообщение = XML_DOM.createElement("MESSAGE");

//чтоб поместить его в наш документ используется функция appendChild(<Ссылка на документ или тег>)
XML_DOM.appendChild(Тегcообщение);

//соответственно чтоб поместить тег внутри тега напишем
ТегТелосообщения=XML_DOM.createElement("BODY");
Тегcообщение.appendChild(ТегТелосообщения);

// Теперь вставим какое-нибудь сообщение
ТегТекстсообщения=XML_DOM.createElement("TextMESSAGE");
ТегТекстсообщения.text   = "наше сообщение";
ТегТелосообщения.appendChild(ТегТекстсообщения);

//А также укажем у него атрибут
АтрибутТекста = XML_DOM.createAttribute("atr");
АтрибутТекста.nodeValue = "text";
ТегТекстсообщения.setAttributeNode(АтрибутТекста);

//а вот так его можно сохранить. И никаких работ со строкой и dll :)
XML_DOM.Save(КаталогИБ()+"1.xml");

//также существует две функции:
// Load() - загружает XML из файла или объекта 
// LoadXML() - загружает Из текста. 
// хоть в 1C напрямую его пишите например:
XML_DOM.loadXML("
|<MESSAGE>
|<BODY>
|<TextMESSAGE atr="text">нашесообщениеText</MESSAGE>
|</BODY>
|</MESSAGE>";

Также существуют и другие параметры, но удача, прямые руки и интернет гарантированно ответят на все вопросы.

Теперь немного об xmlschemacache. Если вам повезло и заказчик выслал схемы xsd или xml - не пугайтесь, вам действительно повезло. Ведь теперь XML можно проверить. Мне просто ну очень хотелось, чтоб сама 1С проверяла, что там мне вписали злодеи юзвери.

А посему вставил сей код, так или иначе в отладке само то:

//У той же самой библиотеки MSXML2 имеется функция проверки
Schema = СоздатьОбъект("msxml2.xmlschemacache.4.0");
Schema.add(, "E:\xsd\MESSAGE.xsd");

XML_DOM.schemas = Schema;
////собственно проверка на валидность
Ошибка = XML_DOM.validate();
Если Ошибка.errorCode = 0 Тогда
    Предупреждение("Документ соответствует схеме");
Иначе
    //// в свойстве .reason содержится причина ошибки.
    Предупреждение("ОШИБКА: "+Ошибка.reason);
КонецЕсли;

Ну и сама собственно отправка через xmlHttp кусок все той же библиотеки. Будьте аккуратны, если есть прокси. Посмотрите описание википедии или найдите пример с прокси. Можно указать как метод Post, так и Get - однако, со своими условиями. Да и методов более чем два. Если будет много плюсов распишу все:

xmlHttp = СоздатьОбъект("MSXML2.xmlHttp.4.0");
xmlHttp.OPEN ("POST", “http://123.123.123.123:70/”, 1);
//Если требуются заголовки
//  xmlHttp.setRequestHeader ("Host", "--SKIPPED--");
//  xmlHttp.setRequestHeader ("Content-type", "text/xml");
xmlHttp.SEND (XML_DOM);

При отсылке имейте в виду, что она не происходит моментально и требуется знать его состояние и получить какой-нибудь ответ.

Состояние находится тут xmlhttp.readyState (0 — не инициализирован, 1 — открыт, 2 — отправка данных, 3 — получение данных и 4 — данные загружены)

Ответ можно получить либо тут xmlHttp.responseText либо xmlHttp. responseXML . Причем, если пришлют XML ответом виде строки, можно загрузить его с помощью нашего DOMDocument'а . Делайте отдельной кнопкой

     XML_DOM.loadXML(xmlHttp.responseText);
//или
     XML_DOM.Save(КаталогИБ()+"2.xml"); 

Прошу не бить за грамотность. Потому как врожденно безграмотный. Пусть это будет полезным, а если будет от плюса не откажусь Wink

См. также

Подписаться Добавить вознаграждение

Комментарии

0. Михаил Эртель (artms) 30.04.11 09:23
Немного об API из 1С. Или простой способ создать, проверить и отправить на вебсервер XML-файл.

Перейти к публикации

1. Misha ⁠ (Magister) 30.04.11 15:17
А где же, собственно, "Как создать в 7.7 XML по схемам (XSD,XML) от заказчика"???
То, что я вижу - создание XML "с нуля" и дальнейшая его проверка по схеме. Но никак не создание по схеме.
2. Михаил Эртель (artms) 30.04.11 20:46
Верное замечание. Отредактировал название. Задался вопросом.
3. Алексей Ситников (SiAl) 03.05.11 13:42
сдесь = здесь. Вообще "двойка" за орфографию и пунктуацию.
4. bulpi bulpi (bulpi) 04.05.11 14:22
Вот спасибо! Афтор, пеши ИСЧООО!!!!
5. Михаил М (Михаська) 19.10.11 13:56
Спасибо, как раз то что надо!
6. Богдан Мельницкий (melnycky) 16.11.11 12:23
Интересно было прочитать.
Спасибо
8. ShurShun (ShurShun) 17.05.12 10:11
Спасибо, пригодилось, создаю структуру по писанному.. единственно создаваемый XML-файл в редакторе смотрится как одна строка.. Как бы это поправить, чтобы он смотрелся красиво, с разделением строк?!
9. {ÐƦǑƝȊ} mx (dour-dead) 29.05.12 15:42
Спасибо за статью,
можно вопрос, как получить все ошибки в XML-файле?
10. Михаил Эртель (artms) 30.05.12 00:02
Когда открываешь браузером. То идет считывание последовательно. И как следствие ошибки идут до первой. Как все сразу незнаю. Возможно существуют редакторы xml. Но у меня не было такой необходимости.
11. {ÐƦǑƝȊ} mx (dour-dead) 30.05.12 08:49
Спасибо, хоть на этом.
Будем дальше искать.
12. Sergey Goylo (grayglobus) 19.09.12 12:12
Отличная штука, скачаю, попробую, отпишу
13. Наталья (kisson) 11.10.12 16:32
Очень полезная информация! Спасибо!
14. Наталья (kisson) 11.10.12 16:35
Помогите пжт разобраться .... Задание такое

Для получения из агрегатора данных заказов торговых точек используется функция GetXXTest, которая возвращает XML файл с перечнем актуальных заказов.
Необходимо использовать метод POST
В заголовках метода указываем.... и так далее.

Как это понимать? Правильно предполагаю?

xmlHttp.GetXXTest("POST", “http://123.123.123.123:70/”, 1);

//Если требуются заголовки

// xmlHttp.setRequestHeader ("Host", "--SKIPPED--");

// xmlHttp.setRequestHeader ("Content-type", "text/xml");

xmlHttp.SEND (XML_DOM);
15. Михаил Эртель (artms) 12.10.12 01:07
(14) kisson,
Нет ваше предположение не верно. GetXXTest не является частью библиотеки: XMLHttpRequest. И google молчит просто на надпись GetXXTest.

Судя по всему речь идет о некой процедуре или функции уже встроенной (или предполагаемо встроенной) в вашу конфигурацию. Или о функции вообще не как не связанной с 1с.

Потенциально даже если данная функция отсутствует с помощью данной статьи можно попытаться написать её дубликат.
Но для этого нужно иметь список полей необходимых для заполнения. Или пример файла обмена.
После этого вы сможете сгенерировать его при помощи функций MSXML2.DOMDocument
(файл обмена, или список полей можно получить у админа того сервера откуда вы пытаетесь взять данные. Возможно у этого самого админа и есть уже готовая функция GetXXTest)

И отослать при помощи:XMLHttpRequest.
А после получения ответа обработать результат.
16. Наталья (kisson) 12.10.12 11:05
(15) artms,
Я не совсем правильно выразила свой вопрос.
Мне нужно сделать обмен 1С 7.7 и сторонним веб-сервисом поставщика. Они предоставили описание интервейса взаимодействия. Вот описание 2х запросов

1) Авторизация на web-сервисе производится GET вызовом функции authenticationSession, обязательно используя SSL (https) соединение, в котором в качестве параметров задается зарегистрированное имя и пароль дистрибьютора. Пароль передается как MD5 хэш значение.
Необходимо использовать метод POST
В заголовках метода указываем:

POST /Service1.asmx HTTP/1.1
Host: ...
Content-Type: ......
Content-Length: .........
SOAPAction: http://...../authenticationSession

В теле метода указываем:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">


2) Для получения из агрегатора данных заказов торговых точек используется функция GetXXTest, которая возвращает XML файл с перечнем заказов, актуальных на текущую сессию (ранее не переданных или измененных до получения изменившегося статуса заказа). Каждый заказ содержит код заказа и список товарных позиций с количеством в установленных для обмена единицах измерения.
Необходимо использовать метод POST
В заголовках метода указываем:

POST /Service1.asmx HTTP/1.1
Host: ...
Content-Type: ....
Content-Length: ....
SOAPAction: http://..../GetXXTest

В теле метода указываем:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org
.....
</soap:Envelope>

В ответ получаем:
Status code200 OK

Headers

Date: ....
Via: ...
Body

<?xml version="1.0" encoding="utf-8"?>
....
17. Михаил Эртель (artms) 12.10.12 16:36
(16) kisson,
//создаем сессию Get
xmlHttp = СоздатьОбъект("MSXML2.xmlHttp.4.0");
//open(method, URL, async, userName, password)
//полное описание http://ru.wikipedia.org/wiki/XMLHttpRequest // не уверен с параметром async
xmlHttp.OPEN ("GET", “http://123.123.123.123:70/”, 1,МД5("ЮЗЕР"),МД5("Пароль"));
пока xmlHttp.status<>200 Цикл
Если xmlHttp.status=404 тогда
сообщить("не могу соедениться");
возврат;
конецесли;
Конеццикла;
// xmlHttp.responseText мы получим authenticationSession ключ в этом тексте . Но где он там я не знаю не было необходимости

//Далее нужно создать документ
XML_DOM=CreateObject("MSXML2.DOMDocument.4.0");
XML_DOM.loadXML("
|<?xml version="1.0" encoding="utf-8"?>
|<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org
|.....
|</soap:Envelope>";
//Обязательно проверьте на ошибки
// проверить можно сохранив документ в файл и проверить открывается ли эксплорером
//XML_DOM.Save(КаталогИБ()+"1.xml");

xmlHttp = СоздатьОбъект("MSXML2.xmlHttp.4.0");

xmlHttp.OPEN ("POST", “http://123.123.123.123:70/”, 0,МД5("ЮЗЕР"),МД5("Пароль"));
// по
xmlHttp.setRequestHeader("POST", "/Service1.asmx HTTP/1.1");
xmlHttp.setRequestHeader("HOST", "..");
....
xmlHttp.setRequestHeader("SOAPAction", "http://..../GetXXTest");
xmlHttp.SEND (XML_DOM);

пока xmlHttp.status<>200 Цикл
Если xmlHttp.status=404 тогда
сообщить("не могу соедениться");
возврат;
конецесли;
Конеццикла;

Если Сокрлп(xmlHttp.responseText)="Status code200 OK" тогда
Сообщить(" Все кул");
Конецесли;

//Текст модуля предпологаю должен выглядеть так. Однако он однозначно требует нескольких ответов. Что ставить в async. И критично ли это для данного сервера. И где есть authenticationSession при первом соденении. И придеться найти функцию для мд5 шифрования.
18. Ольга Ковалева (volha-77) 10.11.14 22:14
Скажите, пожалуйста, как добавить в xml файл строку
<?xml:stylesheet type="text/xsl" ?>
это должна быть 2-я строка файла
19. Михаил Эртель (artms) 10.11.14 23:36
20. Михаил Эртель (artms) 10.11.14 23:38
Через total создал файл :
<?xml version="1.0" encoding="utf-8"?> 
<soap>
</soap>

открыл explorer-ом. нет проблем и так и так.
21. Михаил Эртель (artms) 10.11.14 23:40
Да и вообще лучше тестируй в текстовом редакторе.
22. Владимир Насыров (Spacer) 22.09.15 14:23
Скажите, а есть ли возможность отформатировать создаваемый xml файл так чтобы он выглядел структурированно, а не одной строкой?
23. Михаил Эртель (artms) 22.09.15 21:32
(22) Spacer, откройте его браузером.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа