Имя: Пароль:
1C
1C 7.7
v7: Выгрузка в XML
0 Andy120
 
22.10.11
22:10
Добрый вечер. Есть проблемка. Никак не могу сформировать файлик Выгрузки документов в формате XML.

Точнее ника не получается создать его корневой узел у которого в наименовании тега есть знак ":"

<?xml version="1.0" encoding="UTF-8"?>
<packet:InvoicePacket
       xmlns:packet="urn:xrm-ru:doc:edi:InvoicePacket:v1.0"
       xmlns:invoice="urn:xrm-ru:doc:edi:Invoice:v1.0"
       xmlns:cert="urn:xrm-ru:doc:edi:AcceptanceCertificate:v1.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="urn:xrm-ru:doc:edi:InvoicePacket:v1.0 ../xsd/InvoicePacket-1.0.xsd
                           urn:xrm-ru:doc:edi:Invoice:v1.0 ../xsd/Invoice-1.0.xsd
                           urn:xrm-ru:doc:edi:AcceptanceCertificate:v1.0 ../xsd/AcceptanceCertificate-1.0.xsd">


.....

</packet:InvoicePacket>

Может кто подскажет как побороть..?

С XML - столкнулся в первые ((
1 andrewks
 
22.10.11
22:14
ну, и где не получается?
2 Andy120
 
22.10.11
22:21
Пробывал через OpenXML:

Вот кусок кода:

Перем xml;
//*******************************************
Процедура Сформировать()
   
   ок=1;
   
   tt1=_GetPerformanceCounter();
   
   имяф="c:\Test.xml";
   Сообщить("Запись XML-файла: "+имяф);
   
   xml.СоздатьФайл(имяф);  
       
   xml.ЗаписатьТег("<packet:InvoicePacket>");                          
   
   xml.ЗаписатьТег("<Товары>");
   xml.ЗаписатьТег("<Элемент>");
     
   xml.ЗаписатьКомментарий("Комент");
   xml.ЗаписатьТег("</Элемент>");
   
   xml.ЗаписатьТег("</Товары>");
   xml.ЗаписатьТег("</packet:InvoicePacket>");
   xml.ЗакрытьФайл();
   
   tt2=_GetPerformanceCounter();
   
   Сообщить("Время выполнения: "+(tt2-tt1)/1000+" секунд");

КонецПроцедуры  

Процедура ОбрВыбОказаниеУслуг()

КонецПроцедуры

//************************************************
Процедура ПриОткрытии()
   
   Если ЗагрузитьВнешнююКомпоненту(КаталогБазыДанных() + "\Src\OpenXML.dll")=0 Тогда
       Сообщить("Не удается загрузить OpenXML.dll !!");
       Возврат;
   КонецЕсли;
   
   Попытка
       xml = СоздатьОбъект("AddIn.OpenXML");
   Исключение
       Сообщить("Не удается создать объект AddIn.OpenXML... !!");
       Возврат;
   КонецПопытки;
   
КонецПроцедуры


Говорит "Имя тега дожно заканчиваться >"
3 VasilyKushnir
 
22.10.11
22:25
(1) +1000 Везде!
4 Andy120
 
22.10.11
22:25
А если не ругается, то полученный файлик при просмотре в Explorer-e пустой
5 Andy120
 
22.10.11
22:28
Пробывал через XMLDOM... Файлик все равной пустой ((

//*******************************************
Процедура СоздатьИЗаписатьXML(ПутьЗаписи)
   xmlДок = СоздатьОбъект("Microsoft.XMLDOM");
       
   Если ПустоеЗначение(xmlДок) = 0 Тогда
       
       //СоздатьXML(СтруктураXML, xmlДок, xmlДок);
       
       //PI = xmlДок.createProcessingInstruction("xml", "version=""1.0""");
       xmlДок.appendChild(xmlДок.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"));
       //xmlДок.insertBefore(PI, xmlДок.childNodes.item(0));
       
       КорневойЭлемент = xmlДок.createElement("packet:InvoicePacket");
       КорневойЭлемент.setAttribute("xmlns:Table", "urn:www.navision.com/Formats/Table");
       КорневойЭлемент.setAttribute("version", "1.0");
       xmlДок.appendChild(КорневойЭлемент);
       
       Транзакция = xmlДок.createElement("transaction");
       Транзакция.setAttribute("version","1.0");
       КорневойЭлемент.appendChild(Транзакция);
       
       Строчка = xmlДок.createElement("Table:Field");
       Строчка.setAttribute("name","ManDate");
       Строчка.text = "Проверка текста";
       КорневойЭлемент.appendChild(Строчка);


       
       xmlДок.save(ПутьЗаписи);
       
       xmlДок = 0;
   Иначе
       Предупреждение("Не удалось создать XML документ!",10);
   КонецЕсли;
КонецПроцедуры
//*******************************************
Процедура Сформировать()
   ПутьБезПробелов = "c:\test03.xml";//СокрЛП(ПутьКXMLФайлу);
   
   Если ПустаяСтрока(ПутьБезПробелов) = 0 Тогда
       Если ФС.СуществуетФайл(ПутьБезПробелов) = 0 Тогда
           СоздатьИЗаписатьXML(ПутьБезПробелов);
       Иначе
           Ответ = Вопрос("Указанный файл существует!
           |Заменить данный файл?","Да+Нет",5);
           Если Ответ = "Да" Тогда
               СоздатьИЗаписатьXML(ПутьБезПробелов);
           КонецЕсли;
       КонецЕсли;
   Иначе
       Предупреждение("Не задан путь сохранения файла!",5);
   КонецЕсли;
КонецПроцедуры
6 andrewks
 
22.10.11
22:32
на, изучай.
и почитай ещё про пр-ва имён и схемы. хотя, если лень, можно и так всё вогнать, атрибутами/элементами

Функция ВывестиЭлем(ТекЭлем,Знач Смещ);
   
   Рез=1;
   Попытка
       Если (ТекЭлем.nodeType=1) Тогда
           Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":","!");
       ИначеЕсли (ТекЭлем.nodeType=3) Тогда
           Сообщить(Смещ+"Текст элемента: "+ТекЭлем.nodeValue);
       ИначеЕсли (ТекЭлем.nodeType=4) Тогда
           Сообщить(Смещ+"CDATA: "+ТекЭлем.nodeValue);
       ИначеЕсли (ТекЭлем.nodeType=8) Тогда
           Сообщить(Смещ+"Комментарий: "+ТекЭлем.nodeValue,"I");
       Иначе
           Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":");
           Сообщить(Смещ+"Тип: "+ТекЭлем.nodeType);
       КонецЕсли;
       
       Для ном=0 По ТекЭлем.attributes.length-1 Цикл
           ТекАтр=ТекЭлем.attributes(ном);
           Сообщить(Смещ+"Атрибут: "+ТекАтр.nodeName+", значение: "+ТекАтр.nodeValue);
       КонецЦикла;
       
   Исключение
       Рез=0;
   КонецПопытки;
   
   
   Смещ=Смещ+"    ";
   
   Для ном=0 По ТекЭлем.childNodes.length-1 Цикл
       ДочЭлем=ТекЭлем.childNodes(ном);
       Рез=Рез*ВывестиЭлем(ДочЭлем,Смещ);
   КонецЦикла;
   
   Возврат Рез;
КонецФункции

//*******************************************
Функция Сформировать()

   ИмяФайла="D:\1.xml";
   
   Попытка
       ДОМ=СоздатьОбъект("MSXML.DOMDocument");
       Узел=ДОМ.CreateProcessingInstruction("xml","version=""1.0"" encoding=""windows-1251""");
   Исключение
       Сообщить("Не удалось создать объект DOMDocument","!");
       Возврат 0;
   КонецПопытки;
   ДОМ.insertBefore(Узел,);
   
   
   ТекЭлем=ДОМ.appendChild(ДОМ.createElement("Файл"));
   Текст=ДОМ.createTextNode("Здесь содержимое Файл");
   ТекЭлем.appendChild(Текст);
   ТекЭлем.setAttribute("Атрибут_Файл_1","Здесь содержимое Атрибут_Файл_1");
   Комм=ДОМ.createComment("Далее следует содержимое файла");
   ТекЭлем.appendChild(Комм);
   
   ТекЭлем=ТекЭлем.appendChild(ДОМ.createElement("СодержимоеФайла"));
   Текст=ДОМ.createTextNode("Здесь содержимое СодержимоеФайла");
   ТекЭлем.appendChild(Текст);
   ТекЭлем.setAttribute("Атрибут_СодержимоеФайла_1","Здесь содержимое Атрибут_СодержимоеФайла_1");
   Текст=ДОМ.createCDATASection("Это секция CDATA");
   ТекЭлем.appendChild(Текст);
   ДОМ.save(ИмяФайла);
   
   Попытка
       ДОМ=СоздатьОбъект("MSXML.DOMDocument");
   Исключение
       Сообщить("Не удалось создать объект DOMDocument","!");
       Возврат 0;
   КонецПопытки;
   
   ДОМ.async=0;
   ДОМ.validateOnParse=-1;
   ДОМ.resolveExternals=-1;
   ДОМ.load(ИмяФайла);
   
   Если (ДОМ.parseError.errorCode<>0) Тогда
       // ошибки при проверке валидности

       Сообщить("При проверке валидности файла "+ИмяФайла+" выявлены ошибки!","!");
       Возврат 0;
   КонецЕсли;

   Рут=ДОМ.documentElement();
   Смещ="";
   Рез=ВывестиЭлем(Рут,Смещ);
   
   Возврат Рез;
КонецФункции
7 Толич
 
22.10.11
22:35
8 Andy120
 
22.10.11
22:37
Спасибо..
9 andrewks
 
22.10.11
22:37
(5) этот код даёт не пустой хмл-файл.

проверь, туда ли смотришь
10 Andy120
 
22.10.11
22:41
(9) При просмотре блокнотом он действительно не пустой, а при просмотре в explorer пустой. Или это нормально?
11 andrewks
 
22.10.11
22:42
дык файл-то не валидный получается, потому эксплорер его и не показывает
12 Andy120
 
22.10.11
22:43
(11) Что значит "не валидный"
13 andrewks
 
22.10.11
22:45
(12) то и значит, валидацию он не проодит
пр-во имён packet у тебя не описано, но употребляется
14 Andy120
 
22.10.11
22:46
(13) А как его нужно описывать?
15 andrewks
 
22.10.11
22:48
(14) ты меня удивляешь. смотри на свой текст в (0)
16 Andy120
 
22.10.11
22:51
(15) я понял, что так. Не понятно, как его описать кодом 1С.
17 andrewks
 
22.10.11
23:22
(16) не пойму, в чём у тебя затык?
ну пиши тупо так:


   Попытка
       ДОМ=СоздатьОбъект("MSXML.DOMDocument");
       Узел=ДОМ.CreateProcessingInstruction("xml","version=""1.0"" encoding=""windows-1251""");
   Исключение
       Сообщить("Не удалось создать объект DOMDocument","!");
       Возврат 0;
   КонецПопытки;
   ДОМ.insertBefore(Узел,);
   
   
   ТекЭлем=ДОМ.appendChild(ДОМ.createElement("packet:InvoicePacket"));
   ТекЭлем.setAttribute("xmlns:packet","urn:xrm-ru:doc:edi:InvoicePacket:v1.0");
18 Andy120
 
23.10.11
10:01
(17) Спасибо... Все сраслось...