Имя: Пароль:
1C
1С v8
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;
.....
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.