План обмена. Как записать XDTO без атрибутов xmlns?

1. Zixxx 04.12.21 17:12 Сейчас в теме
Необходимо в тег Body файла выгрузки записать XDTO который соответствует объекту
Но при записи добавляются атрибуты xmlns="http://www.sample-package.org" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

Читаться файл в базе приемнике должен типовым механизмом
Нужно писать целый объект без использования ЗаписатьНачалоЭлемента и т.п.

Код ниже. Что можно придумать?

Номенклатура_Тип    = ФабрикаXDTO.Тип("http://www.sample-package.org", "CatalogObject.Номенклатура");
Номенклатура_Объект    = ФабрикаXDTO.Создать(Номенклатура_Тип);
Номенклатура_Объект.Ref                = "318db719-54c2-11ec-8306-20898427d41a";
Номенклатура_Объект.DeletionMark    = false;
Номенклатура_Объект.Code            = "000000001";
Номенклатура_Объект.Description        = "Наименование_01";
    
НоваяЗаписьXML = Новый ЗаписьXML;
НоваяЗаписьXML.ОткрытьФайл(ИмяФайла);

УзелОбмена = ПланыОбмена.Обмен.НайтиПоНаименованию("Распределенная");
    
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

ЗаписьСообщения.НачатьЗапись(НоваяЗаписьXML, УзелОбмена);
    
ФабрикаXDTO.ЗаписатьXML(НоваяЗаписьXML, Номенклатура_Объект);
    
ЗаписьСообщения.ЗакончитьЗапись();
Показать
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Zixxx 04.12.21 23:42 Сейчас в теме
В результате создается файл
Как отсюда убрать атрибуты при записи XDTO? <CatalogObject.Номенклатура xmlns="http://www.sample-package.org" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<v8msg:Message xmlns:v8msg="http://v8.1c.ru/messages">
    <v8msg:Header>
        <v8msg:ExchangePlan>Обмен</v8msg:ExchangePlan>
        <v8msg:To>000000002</v8msg:To>
        <v8msg:From>000000001</v8msg:From>
        <v8msg:MessageNo>131</v8msg:MessageNo>
        <v8msg:ReceivedNo>78</v8msg:ReceivedNo>
    </v8msg:Header>
    <v8msg:Body>
        <CatalogObject.Номенклатура xmlns="http://www.sample-package.org" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <Ref>318db719-54c2-11ec-8306-20898427d41a</Ref>
            <DeletionMark>false</DeletionMark>
            
Код
000000001
Показать полностью
<Description>Наименование_01</Description> </CatalogObject.Номенклатура> </v8msg:Body> </v8msg:Message>
Показать
3. ElGatoGris 05.12.21 17:16 Сейчас в теме
По какому стандарту должен быть обмен? Видимо, следует выбирать пакет из имеющихся. Например из схемы urn:1C.ru:commerceml_2.
4. Zixxx 05.12.21 19:58 Сейчас в теме
(3) А какой из имеющихся пакетов запишется в xml без атрибутов xmlns?
5. ElGatoGris 06.12.21 05:41 Сейчас в теме
Таки никакой, ведь обмен идёт по определённой схеме, с определёнными типами данных, и эта схема должна указываться в объявлении корневого элемента.
Насколько я понимаю, если файл должен читаться типовыми механизмами, то эти механизмы ожидают увидеть схему данных, так что она всегда указывается.
6. Zixxx 06.12.21 08:47 Сейчас в теме
(5) По логике да, но что-то не сходится, в плане обмена указано xmlns:v8msg значит и CatalogObject.Номенклатура должен быть с соответствующим префиксом. Со своей стороны пробовал заменить схему xsd но не получилось добиться того что нужно.

Каким образом тогда нужно отредактировать эту схему?

<xs:schema xmlns:tns="http://www.sample-package.org" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.sample-package.org" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="CatalogObject.Номенклатура">
<xs:sequence>
<xs:element name="Ref" type="xs:string"/>
<xs:element name="DeletionMark" type="xs:boolean"/>
<xs:element name="Code" type="xs:string"/>
<xs:element name="Description" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
7. Sashares 34 06.12.21 12:51 Сейчас в теме
(1) Только править файл после формирования.
8. ElGatoGris 06.12.21 15:10 Сейчас в теме
(6) С какой целью собираетесь редактировать схему. Почему не пользуетесь готовой?
В вашем примере вы объявляете пространство имён tns, но не используете его.
9. Zixxx 06.12.21 18:15 Сейчас в теме
(8) Готовая это какая именно схема? tns подставляется автоматически.

Используется план обмена, конфигурации разные, загрузка в приемник должна осуществляться штатными механизмами, нужно при выгрузки преобразовать объекты для принимающей стороны. Атрибутов при этом быть не должно, так как в приемник не загрузится файл.

При выгрузке писать вручную начало и конец элемента не интересно
10. ElGatoGris 07.12.21 06:46 Сейчас в теме
(9)А придётся, похоже. Насколько я понимаю, фабрика XDTO работает по схеме. Странно, что принимающая сторона требует отсутствия атрибутов указания схемы для документа.
11. Zixxx 07.12.21 09:43 Сейчас в теме
(10) Принимающая сторона это типовой механизм 1с. Просто одно дело писать объекты через ЗаписатьXML, другое дело через ФабрикаXDTO.ЗаписатьXML. Эти методы пишут только свои объекты. Получаем, что вроде есть сериализация XML, но по двум похожим направлениям и одно в другое не передать.
12. ElGatoGris 07.12.21 13:07 Сейчас в теме
(11) Возможно, тогда имеет смысл создать свою схему (пакет) на основе структуры приемлемой для принимающей стороны. Приём данных наверняка происходит на основе какой-то схемы, просто на передающей стороне эта схема отсутствует. Честно говоря, сам только недавно занимаюсь обменом.
13. Zixxx 07.12.21 14:12 Сейчас в теме
(12) Так я и создал свою схему через XDTO и выгружать можно и загружать. Но как сказал выше в план обмена нельзя записать XTDO, так как там читается xml через ВозможностьЧтенияXML, и типы которые он ждет не те, что записывает XDTO, т.е. он не может прочитать узел с атрибутами.
14. ElGatoGris 07.12.21 17:05 Сейчас в теме
Возможно, следует пересмотреть схему. У объекта v8msg:Message должно быть два свойства v8msg:Header и v8msg:Body., а у v8msg:Body свойство CatalogObject.Номенклатура.
В этом месте
ФабрикаXDTO.ЗаписатьXML(НоваяЗаписьXML, Номенклатура_Объект);

фабрика как раз и формирует Номенклатура_Объект как корневой элемент, приписывая атрибуты со схемой. Насколько я понимаю, методом ФабрикаXDTO.ЗаписатьXML должен записываться только корневой объект. В нём будут перечислены все схемы.
15. Zixxx 07.12.21 17:21 Сейчас в теме
(14) Не совсем понял какую схему предлагается поменять, все что v8msg: создается на уровне платформы методом НачатьЗапись, произвольные данные мы можем писать только в узел <v8msg:Body>
16. ElGatoGris 08.12.21 15:25 Сейчас в теме
(15) Попробуйте
Номенклатура_Тип    = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogObject.Номенклатура");

Фабрика создаст структуру объекта на основе текущей конфигурации, вам остаётся только заполнить предопределённые поля. На принимающей стороне будет также создана структура на основе, как я понимаю, конфигурации принимающей стороны.
Для вашего исходного примера ошибка при наличии указания типа происходит потому что на принимающей стороне неизвестна схема, которую вы сделали.
17. Zixxx 16.12.21 17:59 Сейчас в теме
(16) Нет, он запишет также запишет эти имена, а быть их там не должно да и структура отличается по именам самих объектов. Вариантов на самом деле нет. Если только вручную формировать или после записи открывать файл и заменять определенную строку.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот