Ошибка при вызове метода контекста создатьфабрикуxdto

   metanal

09.07.12 — 11:30

Здравствуйте. помогите разобраться. при выполнении кода

[code]

Пути = Новый Массив();

Пути.Добавить(ПутьКФайлуСхемы);

Фабрика = СоздатьФабрикуXDTO(Пути);

[/code]

возникает ошибка:

{Форма.Форма.Форма(5)}: Ошибка при вызове метода контекста (СоздатьФабрикуXDTO)

   Фабрика = СоздатьФабрикуXDTO(Пути);

по причине:

Ошибка проверки модели XDTO: xdto-package-3.3    пакет: http://**/awms

Импортируемый пакет типов ‘http://**/user-objects’ не определен

поиск ничего дельного пока не дал…

   sapphire

1 — 09.07.12 — 11:31

(0) И? Значит не определен тип.

   Skylark

2 — 09.07.12 — 11:32

По ходу что-то не нравится в схеме. Попробуй схему импортировать вручную в конфигурацию.

   metanal

3 — 09.07.12 — 11:33

в файле xsd. есть строчка с импортом. там тоже какая то ошибка. щас постараюсь текст достать

   metanal

4 — 09.07.12 — 13:13

«не удалось разрешить импортируемую схему для пространства имен»

   metanal

5 — 09.07.12 — 13:16

содержимое импортируемого файла property.xsd:

<uo:schema xmlns:uo=»http://**/awms/user-objects» xmlns=»http://**/awms/user-objects»

          xmlns:xs=»http://www.w3.org/2001/XMLSchema»

          targetNamespace=»http://**/awms/user-objects» elementFormDefault=»qualified»

          attributeFormDefault=»unqualified» version=»1.0.0.1″>

   <xs:complexType…

   <uo:complexType… и т.д.

содержимое главного файла:

<xs:schema targetNamespace=»http://**/awms» xmlns:awms=»http://**/awms»

          xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns:uo=»http://**/awms/user-objects»

          elementFormDefault=»qualified» attributeFormDefault=»unqualified» version=»1.0.0.2″>

   <xs:import namespace=»http://**/awms/user-objects» schemaLocation=»property.xsd»/>

   sapphire

6 — 09.07.12 — 13:18

(5) Вроде как с такими конструкциями xs:import namespace 1С не работает :(

   metanal

7 — 09.07.12 — 13:29

а эту ошибку я уже не в 1С прочитал. ее мне visual studio показывает

   metanal

8 — 09.07.12 — 13:34

без импорта действительно заработало. но с импортом тоже хотелось бы разобраться

   Саша Питерский

9 — 09.07.12 — 13:45

(5) Почему у тебя первая схема описана как uo:schema, а не xs:schema?

   metanal

10 — 09.07.12 — 13:51

файл не я писал. я только разбираюсь. но мне тоже было бы интересно услышать ответ на этот вопрос

   Саша Питерский

11 — 09.07.12 — 13:54

(10) Лично у меня проблем с конструкцией import не возникало.

Попробуй поменяй uo на xs и посмотри что получится.

   metanal

12 — 09.07.12 — 13:57

ругается на все типы <uo:

   metanal

13 — 09.07.12 — 13:58

«недопустимый дочерний элемент»

   Саша Питерский

14 — 09.07.12 — 14:18

(13) Заменяй все на xs

   metanal

15 — 09.07.12 — 17:18

теперь возникла другая проблема:

xsd:

<xs:element name=»warehouses»>

                   <xs:annotation>

                       <xs:documentation>список логических складов</xs:documentation>

                   </xs:annotation>

                   <xs:complexType>

                       <xs:sequence>

                           <xs:element name=»warehouse» maxOccurs=»unbounded»>

                               <xs:annotation>

                                   <xs:documentation>логический склад</xs:documentation>

                               </xs:annotation>

                               <xs:complexType mixed=»true»>

                           
                                   <xs:attribute name=»wh_name» use=»required»>

                                       <xs:simpleType>

                                           <xs:restriction base=»xs:ID»>

                                               <xs:maxLength value=»30″/>

                                           </xs:restriction>

                                       </xs:simpleType>

                                   </xs:attribute>

                                   <xs:attribute name=»wh_UID» type=»awms:_GUID» use=»required»/>

                               </xs:complexType>

                           </xs:element>

                           <xs:element name=»defaultWH» type=»xs:IDREF» minOccurs=»0″>

                               <xs:annotation>

                                   <xs:documentation>Склад «по умолчанию», который возвращается, пользователям, не прописанным в security.xml  </xs:documentation>

                               </xs:annotation>

                           </xs:element>

                       </xs:sequence>

                   </xs:complexType>

файл xml:

<warehouses>

       <warehouse wh_name=»WH1″ wh_UID=»{009e8f41-412c-11dd-8b47-000feaf1b3e0}»>Склад AWMS

         
       </warehouse>

   </warehouses>

при попытке чтения через сериализатор возникает ошибка:

{Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (ПрочитатьXDTO)

   Сериализатор.ПрочитатьXDTO(КорневойОбъектXDTO.warehouses.warehouse);

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: {http://www.w3.org/2001/XMLSchema}anyType    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: wh_name    Форма: Атрибут    Тип: {http://www.w3.org/2001/XMLSchema}anySimpleType

кто знает куда копать?

   Саша Питерский

16 — 09.07.12 — 17:27

(15) Что это за xml файл такой без заголовков и определенного namespace?

Что вот этой строкой хочется получить?

Сериализатор.ПрочитатьXDTO(КорневойОбъектXDTO.warehouses.warehouse);

   metanal

17 — 09.07.12 — 17:29

таблицу значений с 1 строкой. или соответствие.что угодно с типом 1С а не объектXDTO

   Саша Питерский

18 — 09.07.12 — 17:37

(17) А где у xml заголовок? Где в xsd описание того, в какой тип 1С должен превратиться wh_UID?

   metanal

19 — 09.07.12 — 17:38

я только выдержки из файлов выложил.сами по себе файлы очень большие

   metanal

20 — 09.07.12 — 17:39

а можно по подробнее про описание типа в xsd?

   metanal

21 — 09.07.12 — 17:39

наверное этого мне и не хватает

   Саша Питерский

22 — 09.07.12 — 18:11

Надо начать с того, что проверить, что файл соответствует схеме.

   metanal

23 — 09.07.12 — 19:35

весь файл очень большой. я уверен что что-нибудь да не так. а как все таки привязать тип атрибута к типу 1С?

   Саша Питерский

24 — 10.07.12 — 09:28

Загрузить схему в конфигурацию, затем открыть ее на редактирование, выбрать атрибут и выбрать у него тип, соответствующий нужному объекту 1С.

   metanal

25 — 10.07.12 — 10:56

спасибо. попробую

   metanal

26 — 10.07.12 — 15:02

вот что получилось:

http://gyazo.com/0488edd7a7a44ff02aff6fce11cf37ab

я правильно понимаю , что мне нужно назначить Тип элемента? из какого пространства имен выбирать тип. 1с core?

все варианты которые удалось пробовать не лишают меня ошибки из (15)

   Саша Питерский

27 — 10.07.12 — 15:05

(26) Приведи код вызова конструктора, которым ты создаешь тип Сериализатор.

   metanal

28 — 10.07.12 — 15:07

Пути = Новый Массив();

   Пути.Добавить(«C:Documents and SettingsАдминистраторРабочий столMetadataawms new.xsd»);

   Фабрика = СоздатьФабрикуXDTO(Пути);

   
   Сериализатор = Новый СериализаторXDTO(Фабрика);

       
   ЧтениеXML = Новый ЧтениеXML;

   ЧтениеXML.ОткрытьФайл(«C:Documents and SettingsАдминистраторРабочий столMetadataРазработкаawms.xml»);

   КорневойОбъектXDTO = Фабрика.ПрочитатьXML(ЧтениеXML, Неопределено);

   ЧтениеXML.Закрыть();

   
   Сериализатор.ПрочитатьXDTO(КорневойОбъектXDTO.warehouses.warehouse);

   Саша Питерский

29 — 10.07.12 — 15:14

1. Тебе нужно указать тип элемента, то есть сказать например, что в указанном атрибуте хранится значение типа СправочникСсылка.Склады.

Если посмотреть список пакетов, то такую информацию можно найти в пакете

http://v8.1c.ru/8.1/data/enterprise/current-config

2. Если ты меняешь тип в загруженном пакете, то потом либо внеси изменения в свой xsd, либо поменяй свой код создания фабрики на создание из метаданных, а не из файла

3. Я бы еще попробовал в код

   КорневойОбъектXDTO = Фабрика.ПрочитатьXML(ЧтениеXML, Неопределено);

В качестве второго параметра не указывать неопределено, а либо вообще его пропустить, либо явно указать тип, который ты из файла читаешь.

   metanal

30 — 10.07.12 — 15:18

если не указывать «неопределено» вываливалось с ошибкой.

мне не обязательно привязывать к складам. мне бы хотя бы реквизит wh_name указать как строку.

пространства имен http://v8.1c.ru/8.1/data/enterprise/current-config

у меня почему то нет. конфа не типовая

   Саша Питерский

31 — 10.07.12 — 15:21

(30) С какой ошибкой? Раз ошибка, значит укажи конкретный тип.

Про хотя бы указать как строку не понял.

КорневойОбъектXDTO.warehouses.warehouse.__content разве у тебя не является строкой?

Указанное пространство имен указывает на твою текущую конфигурацию. Ей все равно, типовая конфа или нет.

   metanal

32 — 10.07.12 — 15:24

на строку вроде больше не ругается:

КорневойОбъектXDTO = Фабрика.ПрочитатьXML(ЧтениеXML);

но теперь тип не определяется )

сейчас буду пробывать.

свойства __content к сожалению у меня и в помине нет.

   metanal

33 — 10.07.12 — 15:31

и пакет я всегда экспортирую. до этого я хотя бы догадался

   metanal

34 — 10.07.12 — 16:45

для wh_name в xsd проовал указывать все возможные типы из пространства имен http://v8.1c.ru/8.1/data/core.

ничего это не изменило

<xs:attribute name=»wh_name» use=»required» type=»ns1:**»>

   Саша Питерский

35 — 10.07.12 — 16:50

Если я правильно понимаю как должна работать платформа, Сериализатор по GUID вернет тебе ссылку на элемент склада.

У тебя GUID содержится в поле wh_UID.

Соответственно можно попытаться в сериализатор передать

КорневойОбъектXDTO.warehouses.warehouse.wh_UID

Зачем ты пихаешь в схему типы из http://v8.1c.ru/8.1/data/core я не понимаю, поэтому ничего сказать не могу.

   metanal

36 — 10.07.12 — 16:59

затем что со складом это частный случай. потом у меня типы которые можно только как структуру прочитать. у меня возникает подозрение что мне вообще сериализация не нужна. а работать просто с фабрикой придется…

   metanal

37 — 10.07.12 — 16:59

спасибо за помощь

   Саша Питерский

38 — 10.07.12 — 17:03

Я предполагаю, что если ты укажешь тип из пространства имен что я указал, платорма сама тебе при чтении подставит нужную ссылку.

Я предполагаю что Сериализация нужна тогда, когда у тебя в xml есть GUID ссылки из ИБ, но при этом в самой схеме нет возможности указать пространство имен 1С.

Если в твоем xml GUID указан вообще не из 1С взятый, то никакую автоматическую сериализацию ты не сделаешь.

  

metanal

39 — 11.07.12 — 16:36

кто знает почему при чтении типа атрибута я всегда получаю AnySimpleType, хотя у меня например явно задан тип

xsi:type = «boolean»

я загружал XSD схему в кодировке windows-1251 в CериализаторXDTO

1С8 выдавала ошибку 

Ошибка при вызове метода контекста (СоздатьФабрикуXDTO)
локФабрикаИзXSD = СоздатьФабрикуXDTO(локИмяФайлаXSD_Ответа);
по причине:
Ошибка разбора XML: – [2,21]
Фатальная ошибка:
Input is not proper UTF-8, indicate encoding !
Bytes: 0xD4 0xE0 0xE9 0xEB

Сохранил XSD файл в кодировке UTF-8  и все заработало.

также эту проблему можно устранить указав в начале XSD файла тег

<code>&lt;?xml version="1.0" encoding="windows-1251"?></code>


  • Метки


    1Cv8, 1С

Перейти к контенту

Коллеги, привет!

Пытаюсь создать фабрику из файла схемы, получаю ошибку

{ВнешняяОбработка.СозданиеXMLДоверенности.Форма.Форма.Форма(10)}: Ошибка при вызове метода контекста (СоздатьФабрикуXDTO)

    МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);

по причине:

Ошибка проверки модели XDTO: xdto-valueType-6.1    (определение анонимного типа)    свойство: КНД    (определение анонимного типа)    свойство: Документ    (определение анонимного типа)    свойство: Файл    пакет: http://www.1c.ru/demos/products2

Атомарная модель содержания не соответствует определению типа значения

Погуглил, вроде как проблема неописанного типа, но здесь он вроде описан.

Падает с ошибкой на месте (если его закоментировать все ок становится):

<xs:attribute name=»КНД» use=»required»>

                            <xs:annotation>

                                <xs:documentation>Код формы по КНД</xs:documentation>

                            </xs:annotation>

                            <xs:simpleType>

                                <xs:restriction base=»КНДТип»>

                                    <xs:enumeration value=»1167005″/>

                                </xs:restriction>

                            </xs:simpleType>

                        </xs:attribute>

ниже в схеме есть описание типа

<xs:simpleType name=»КНДТип»>

        <xs:annotation>

            <xs:documentation>Код из Классификатора налоговой документации</xs:documentation>

        </xs:annotation>

        <xs:restriction base=»xs:string»>

            <xs:length value=»7″/>

            <xs:pattern value=»[0-9]{7}»/>

        </xs:restriction>

    </xs:simpleType>

Так же пробовал описание атрибута сделать как

<xs:attribute name=»КНД» type=»КНДТип» use=»required»>

но все равно ошибка

При входе в базу 1с вы можете увидеть “Ошибка преобразования данных XDTO:

Начало Свойства: errorProcessingSettings

Форма: Элемент

Тип: {http://v8.1c.ru/8.2/managed-application/core}ErrorProcessingSettings по причине

Чаще всего ошибка возникает при определенном типе запуска: это либо через тонкий клиент, либо через линк42, случаи бывают разные. Через браузер такие базы запускаются без ошибок.

Есть простое решение данной проблемы.

Достаточно запустить базу доступным нам способом (где нет ошибки) включить Функции тех. специалиста (Меню — Настройки — Параметры — Режим технического специалиста)

В Функциях для технического специалиста ищем Управление настройками обработки ошибок (Стандартные)

Запускаем

Готово!

Уже более 10 000 компаний работают
в облачной 1С от 42Clouds

— Консультация по 1С Бесплатно!

— Поддержка 24/7 по техническим вопросам: в чате, по телефону, по почте

— Все типовые конфигурации онлайн, доступ через RDP, Remote App, Web

11 янв 2018 20:42 #1

#1
от Юлия

Доброго времени суток. Прошу помощи. Лицензионная Камин 5. Обновляю конфигурацию с 5,0,44,5 на 5,0,45,2. Выдает ошибку
Ошибка проверки модели XDTO: xdto-objectType-2.2 пакет: www.v8.1c.ru/ssl/contactinfo_ru
Базовый тип ‘{www.v8.1c.ru/ssl/contactinfo}НациональныйАдрес’ отсутствует или не определен
.
Что это такое как исправить и можно ли продолжать работать в этой конфигурации?

Тема закрыта.

Сергей аватар

Сергей

Platinum Member

982

1437

11 янв 2018 21:29 #2

#2
от Сергей

Доброго!
Пользователям, которые сталкиваются с подобной ошибкой, следует проверить версию платформы (в данном случае — использовать 8.3.10.2505 и выше).
Кроме того, нужно почистить кэш 1С.


Самарин Сергей, Группа компаний КАМИН

Тема закрыта.


Спасибо сказали: Андрей Ланьшин, Юлия

15 янв 2018 11:43 #3

#3
от Юлия

Сергей, спасибо. Помогла очистка кеша.

Тема закрыта.


Спасибо сказали: Андрей Ланьшин

Просмотров 12к. Опубликовано 24 октября, 2018 Обновлено 24 октября, 2018

Ошибка преобразования данных XDTO: Текст XML содержит недопустимый символ.

На самом деле ошибка преобразования XDTO является не какой-то определенной ошибкой, а является большим семейством ошибок возникающих при работе одного из базовых механизмов платформы 1С. Этот механизм обеспечивает передачу данных между различными подсистемами платформы, при этом данные из внутреннего представления одной подсистемы преобразуются в текстовый формат XML, передаются в другую подсистему, и там  опять преобразуются во внутреннее представление. Ошибка преобразования XDTO говорит, что прямом или обратном преобразовании обнаружено какое-то несоответствие, из-за которого оно не может быть выполнено.

Частные причины ошибки

Существует очень много частных причин ошибки преобразования XDTO.  Сведения  доступные под кнопкой Подробно могут помочь в понимании частной причины, но далеко не всегда.

Прежде чем приступить к диагностике причины ошибки XDTO, следует выполнить стандартные профилактические операции над ИБ: очистить кэш, проверить состояния файла, выполнить тестирование ИБ.

Взаимодействие Клиента и Сервера

При запуске 1С в режиме Тонкий клиент взаимодействие клиента с ИБ происходит с использование преобразования XDTO, и если оно приводит к ошибке, то в тех случаях, когда это возможно, следует воспользоваться режим Толстый клиент.

Сырые и Неоригинальные решения

Если ошибка преобразования XDTO возникает в неоригинальной конфигурации или неоригинальной обработке, то возможно, причина в неоригинальном коде, который не был должным образом оттестирован. Это возможно и в оригинальных решения от 1С после установки сырых обновлений.

В этом случае необходимо отказаться от использования неоригинального или сырого решения и вернуться к предыдущему состоянию кода из архива.

Здравствуйте. помогите разобраться. при выполнении кода [code] возникает ошибка: {Форма.Форма.Форма}: Ошибка при вызове метода контекста (СоздатьФабрикуXDTO)    Фабрика = СоздатьФабрикуXDTO(Пути); по причине: Ошибка проверки модели XDTO: xdto-package-3.3    пакет: Импортируемый пакет типов » не определен поиск ничего дельного пока не дал…

И? Значит не определен тип.

По ходу что-то не нравится в схеме. Попробуй схему импортировать вручную в конфигурацию.

в файле xsd. есть строчка с импортом. там тоже какая то ошибка. щас постараюсь текст достать

«не удалось разрешить импортируемую схему для пространства имен»

содержимое импортируемого файла property.xsd: содержимое главного файла: <xs:schema targetNamespace=»http://**/awms» xmlns:awms=»http://**/awms»           xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns:uo=»http://**/awms/user-objects»

Вроде как с такими конструкциями xs:import namespace 1С не работает :(

а эту ошибку я уже не в 1С прочитал. ее мне visual studio показывает

без импорта действительно заработало. но с импортом тоже хотелось бы разобраться

Почему у тебя первая схема описана как uo:schema, а не xs:schema?

файл не я писал. я только разбираюсь. но мне тоже было бы интересно услышать ответ на этот вопрос

Лично у меня проблем с конструкцией import не возникало. Попробуй поменяй uo на xs и посмотри что получится.

ругается на все типы <uo:

«недопустимый дочерний элемент»

теперь возникла другая проблема: xsd: файл xml: <warehouses>        <warehouse wh_name=»WH1″ wh_UID=»{009e8f41-412c-11dd-8b47-000feaf1b3e0}»>Склад AWMS           при попытке чтения через сериализатор возникает ошибка: {Форма.Форма.Форма}: Ошибка при вызове метода контекста (ПрочитатьXDTO)    Сериализатор.ПрочитатьXDTO(КорневойОбъектXDTO.warehouses.warehouse); по причине: Ошибка преобразования данных XDTO: НачалоСвойства: {    Форма: Элемент    Тип: { по причине: Ошибка преобразования данных XDTO: НачалоСвойства: wh_name    Форма: Атрибут    Тип: { кто знает куда копать?

Что это за xml файл такой без заголовков и определенного namespace? Что вот этой строкой хочется получить? Сериализатор.ПрочитатьXDTO(КорневойОбъектXDTO.warehouses.warehouse);

таблицу значений с 1 строкой. или соответствие.что угодно с типом 1С а не объектXDTO

А где у xml заголовок? Где в xsd описание того, в какой тип 1С должен превратиться wh_UID?

я только выдержки из файлов выложил.сами по себе файлы очень большие

а можно по подробнее про описание типа в xsd?

наверное этого мне и не хватает

Надо начать с того, что проверить, что файл соответствует схеме.

весь файл очень большой. я уверен что что-нибудь да не так. а как все таки привязать тип атрибута к типу 1С?

Загрузить схему в конфигурацию, затем открыть ее на редактирование, выбрать атрибут и выбрать у него тип, соответствующий нужному объекту 1С.

вот что получилось: я правильно понимаю , что мне нужно назначить Тип элемента? из какого пространства имен выбирать тип. 1с core? все варианты которые удалось пробовать не лишают меня ошибки из

Приведи код вызова конструктора, которым ты создаешь тип Сериализатор.

1. Тебе нужно указать тип элемента, то есть сказать например, что в указанном атрибуте хранится значение типа СправочникСсылка.Склады. Если посмотреть список пакетов, то такую информацию можно найти в пакете 2. Если ты меняешь тип в загруженном пакете, то потом либо внеси изменения в свой xsd, либо поменяй свой код создания фабрики на создание из метаданных, а не из файла 3. Я бы еще попробовал в код    КорневойОбъектXDTO = Фабрика.ПрочитатьXML(ЧтениеXML, Неопределено); В качестве второго параметра не указывать неопределено, а либо вообще его пропустить, либо явно указать тип, который ты из файла читаешь.

если не указывать «неопределено» вываливалось с ошибкой. мне не обязательно привязывать к складам. мне бы хотя бы реквизит wh_name указать как строку. пространства имен у меня почему то нет. конфа не типовая

С какой ошибкой? Раз ошибка, значит укажи конкретный тип. Про хотя бы указать как строку не понял. КорневойОбъектXDTO.warehouses.warehouse.__content разве у тебя не является строкой? Указанное пространство имен указывает на твою текущую конфигурацию. Ей все равно, типовая конфа или нет.

на строку вроде больше не ругается: но теперь тип не определяется ) сейчас буду пробывать. свойства __content к сожалению у меня и в помине нет.

и пакет я всегда экспортирую. до этого я хотя бы догадался

для wh_name в xsd проовал указывать все возможные типы из пространства имен . ничего это не изменило <xs:attribute name=»wh_name» use=»required» type=»ns1:**»>

Если я правильно понимаю как должна работать платформа, Сериализатор по GUID вернет тебе ссылку на элемент склада. У тебя GUID содержится в поле wh_UID. Соответственно можно попытаться в сериализатор передать КорневойОбъектXDTO.warehouses.warehouse.wh_UID Зачем ты пихаешь в схему типы из я не понимаю, поэтому ничего сказать не могу.

затем что со складом это частный случай. потом у меня типы которые можно только как структуру прочитать. у меня возникает подозрение что мне вообще сериализация не нужна. а работать просто с фабрикой придется…

Я предполагаю, что если ты укажешь тип из пространства имен что я указал, платорма сама тебе при чтении подставит нужную ссылку. Я предполагаю что Сериализация нужна тогда, когда у тебя в xml есть GUID ссылки из ИБ, но при этом в самой схеме нет возможности указать пространство имен 1С. Если в твоем xml GUID указан вообще не из 1С взятый, то никакую автоматическую сериализацию ты не сделаешь.

кто знает почему при чтении типа атрибута я всегда получаю AnySimpleType, хотя у меня например явно задан тип

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

На чтение 14 мин Просмотров 7 Опубликовано 11 апреля 2023 Обновлено 11 апреля 2023

Содержание

  1. XDTO в 1С
  2. Ошибка при созданни фабрики XDTO на основе xsd
  3. 1С магия XDTO-пакетов на примере интеграций с ГИС ЖКХ
  4. Не создается ФабрикаXDTO на основании 2 схем
  5. Пример заполнения/создания файла XML из XSD схемы, используя XDTO

XDTO в 1С

В этой статье попробую рассказать о механизме XDTO, рассказать постараюсь только суть — без воды.

XDTO (XML Data Transfer Objects) — это разработка фирмы 1С и ни в каком другом языке программирования эту аббревиатуру не встретишь.

Основное назначение этого механизма — обмен данными, как с другой конфигурацией 1С, так и со сторонними приложениями. Кроме этого XDTO используется для описания параметров и возвращаемых значений web-сервисов, а также для произвольной обработки данных.

Основная «полезность» механизма XDTO заключается в том, что он позволяет работать (чтение и запись) с XML-файлом как с объектом 1С — «через точку» и не думать при этом о тегах и атрибутах XML.

Реализован механизм XDTO при помощи объекта конфигурации «Пакет XDTO». Этот объект в действительности является обычной XML-схемой (XSD) т.е. описывает структуру какого-либо XML-документа.

  • превратить XSD-файл в объект «пакет XDTO»;
  • добавить новый «пакет XDTO» и редактировать его так, как нам нужно;
  • превратить «пакет XDTO» в XSD-файл.

Действия с XDTO пакетом

Для успешного импорта XML-схемы (XSD) в XDTO пакет, необходимо наличие в XSD-файле атрибута «targetNamespace» с указанием пространства имен, иначе импортировать схему не удастся.

Не хватает атрибута «targetNamespace»

Пространство имен обычно указывается URL-подобной строкой (хотя на самом деле это может быть любая строка) и служит для того, чтобы избежать путаницы в том случае, если в разных XDTO пакетах у нас имеются объекты с одинаковым названием.

Таким образом понятно, что названия объектов должны быть уникальны в пределах одного пространства имен (по сути в пределах одного XDTO пакета)

Пространство имен в XSD-файле

XSD-файл можно сделать самому — написать руками в блокноте или сделать XDTO пакет прямо в конфигураторе, кроме этого можно воспользоваться какой-нибудь специализированной программой (например Liquid XML Studio) или онлайн сервисом (Google в помощь) которые умеют создавать XSD-файлы из XML. При использовании программ и сервисов нужно быть осторожным, так как по моему опыту результат их работы (XSD-файл) очень часто не подходит для использования в 1С — неправильно указываются типы данных и, как следствие, записать XML-файл при помощи такого XDTO пакета не удастся. В качестве примера приведу два XDTO пакета для одного и того же XML-файла.

Слева тот, что создан руками, справа — программой.

Работа с XDTO в 1С неразрывно связана с объектом «ФабрикаXDTO». Именно этот объект читает и записывает данные из/в XML-файл(а), а также создает все нужные объекты с которыми можно привычно работать «через точку».

Допустим у нас есть файл заказ вот такого вида:

Источник

Ошибка при созданни фабрики XDTO на основе xsd

Здравствуйте. помогите разобраться. при выполнении кода

[code]
Пути = Новый Массив();
Пути.Добавить(ПутьКФайлуСхемы);
Фабрика = СоздатьФабрикуXDTO(Пути);
[/code]

<Форма.Форма.Форма(5)>: Ошибка при вызове метода контекста (СоздатьФабрикуXDTO)
Фабрика = СоздатьФабрикуXDTO(Пути);
по причине:
Ошибка проверки модели XDTO: xdto-package-3.3 пакет: http://**/awms
Импортируемый пакет типов ‘http://**/user-objects’ не определен

поиск ничего дельного пока не дал.

содержимое импортируемого файла property.xsd:

теперь возникла другая проблема:

при попытке чтения через сериализатор возникает ошибка:

(15) Что это за xml файл такой без заголовков и определенного namespace?

Что вот этой строкой хочется получить?
Сериализатор.ПрочитатьXDTO(КорневойОбъектXDTO.warehouses.warehouse);

я правильно понимаю , что мне нужно назначить Тип элемента? из какого пространства имен выбирать тип. 1с core?

все варианты которые удалось пробовать не лишают меня ошибки из (15)

1. Тебе нужно указать тип элемента, то есть сказать например, что в указанном атрибуте хранится значение типа СправочникСсылка.Склады.
Если посмотреть список пакетов, то такую информацию можно найти в пакете
http://v8.1c.ru/8.1/data/enterprise/current-config

2. Если ты меняешь тип в загруженном пакете, то потом либо внеси изменения в свой xsd, либо поменяй свой код создания фабрики на создание из метаданных, а не из файла

В качестве второго параметра не указывать неопределено, а либо вообще его пропустить, либо явно указать тип, который ты из файла читаешь.

если не указывать «неопределено» вываливалось с ошибкой.

мне не обязательно привязывать к складам. мне бы хотя бы реквизит wh_name указать как строку.

(30) С какой ошибкой? Раз ошибка, значит укажи конкретный тип.

Про хотя бы указать как строку не понял.
КорневойОбъектXDTO.warehouses.warehouse.__content разве у тебя не является строкой?

Указанное пространство имен указывает на твою текущую конфигурацию. Ей все равно, типовая конфа или нет.

на строку вроде больше не ругается:

свойства __content к сожалению у меня и в помине нет.

для wh_name в xsd проовал указывать все возможные типы из пространства имен http://v8.1c.ru/8.1/data/core.

Если я правильно понимаю как должна работать платформа, Сериализатор по GUID вернет тебе ссылку на элемент склада.

У тебя GUID содержится в поле wh_UID.
Соответственно можно попытаться в сериализатор передать
КорневойОбъектXDTO.warehouses.warehouse.wh_UID

Зачем ты пихаешь в схему типы из http://v8.1c.ru/8.1/data/core я не понимаю, поэтому ничего сказать не могу.

Я предполагаю, что если ты укажешь тип из пространства имен что я указал, платорма сама тебе при чтении подставит нужную ссылку.
Я предполагаю что Сериализация нужна тогда, когда у тебя в xml есть GUID ссылки из ИБ, но при этом в самой схеме нет возможности указать пространство имен 1С.

Если в твоем xml GUID указан вообще не из 1С взятый, то никакую автоматическую сериализацию ты не сделаешь.

кто знает почему при чтении типа атрибута я всегда получаю AnySimpleType, хотя у меня например явно задан тип

Источник

1С магия XDTO-пакетов на примере интеграций с ГИС ЖКХ

Есть очень много статей о том, как работать с XSL/XSD из 1С, но все они в стиле: возьмем нашу XSD схему (простую и удбоную) или наш web-сервис и смотрите, как все легко экспортировать или импортировать. А что делать, если нам дали пачку XSD-схем со сложным взаимосвязями и изменять мы них не можем, а работать и поддерживать актуальность схем надо?

Сразу скажу, вопросы шифрования/подписи по ГОСТУ при работе с ГИС ЖКХ за рамками этой статьи и на хабре уже освещались. Хотя без подписей запросы выполнить не удастся.


Начнем с простого — скачаем пакет форматов по интеграционному взаимодействию с ГИС ЖКХ, импортируем все xsd схемы из пакета интеграций, наведем порядок переименуем все как нам удобно. В итоге получим как показано на картинке:

Ну а теперь приступим к магии. Попробуем запросить данные из справочника организаций по ОРГН. Это подсистема organizations-registry-common метод exportOrgRegist.

В hcs-organizations-registry-common-service.wsdl указано:

Ну приступим, откроем нужные нам пакеты XDTO. Оказывается, нужные сущности являются не типами, а свойствами, как с этим работать в документации на XDTO в статьях, которые я находил, не описано, поэтому воспользуемся урокам магии:

  • Создадим объекты из свойств
  • Создадим объекты из внутренних типов свойств или тип объектов
  • Создадим объекты из Типов значений

Начнем с тела exportOrgRegistryRequest.

Напишем функцию для сбора XML-запроса:

Ответ от серверов ГИС ЖКХ (СИТ-1):

Как мы видим, ответ напрямую десериализовать не получится, потому что нет такого типа в предложенных xsd схемах. Нам надо как-то пропустить часть тэгов и обработать только область ответа. На эту тему я тоже не нашел информации, но методом проб и ошибок приходим к кусочку магий:

В итоге работать можно с очень сложными xsd схемами через стандартные инструменты платформы. В целом 1С контролируют типизацию и заполнения, бывает чересчур излишне, особенно когда внутри свойства пакета используется базовый тип другого пакета, но в любом случае тип нужно привести к локальному из-за другого пространства URI. Удобно работать с десериализоваными данными, так как там всю работу на себя берет платформа. Но проверки происходят на этапе выполнения, а при написания кода платформа 1С не предоставляет никаких подсказок и проходится пользоваться сторонними утилитами, и даже при выполнении большая часть элементов находится в состоянии «Неопределено» и даже тип или его свойство можно увидеть только в спецификации.

Источник

Не создается ФабрикаXDTO на основании 2 схем

Есть такая площадка для госзакупок «Березка». Для автоматизации взаимодействия они предлагают присылать им в запросе XML, сформированный по 2 схемам (https://agregatoreat.ru/api/info-documents/?id=88): eatObjectTypes.xsd и eatObjects.xsd.

Схемы = Новый Массив;
Схемы.Добавить(«d:BerezkaSkhema_EAT_1.11.0.1eatObjectTypes.xsd»);
Схемы.Добавить(«d:BerezkaSkhema_EAT_1.11.0.1eatObjects.xsd»);
МояФабрика = СоздатьФабрикуXDTO(Схемы);

<ВнешняяОбработка.РаботаХМЛ.Форма.Форма.Форма(7)>: Ошибка при вызове метода контекста (СоздатьФабрикуXDTO)
МояФабрика = СоздатьФабрикуXDTO(Схемы);
по причине:
Ошибка проверки модели XDTO: xdto-objectType-3.9.2 (определение анонимного типа) свойство: requestOfferSet пакет: http://agregatoreat.ru/eat/object-types/
Глобальное свойство ‘Version’ отсутствует или не определено
<ВнешняяОбработка.РаботаХМЛ.Форма.Форма.Форма(7)>: Ошибка при вызове метода контекста (СоздатьФабрикуXDTO)
МояФабрика = СоздатьФабрикуXDTO(Схемы);
по причине:
Ошибка проверки модели XDTO: xdto-objectType-3.9.2 (определение анонимного типа) свойство: requestOfferSet пакет: http://agregatoreat.ru/eat/object-types/
Глобальное свойство ‘Version’ отсутствует или не определено

При проверке схемы, импортированной в конфигурацию из файла eatObjectTypes.xsd, выдаются ошибки типа:

Ошибка проверки модели XDTO: xdto-objectType-3.9.2 (определение анонимного типа) свойство: requestOfferSet пакет: http://agregatoreat.ru/eat/object-types/
Глобальное свойство ‘Version’ отсутствует или не определено
Ошибка проверки модели XDTO: xdto-package-4.4 пакет: http://agregatoreat.ru/eat/object-types/
Тип глобального свойства ‘requestOfferSet’ не найден в пакете типов ‘http://agregatoreat.ru/eat/object-types/’ и его зависимостях

и т.д.
При проверке схемы из файла eatObjects.xsd ошибок нет.

Причем чтение XML-файлов из примеров (https://agregatoreat.ru/api/info-documents/?id=91) по этим схемам проходит штатно: ошибок не возникает, объекты и свойства читаются.

Помогите разобраться, что я делаю не так и что не так с этими схемами?

Источник

Пример заполнения/создания файла XML из XSD схемы, используя XDTO

Все будет сухо, без лирики и т.п.

Итак. Мне принесли задание. Подружить 1С с внешним сервисом по приему отчетности в виде xml файла.

Сторонний сервис имеет свой API по приему файлов, на выходе выдает некий код «батч», по которому я смогу вызвать еще одну функцию и получить по этому батчу, всю развернутую информацию по ошибкам.

Файл схема xsd небольшая, но типов данных много, на основе этой схемы полностью сформированный XML файл занимает что-то около 200Мб.

Дали ссылку на сайт, где можно узнать все остальное. Показывать ссылку не имеет смысла, т.к. доступ только после авторизации.

В итоге я имел на руках некий файл с расширением «xsd».

На тот момент я даже понятия не имел, что это и с чем и как его едят.

Дали какие-то пароли, логины, ссылку, куда все это выкладывать, и дали срок 3 недели.

Очень помог Инфостарт (не без этого, конечно, – огромное спасибо).

Для начала ниже материал, которым я пользовался, пока не завершил этот мини проект, и поэтому вот ссылки вам в помощь, которые могут понадобиться в дальнейшем, я думаю, это «маст-хэйв» для тех, кто хочет обучиться правилам XDTO:

//infostart.ru/public/98019/ — похоже на «XDTO это просто», но сыроват

    Есть файл с правилами, ниже показана картинка в компактном виде, весь xsd файл можно увидеть во вложении.

Рис.1

Скажу, что на момент, когда я получил данный файл, я мог кое-как создавать типы XDTO. Читал статью «XDTO это просто» (все три части, конечно, не всё вкурил, как без этого).
И в итоге умел примерно такое:

Рис.2

(вырезка из другого кода)

То есть я мог создать тип «объектXDTO, если этот тип был расположен в дереве импортированной схемы в ветке «Типы объектов».Но на рисунке 1 выше видно, что все важные данные создаются только через ветку «свойства».

Рис.3

К примеру, на рис.3 видно, что у свойства «FirstName» один параметр «Name» является типом, ссылка на которую уводит в ветку «Типы объектов», а уже таааам указывается, что это за тип и что он в себе еще дополнительно содержит.

Рис.4

Как быть?
Что делать?
Как их прочитать?
Как на их основе мне создать тип «ОбъектXDTO», ведь через создать запись можно только если записываемый/создаваемый тип является типом «ОбъектXDTO»?
Что только не приходилось делать… я же умел создавать и записывать значения только если требуемые расположены в ветке «Типы объектов».

Даже дошел до того, что попробовал изменить схему.
Всё, что находилось в ветке «Свойства», я начал переносить в ветку «Типы объектов», начал создавать «туеву хучу» неправильных вещей, в итоге пришлось бросить весь гемор, пойти перекурить, и искать новые способы.
Попробовал все тестировать в «Liquid XML» — не получилось.
Потом попробовал все в «Visual Studio» — тоже …
Очень много звонил разработчикам этих схем, где им, наверное, думалось – «Вот чудик, он что, не знает про SOAP-ы, это же допотопный механизм обмена, странные он вопросы задает, хмм…» (кстати им тоже спасибо. открыли глаза 1С-нику).

В итоге.
В начале скажу, что у меня по условиям сбора данных есть некий первичный справочник список, в котором есть много реквизитов, которые необходимы для этого файла.
Данные собираются, фильтруются сортируются и в итоге я получаю готовую Таблицу значений.
Далее прохожу циклом эту таблицу и заполняю соответствующие реквизиты.

Итак, как я начал считывать XSD и создавать XML файлы.

Вначале считал пакет
Рис.5

Получил пакет в таком виде.
Рис.6

Далее мне нужно найти и спозиционироваться на свойстве «Records»

Вот она в дереве
Рис.7

Как это делается?
Скажу, что это как магия.
Пишем:
Рис.7

И мы получаем то значение, которое потом можем превратить в тип «ОбъектXDTO»

Рис.8

Получаем на выходе готовый нам нужный тип и делаем с ним все, что нужно.
К примеру, я должен пройтись циклом по реквизитам полученного объекта.

Рис.9

Просьба смотреть «не в воду», а в суть.

И т.д. далее, пока не получите что хотели.

Для получения каких-либо реквизитов свойства в схеме xsd пользуюсь такой конструкцией кода,

Но скажу, что видел и другие способы, тут, как говорится, дело ваше.

Результат рисунков с 7 по 12

Выглядит вот так в готовом файле:

И вот что я заметил (ну местные гуру, может, и знают давным-давно).

Это как бы и правила, и пометка.

Рассмотрим свойство «ContractCode»

Если это свойство имеет форму как «Элемент», то тогда код выглядит таким:

Т.е. я срази пишу значение в параметр, просто «= равно» и пошел.

Если свойство имеет форму как «Элемент», но он записан через знак «+»

То его код выглядит немного иначе

Т.е. нужно сначала создать через фабрику этот тип, получить его подчиненные подтипы и уже им присваивать значения из ваших данных.

И в итоге получается вот что.

Если в схеме это свойство имеет форму «элемент»

То в готовом файле запишется такая запись:

Т.е. все будет записано внутри т.н. «тегов».

Далее если вы имеете в схеме такую связку значений и ее свойства:

Т.е. у свойства «FundingType» есть подчиненный элемент «id», где его форма равна «Атрибут»

В этом случае код при написании НЕ изменится:

Замечу, что этот код похож на рис.16

Воот, а результат будет немножко другой:

Т.е. значение запишется сразу в сам «тег».

Есть такое свойство, как «Gender»

Он в свою очередь имеет ссылку на другой тип:

Тут говорится, что данный тип значения в целом равен типу «string», но он вариант у него «атомарный», т.е. имеет, скажем, «перечисление». И его перечисления, это

Теперь дилемма, как мне его получить и как его записать.

Вот ответ (сам искал полдня):

Советую почитать про «Фасеты». Там все просто.

Собираем файл этими строками:

Тут лишь в конце стоит сказать один момент.

Принимающая сторона не передала значение «xmlns», пришлось ее искать и вписывать в начало файла, вот пример:

Источник

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста создатькаталог установлен безопасный режим
  • Ошибка при вызове метода контекста создатькаталог ошибка создания каталога
  • Ошибка при вызове метода контекста создатьдокумент
  • Ошибка при вызове метода контекста прочитать каталог не обнаружен
  • Ошибка при вызове метода контекста создатьwsпрокси сервис не найден