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

30.04.11

Интеграция - WEB-интеграция

Немного об 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

См. также

HTTP сервер 1С 7.7 + HTTP асинхронный клиент: внешние компоненты для 1С 7.7

Разработка внешних компонент WEB-интеграция Платформа 1С v7.7 Конфигурации 1cv7 Платные (руб)

Компонента HttpSrv7 позволяет создавать веб-сервисы в среде 1С 7.7 и даже, используя файлы HTML, несложные веб-сайты. С помощью нее можно обеспечить доступ к данным 1С 7.7 из браузера. Дополнительно используя компоненту HTTP_Async или синхронный клиент HTTP для 1С 7.7 (публикация № 1152364) можно наладить обмен данными между удаленными информационными базами. С помощью компоненты HTTP_Async можно параллельно посылать много запросов к сайтам, веб-сервисам (в т.ч. к HttpSrv7), а затем обрабатывать данные по мере их поступления.

2000 руб.

27.05.2022    7811    20    13    

31

Заполнение контрагента по ИНН с сайта DaData

WEB-интеграция Мастера заполнения Платформа 1С v7.7 1С:Торговля и склад 7.7 Россия Абонемент ($m)

Обработка для заполнения контрагента по ИНН с сайта DAData для Торговли.

2 стартмани

17.02.2022    4476    11    lazarsr    0    

1

Загрузка курсов валют с НБУ (Украина) в 1С 7.7

Банковские операции WEB-интеграция Платформа 1С v7.7 Конфигурации 1cv7 Украина Абонемент ($m)

Загрузка курсов валют в 1С 7.7 с сайта НБУ (Украина), используя "Msxml2.ServerXMLHTTP.6.0"

1 стартмани

31.05.2021    6539    5    user729873    0    

2

Загрузка курсов валют (для РБ) с сайта nbrb.by для конфигурации "Юкола-Инфо"

Банковские операции WEB-интеграция Платформа 1С v7.7 Конфигурации 1cv7 Беларусь Бухгалтерский учет Абонемент ($m)

В сентябре 2020 года запланирован переход официального интернет-сайта Национального банка Республики Беларусь на работу только по протоколу https.

1 стартмани

08.12.2020    9455    2    BotMan4    4    

1

Проверка контрагентов для ТиС 9.2 1С 7.7 с помощью WEB-сервиса ФНС

WEB-интеграция Платформа 1С v7.7 1С:Торговля и склад 7.7 Россия Абонемент ($m)

C помощью WEB-сервиса ФНС проводится проверка идентификационных реквизитов юридических лиц и индивидуальных предпринимателей по данным ЕГРН. Предусмотрена проверка как одного контрагента, так и списка контрагентов. Список контрагентов формируется по наличию товарного движения в заданный период. Платформа 1С 7.7. Торговля и Склад 9.2.

1 стартмани

06.12.2020    6371    10    alex_serb    0    

3

Загрузка курсов валют с сайта Нацбанка Республики Беларусь (МиСОФТ 1С 7.7 )

Банковские операции WEB-интеграция Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 Беларусь Бухгалтерский учет Абонемент ($m)

Изменились правила загрузки курсов валют с сайта Нацбанка Республики Беларусь. Обновление обработки типовой загрузки курсов валют в конфигурации бухгалтерии 1С 7.7 Мисофт.

1 стартмани

16.11.2020    10891    5    igor_1c    6    

3

Загрузка курсов валют с сайта НБРБ по защищенному протоколу HTTPS для 1С 7.7

Банковские операции WEB-интеграция Платформа 1С v7.7 Конфигурации 1cv7 Беларусь Абонемент ($m)

В связи с переходом Национального банка РБ с сентября 2020 на защищенный протокол HTTPS внесены изменения в обработку загрузки курсов валют с сайта Национального банка РБ для 1С 7.7.

2 стартмани

28.09.2020    13737    12    dimitryas    29    

3
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
0. artms 282 30.04.11 09:23 Сейчас в теме
Немного об API из 1С. Или простой способ создать, проверить и отправить на вебсервер XML-файл.

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

1. Magister 134 30.04.11 15:17 Сейчас в теме
А где же, собственно, "Как создать в 7.7 XML по схемам (XSD,XML) от заказчика"???
То, что я вижу - создание XML "с нуля" и дальнейшая его проверка по схеме. Но никак не создание по схеме.
2. artms 282 30.04.11 20:46 Сейчас в теме
Верное замечание. Отредактировал название. Задался вопросом.
3. SiAl 76 03.05.11 13:42 Сейчас в теме
сдесь = здесь. Вообще "двойка" за орфографию и пунктуацию.
4. bulpi 215 04.05.11 14:22 Сейчас в теме
Вот спасибо! Афтор, пеши ИСЧООО!!!!
5. Михаська 12 19.10.11 13:56 Сейчас в теме
Спасибо, как раз то что надо!
6. melnycky 16.11.11 12:23 Сейчас в теме
Интересно было прочитать.
Спасибо
7. пользователь 12.01.12 13:52
Сообщение было скрыто модератором.
...
8. ShurShun 33 17.05.12 10:11 Сейчас в теме
Спасибо, пригодилось, создаю структуру по писанному.. единственно создаваемый XML-файл в редакторе смотрится как одна строка.. Как бы это поправить, чтобы он смотрелся красиво, с разделением строк?!
9. dour-dead 271 29.05.12 15:42 Сейчас в теме
Спасибо за статью,
можно вопрос, как получить все ошибки в XML-файле?
10. artms 282 30.05.12 00:02 Сейчас в теме
Когда открываешь браузером. То идет считывание последовательно. И как следствие ошибки идут до первой. Как все сразу незнаю. Возможно существуют редакторы xml. Но у меня не было такой необходимости.
11. dour-dead 271 30.05.12 08:49 Сейчас в теме
Спасибо, хоть на этом.
Будем дальше искать.
12. grayglobus 196 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 282 12.10.12 01:07 Сейчас в теме
(14) kisson,
Нет ваше предположение не верно. GetXXTest не является частью библиотеки: XMLHttpRequest. И google молчит просто на надпись GetXXTest.

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

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

И отослать при помощи:XMLHttpRequest.
А после получения ответа обработать результат.
16. kisson 12.10.12 11:05 Сейчас в теме
(15)
Я не совсем правильно выразила свой вопрос.
Мне нужно сделать обмен 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 282 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 19 10.11.14 22:14 Сейчас в теме
Скажите, пожалуйста, как добавить в xml файл строку
<?xml:stylesheet type="text/xsl" ?>
это должна быть 2-я строка файла
19. artms 282 10.11.14 23:36 Сейчас в теме
20. artms 282 10.11.14 23:38 Сейчас в теме
Через total создал файл :
<?xml version="1.0" encoding="utf-8"?> 
<soap>
</soap>

открыл explorer-ом. нет проблем и так и так.
21. artms 282 10.11.14 23:40 Сейчас в теме
Да и вообще лучше тестируй в текстовом редакторе.
22. Spacer 355 22.09.15 14:23 Сейчас в теме
Скажите, а есть ли возможность отформатировать создаваемый xml файл так чтобы он выглядел структурированно, а не одной строкой?
23. artms 282 22.09.15 21:32 Сейчас в теме
(22) Spacer, откройте его браузером.
24. dvk09 2 29.01.18 02:51 Сейчас в теме
Не нашел где плюсик поставить))
Тут СПАСИБО напишу.
Хотя сам периодически это использую, но в голове постоянно не держу.
Приходиться перерывать старые обработки чтобы вспомнить что зачем))
А тут очень удобно и кратко написано практически все, что нужно))
25. Gugolovski 08.08.18 04:41 Сейчас в теме
А почему может схема не добавляться?
Попытка
Схема=СоздатьОбъект("MSXML2.XMLSchemaCache.6.0");
Сообщить("ОК - запустили парсер");
Исключение
Сообщить("Не удалось создать объект XMLSchemaCache","!");
КонецПопытки;

//тут получаю ОК

ИмяСхемы = "C:\goods\ADocuments.xsd";

Попытка
Схема.add(,ИмяСхемы);
Сообщить("ОК - подключили схему");
Исключение
Сообщить("Не удалось подключить схему: "+ИмяСхемы,"!");
КонецПопытки;
//получаю не удалось подключить схему.. схема рабочая
26. request4t 15.10.23 13:10 Сейчас в теме
неистово плюсую за пример кода. очень помогли. спасибо.

Header = XML_DOM.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""" ); 


как бы еще тег Коммерческая информация записать? создаю как узел, при открытии в баузере ошибка:

"xmlns: URI xmlns= is not absolute"
Оставьте свое сообщение