![]() |
![]() |
![]() |
|
XML: подредактировать свойство вложенного узла кодом ПриВыгрузке | ☑ | ||
---|---|---|---|---|
0
PiotrLoginov
26.09.13
✎
14:10
|
Здрасте всем. Создаю произвольный обмен. Проблема: внутри узла Объект узел Ссылка имеет свойство УникальныйИдентификатор без атрибутов ТипИсточника и ТипПриемника. Хочу добавить эти атрибуты кодом, вставленным в самое ближайшее к моменту выгрузки этих данных событие, а именно - ПриВыгрузке (модифицировать конфу нельзя).
Вот выгружается объект - элемент справочника. Сформировался узел Ссылка (свойство УникальныйИдентификатор не имеет необходимых атрибутов) - и "превратился в строку методом Закрыть() . Создается узел Объект. Строка со ссылкой "вкладывается" внутрь него методом ЗаписатьБезОбработки . И тут наступает время выполнения кода ПриВыгрузке. Как мне в этот момент обработать Объект, чтобы добавить атрибуты свойству вложенного в него узла Ссылка? Помогите плиз, третий день бьюсь. |
|||
1
PiotrLoginov
26.09.13
✎
14:32
|
На момент формирования узла Объект уже заполнена переменная УзелСсылки, содержащая закрытый узел Ссылка (тип - строка), и в этом же модуле имеется функция:
Функция СоздатьУзел(Имя) Экспорт ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); ЗаписьXML.ЗаписатьНачалоЭлемента(Имя); Возврат ЗаписьXML; КонецФункции Собственно, вот ключевой код, выполняемый перед ПриВыгрузке: Приемник = СоздатьУзел("Объект"); //тут еще идет добавление Объекту необходимых атрибутов, а затем: ДобавитьПодчиненный(Приемник, УзелСсылки); Выполнить(ПКО.ПриВыгрузке); Мне советовали добавлять атрибуты методом ЗаписатьАтрибут, но я не знаю, как мне правильно "добраться" внутрь узла Объект к свойству узла Ссылка, поэтому во время ПриВыгрузке просто редактирую содержимое переменной Приемник: СтрокаДляОбработки = Приемник.Закрыть(); Вставка = "ТипИсточника=""" + ПКО.ТипИсточника + """ ТипПриемника=""" + ПКО.Приемник + """ """; СтрокаДляОбработки = СтрЗаменить(СтрокаДляОбработки, "Имя=""{УникальныйИдентификатор}""", "Имя=""{УникальныйИдентификатор}"" Тип=""Строка"" " + Вставка); Приемник = Новый ЗаписьXML; Приемник.УстановитьСтроку(); Приемник.ЗаписатьБезОбработки(СтрокаДляОбработки); Увы, это не работает, т.е. Приемник в итоге содержит нужные мне данные, но дальнейшее добавление в него информации не выполняется - видимо, то, что я из него делаю, не пригодно для дальнейшей обработки. |
|||
2
PiotrLoginov
26.09.13
✎
17:03
|
Подробнее: дальше после того, как мой код редактирует содержимое Приемник'а, выполняется последовательное добавление к узлу Ссылка нескольких узлов Свойство (это реквизиты выгружаемого объекта). Если добавляемый реквизит ссылочного типа, внутри него записывается узел Ссылка.
Реквизиты добавляются в цикле. Поехали. Первый реквизит. Записывается свойство Родитель : выполняется ЗаписатьНачалоЭлемента("Свойство") , формируется и "подклеивается" Ссылка, а затем, и не одно - Свойство, после чего выполняется ЗаписатьКонецЭлемента() . Пока все ок. Далее. Начинается выполнение аналогичного действия для реквизита Артикул, но его значение - пустая строка (реквизит не заполнен), и выполнение этого витка цикла прерывается. Далее. Начинается создание свойства НаименованиеПолное. Вот тут-то при попытке выполнить ЗаписатьНачалоЭлемента("Свойство") возникает Исключение. Описание ошибки: "Ошибка при вызове метода контекста (ЗаписатьНачалоЭлемента): Ошибочный порядок записи XML" Вот содержимое переменной перед попыткой ЗаписатьНачалоЭлемента (тип - ЗаписьXML, но чтобы скопировать сюда содержимое, я в отладчике выполнил Закрыть() ): <Объект Нпп="1" Тип="СправочникСсылка.Номенклатура" ИмяПравила="Номенклатура"><Ссылка> <Свойство Имя="{КлючПоискаВИБИсточнике}"> <Значение>{"#",e18d5670-dd2f-4528-8897-d3f07ca77f21,57:92d6001167d6ab7b11e323649560bd79}</Значение> </Свойство> <Свойство Имя="{ИмяТипаВИБИсточнике}"> <Значение>СправочникСсылка.Номенклатура</Значение> </Свойство> <Свойство Имя="{УникальныйИдентификатор}" Тип="Строка" ТипИсточника="СправочникСсылка.Номенклатура" ТипПриемника="СправочникСсылка.Номенклатура"> <Значение>9560bd79-2364-11e3-92d6-001167d6ab7b</Значение> </Свойство> <Свойство Имя="Код"> <Значение>БП000000040</Значение> </Свойство> <Свойство Имя="Наименование"> <Значение>Тестовая номенклатура</Значение> </Свойство> <Свойство Имя="ЭтоГруппа"> <Значение>false</Значение> </Свойство> </Ссылка><Свойство Имя="Родитель"><Ссылка> <Свойство Имя="{КлючПоискаВИБИсточнике}"> <Значение>{"#",e18d5670-dd2f-4528-8897-d3f07ca77f21,57:b856001167d6ab7b11e1059a3178f10a}</Значение> </Свойство> <Свойство Имя="{ИмяТипаВИБИсточнике}"> <Значение>СправочникСсылка.Номенклатура</Значение> </Свойство> <Свойство Имя="{УникальныйИдентификатор}"> <Значение>3178f10a-059a-11e1-b856-001167d6ab7b</Значение> </Свойство> <Свойство Имя="Код"> <Значение>ОО-00000303</Значение> </Свойство> <Свойство Имя="Наименование"> <Значение>сок 0,5 л.</Значение> </Свойство> <Свойство Имя="ЭтоГруппа"> <Значение>true</Значение> </Свойство> </Ссылка> </Свойство> Предыдущие узлы закрыты (кроме головного), ничего особенного или сверхъестественного. Что за ерунда? Порыскал в интернете. Вот тут : http://forum.infostart.ru/forum26/topic42793/ пишут: "... не забывайте обозначать корневой элемент". О чем речь? Что неправильно? Помогите уже кто-нибудь, пожалуйста. |
|||
3
Поpyчик-4
26.09.13
✎
17:32
|
(2) XPath не предлагать?
|
|||
4
PiotrLoginov
26.09.13
✎
17:39
|
Все что угодно предлагайте, у меня уже руки опускаются, все перерыл.
|
|||
5
PiotrLoginov
26.09.13
✎
17:50
|
В любом случае, чтобы что-то делать с Приемник'ом (тип - ЗаписьXML ) мне нужно как-то его прочитать, даже если потом я собираюсь использовать XPath . Как это сделать? Не получится же что-то типа
ДанныедляОбработки = Новый ЧтениеXML; ДанныеДляОбработки.ПрочитатьНеФайлИНеСтрокуАтоЧтоСкрытоВСкобках(Приемник); МеханизмDOM = Новый ПостроительDOM; ..... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |