Имя: Пароль:
1C
1С v8
v8: Запись xml документа через DOM ЗаписьУзловDOM
,
0 kai17
 
24.08.12
14:29
Подвернулась задача выгрузки XML  файла из 1с во внешний файл .
По описанию  для построения документа  вполне  подходит ДокументDOM .
Читаю справку пользователя и рождается примерный код :


   ДокDOM = Новый ДокументDOM("http://metrics.org","Root"); // создание  объекта ДОМ с корневым элементом
   ЗаписьУзлов = Новый ЗаписьУзловDOM; // создание объекта  записи  узлов DOM
   ЗаписьУзлов.Открыть(ДокDOM);// определение  объекта DOM  для записи .

   // добавление  элемента (скопировано из справки пользователя)
   ЗаписьУзлов.ЗаписатьНачалоЭлемента("apple");
   ЗаписьУзлов.ЗаписатьСоответствиеПространстваИмен("nsp", "http://metrics.org");
   ЗаписьУзлов.ЗаписатьАтрибут("weight", "http://metrics.org", "12.5");
   ЗаписьУзлов.ЗаписатьКонецЭлемента();
   //ЗаписьУзлов.УзелDOM  содержит  верный документ DOM
   // ДокDOM не изменился
   ЗаписьУзлов.Закрыть(); // после закрытия объекта все изменения потеряны
   
   //  вывод документа DOM в ХМЛ  
   ЗаписьДом = Новый ЗаписьDOM;
   ЗаписьXML = Новый ЗаписьXML;
   ЗаписьXML.УстановитьСтроку();
   ЗаписьДом.Записать(ДокDOM,ЗаписьXML);
   СтрокаXML = ЗаписьXML.Закрыть();
   Сообщить(СтрокаXML) ; // ДокDOM содержит только корневой элемент , указанный  в конструкторе

Однако  несмотря на все ухищрения  в итоге файл XML  формируется пустой . Проблема в объекте ЗаписьУзловDOM , который успешно выполняет все  методы ,  не трогая при этом ДокументDOM .
Как можно  заставить  ЗаписьУзловDOM   перенести  изменения в  объект  
ДокDOM ? Может  метод какой нужен ?
PS 1С:Предприятие 8.2 (8.2.15.318)
1 kai17
 
27.08.12
07:33
up
2 andrewks
 
27.08.12
08:18
я не вижу, где ты тут файл пишешь. у тебя в строку выводится
3 andrewks
 
27.08.12
08:21
в коде винегрет.

вот пример рабочего кода


   ДОМ=Новый ДокументDOM;
   ТекЭлем=ДОМ.СоздатьЭлемент("Файл");
   ТекЭлем.УстановитьАтрибут("Атрибут_Файл_1","Здесь содержимое Атрибут_Файл_1");
   ТекТекст=ДОМ.СоздатьТекстовыйУзел("Здесь содержимое ""Файл""");
   ТекКомм=ДОМ.СоздатьКомментарий("Далее следует содержимое файла");
   ТекЭлем.ДобавитьДочерний(ТекТекст);
   ТекЭлем.ДобавитьДочерний(ТекКомм);
   ДОМ.ДобавитьДочерний(ТекЭлем);
   ТекЭлем=ТекЭлем.ДобавитьДочерний(ДОМ.СоздатьЭлемент("СодержимоеФайла"));
   ТекЭлем.УстановитьАтрибут("Атрибут_СодержимоеФайла_1","Здесь содержимое Атрибут_СодержимоеФайла_1");
   ТекТекст=ДОМ.СоздатьТекстовыйУзел("Здесь содержимое СодержимоеФайла");
   ТекCDATA=ДОМ.СоздатьСекциюCDATA("Это секция CDATA");
   ТекЭлем.ДобавитьДочерний(ТекТекст);
   ТекЭлем.ДобавитьДочерний(ТекCDATA);
   
   ХМЛ=Новый ЗаписьXML;
   ХМЛ.ОткрытьФайл(ИмяФайла,Новый ПараметрыЗаписиXML("windows-1251",,Ложь,Ложь));
   ЗаписьДОМ=Новый ЗаписьDOM;
   ЗаписьДОМ.Записать(ДОМ,ХМЛ);
   ХМЛ.Закрыть();

4 kai17
 
27.08.12
08:31
Есть пример добавления  элемента через  объект ЗаписьУзловDOM  ?
При добавлениия элементов непосредственно  через   ДокументDOM  проблем нет .
(3)  винегрет в строке Сообщить(СтрокаXML) ;  читать как вывод  в окно сообщения ,а не файл .
5 andrewks
 
27.08.12
08:35
(4) про файл это я уже понял, ты, видимо, сначала писал в файл, а потом переделал на вывод в сообщения, так?
по поводу конкретно записи через ЗаписьУзловDOM  - щас у себя проверю
6 kai17
 
27.08.12
08:48
(4) изначально действительно в коде  был вывод в файл , затем   был  сформирован код для демонстрации проблемного  места, максимально упрощенный . ЗаписьУзловDOM   понадобился так как в коде  записи  используется ФабрикаXDTO ,  вот она  производит запись ДокументDOM только через объект ЗаписьУзловDOM .
7 andrewks
 
27.08.12
08:53
у меня код из (0) ведёт себя так же. рабочего примера с ЗаписьУзловDOM   у меня нет, т.к. не пользовался.

в любом случае, через ДокументDOM ты можешь сформировать любой xml-документ, в т.ч. с ns
8 andrewks
 
27.08.12
08:55
http://infostart.ru/public/98019/
но там через чтение/записьхмл
9 andrewks
 
27.08.12
08:57
вообще, некоторые объекты касательно хмл в 1С просто тупо не работают (по крайней мере, при проверке с пол-года назад не работали), например, КаноническаяЗаписьXML, чтение/запись FastInfoSet
10 andrewks
 
27.08.12
09:07
если подавать запись узлов на запись хмл (до ЗаписьУзлов.Закрыть(); ), тогда пишет:

ЗаписьДом.Записать(ЗаписьУзлов.УзелDOM,ЗаписьXML);
11 andrewks
 
27.08.12
09:07
но пишет только этот фрагмент
12 kai17
 
27.08.12
09:14
(11) вот как перенести ЗаписьУзлов.УзелDOM  в ДокументDOM  непонятно .   Если перенос не осуществляется , зачем тогда ЗаписьУзлов.Открыть(ДокDOM) делать ? Логика работы этого объекта совершенно непонятна . примеров работы с ЗаписьУзловDOM на знает даже гугл .
13 andrewks
 
27.08.12
09:14
(12)вопрос уже задавался на оф.форум 1с http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=593021&print=1  - ответа нет
14 andrewks
 
27.08.12
09:15
если есть желание и время - напиши в поддержку
15 kai17
 
27.08.12
09:17
(14) написал  на  партнерском форуме http://partners.v8.1c.ru/forum/thread.jsp?id=1073601
тут есть фрагмент кода v8: Подскажите по теме XDTO ... к сожалению тоже нерабочий .
16 andrewks
 
27.08.12
09:24
(15) отпиши потом здесь, если ответят что-то внятное, а то доступ на партнёрский не у всех есть
17 andrewks
 
27.08.12
09:25
(12) логика работы понятна, но ровно до момента вызова ЗаписьУзлов.Закрыть();   ;-)
18 kai17
 
02.09.12
22:02
(16) Ответ  от разработчиков:
Экземпляр документа DOM, передаваемый в конструктор объекта ЗаписьУзловDOM, используется только для создания создаваемых в процессе записи узлов. Сами узлы не добавляются в документ. Сфомированный при записи фрагмент документа DOM доступен через свойство УзелDOM объекта ЗаписьУзловDOM. Если необходимо, его можно добавить к существующему элементу (или установив в качестве корневого) документа DOM, получив требуемую структуру документа.
19 andrewks
 
02.09.12
22:06
(18) нифига не добавляется,  пробовал уже.
20 kai17
 
03.09.12
09:06
(19) Заработало вот так :

Процедура КнопкаВыполнитьНажатие(Кнопка)
   ДокDOM = Новый ДокументDOM("http://metrics.org","Root"); // создание  объекта ДОМ с корневым элементом
   ЗаписьУзлов = Новый ЗаписьУзловDOM; // создание объекта  записи  узлов DOM
   ЗаписьУзлов.Открыть(ДокDOM);// определение  объекта DOM  для записи .

   // добавление  элемента (скопировано из справки пользователя)
   ЗаписьУзлов.ЗаписатьНачалоЭлемента("apple");
   ЗаписьУзлов.ЗаписатьСоответствиеПространстваИмен("nsp", "http://metrics.org");
   ЗаписьУзлов.ЗаписатьАтрибут("weight", "http://metrics.org", "12.5");
   ЗаписьУзлов.ЗаписатьКонецЭлемента();
   //ЗаписьУзлов.УзелDOM  содержит  верный документ DOM
   // ДокDOM не изменился
   ДокDOM.ЭлементДокумента.ДобавитьДочерний(ЗаписьУзлов.УзелDOM) ; // переносим изменения в документ DOM , добавляем к  корневому элементу  
   ЗаписьУзлов.Закрыть(); // после закрытия объекта все изменения  сохранены в ДокDOM
   //  вывод документа DOM в ХМЛ  
   ЗаписьДом = Новый ЗаписьDOM;
   ЗаписьXML = Новый ЗаписьXML;
   ЗаписьXML.УстановитьСтроку();
   ЗаписьДом.Записать(ДокDOM,ЗаписьXML);
   СтрокаXML = ЗаписьXML.Закрыть();
   Сообщить(СтрокаXML) ; // ДокDOM содержит все необходимые  значения

КонецПроцедуры
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn