Ошибка при вызове метода контекста прочитатьxml ошибка преобразования данных xdto

Грабли метода ПрочитатьXML() объекта ФабрикаXDTO

Что таит в себе окно редактирования XDTO-пакета

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


ФайлXML = Новый ЧтениеXML;
ФайлXML.УстановитьСтроку(СтрокаXML);

Пока ФайлXML.Прочитать() Цикл

Если ФайлXML.ЛокальноеИмя = "Message" И ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ФайлXML);
КонецЕсли;

КонецЦикла;

ФайлXML.Закрыть();

Первый параметр метода является обязательным, в который передается объект чтения XML. Второй параметр метода необязательный, в который передается тип элемента данных XDTO. Если тип не указан, то будет сделана попытка определить тип данных по текущему состоянию объекта ЧтениеXML.

Допустим, создадим тип в пакете XDTO  с пространством имен http://lk.1cps.ru, который будет описывать некую структуру XML:

1. Тип «Документы»

Кусок структуры XML:
...
<Документы>
<РасчетФБ>
<Культура>12122</Культура>
<ПосевнаяПлощадь>23</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>276</Сумма>
</РасчетФБ>
<РасчетФБ>
<Культура>232323</Культура>
<ПосевнаяПлощадь>34</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>408</Сумма>
</РасчетФБ>
</Документы>
...

Прочитаем эту структуру:

Пока ФайлXML.Прочитать() Цикл
Если ФайлXML.ЛокальноеИмя = "Документы" И ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ФайлXML, ФабрикаXDTO.Тип("http://lk.1cps.ru", "ДокументыТип"));
Прервать;
КонецЕсли;
КонецЦикла;

Приведенный код будет завершать ошибкой чтения XML, примерно такой:

Ошибка при вызове метода контекста (ПрочитатьXML)
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ФайлXML, ФабрикаXDTO.Тип("http://lk.1cps.ru", "ДокументыТип"));
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://lk.1cps.ru}ДокументыТип - [126,19]
Проверка дополнительного свойства:
форма: Элемент
имя: {http://lk.1cps.ru}Культура
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://lk.1cps.ru}ДокументыТип

ПРОШЛО 4 ЧАСА :(

Так как выше приведенный кусок структуры XML не относится к пространству имен http://lk.1cps.ru, то и метод ПрочитатьXML() выкидывал ошибку, несмотря на то, что тип правильно описывает структуру XML! Поэтому XML должен выглядеть так:
...
<Документы xmlns="http://lk.1cps.ru">
<РасчетФБ>
<Культура>12122</Культура>
<ПосевнаяПлощадь>23</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>276</Сумма>
</РасчетФБ>
<РасчетФБ>
<Культура>232323</Культура>
<ПосевнаяПлощадь>34</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>408</Сумма>
</РасчетФБ>
</Документы>
...

Вот такие пироги.

При входе в базу 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

   Nyarlathotep

03.07.20 — 16:15

Добрый день!

Читаю файл xml вот так

чтение = новый чтениеXML;

чтение.открытьФайл(путьКФайлу);

результат = сериализаторXDTO.прочитатьXML(чтение);

в результате получаю такую ошибку:

{ОбщийМодуль.WS_Привилегированный.Модуль(293)}: Ошибка при вызове метода контекста (ПрочитатьXML): Ошибка преобразования данных XDTO:

НачалоСвойства: {http://v8.1c.ru/8.1/data/core}Structure    Форма: Элемент    Тип: {http://v8.1c.ru/8.1/data/core}Structure: Ошибка преобразования данных XDTO:

НачалоСвойства: Value    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType: Ошибка преобразования данных XDTO:

НачалоСвойства: ValueType    Форма: Элемент    Тип: {http://v8.1c.ru/8.1/data/core}TypeDescription: Ошибка преобразования данных XDTO:

Значение: xs:string    Тип: {http://www.w3.org/2001/XMLSchema}QName: Ошибка отображения типов:

Отображение типа ‘{http://www.w3.org/2001/XMLSchema}QName’ в тип ‘РасширенноеИмяXML’

как я понимаю, объект сериализаторXDTO не может прочитать файл, что-то ему не нравится. Вопрос — как понять, что именно не нравится? Файл довольно большой. Указаний на конкретное место в файле в описании ошибки нет. Как найти, что именно не нравится сериализатору в файле?

Доброе утро. При разборе XML файла фабрикой XDTO выпадает ошибка {Форма.Форма.Форма}: Ошибка при вызове метода контекста (ПрочитатьXML) Объект=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML); по причине: Ошибка преобразования данных XDTO: НачалоСвойства: IsNullValue Форма: Атрибут Тип: {… »» По идее, без указания типа объекта, должен получиться не сериализованный объект XDTO. Даже если описать все типы объектов, все равно выпадает эта ошибка. Падает на строчке <PatientID IsNullValue=»true» xsi:nil=»true» xmlns:xsi=»… »»» />. Разработчики системы источника говорят, что тег IsNullValue=»true» нужен для установки значения в значение Null, если оставить просто xsi:nil=»true» xmlns:xsi=»… »»», то значение будет просто проигнорировано. Но именно из-за этого тега у нас не работает загрузка данных в 1с из ESB шины данных. Вопрос, можно ли как-то обработать данный тег (в идеале) или хотя бы проигнорировать? Конфигурация пустышка, но с пакетами. Файл на котором все и падает

Читал как текст, так хмл от пфр тоже не разбиралась 1с кой

Попробуй загружаться не через глобальную фабрику а через Фабрика=СоздатьФабрику(ПутьК_XSD) Ну и многого 1С не понимает

Все это заменяет одна строка Фабрика = СоздатьФабрикуXDTO(ПутьК_XSD);

Это уже все делал. и из набора схем и в конфу пакеты грузил и даже через  СоздатьФабрикуXDTO. Толку ноль. И разбирал. Через создать фабрику тоже. Сейчас распарсил через Документ DOM. Но просто не понимаю. Неужели 1с не понимает сложные типы данных и директивы импорта. Все есть в конфе, а не работает. Ни на 8.2 ни на 8.3.

</xs:complexType> Не понимает сию конструкцию 1с.

Попробуй через специально для этого и делал

И вот хороший генератор классов

Спасибо, но немного не то. Схема есть, предоставлена разработчиком. Взаимодействие с веб сервисом не нужно. Разобрал XML с помощью DOM. DOM не понимает специальные атрибуты. Но просто не понятно почему XML не разбирается с помощью XDTO. То ли недоработка платформы, то ли не соответствие данной схемы стандартам принятым в 1с.

Так я тебе и показываю как десериализовать из XML в объект Net. 1C много чего не понимает.

То есть ты с помощью wscfblue описываешь классы Net. Например public Object ПолучитьЗаказИзФайла(string ИмяФайла)         {             XmlSerializer serializer = new XmlSerializer(typeof(EdiSoftDocumentOrder.DocumentOrder));             using ( FileStream fs = new FileStream(ИмяФайла, FileMode.Open))         }             return new AutoWrap(res);                           }

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

Тэги: 1С 8

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

OverDozero, тут не создается фабрика
Этим кодом создается объектXDTO

Добавлено через 1 минуту
И для этого используется глобальная фабрика

Глобальный контекст (Global context)
ФабрикаXDTO (XDTOFactory)
Использование:
Только чтение.
Описание:
Тип: ФабрикаXDTO.
Фабрика XDTO, содержащая все пакеты XDTO, имеющиеся в конфигурации, а также предопределенные пакеты (например, пакет типов XML схемы).

Добавлено через 2 минуты
OverDozero, Т.е. в глобальной фабрике есть описание типов которое считывается вот отсюда

Цитата
Сообщение от OverDozero
Посмотреть сообщение

ПолучитьМакет(«СхемаXML»).ПолучитьТекст()

Добавлено через 1 минуту
OverDozero, еще раз медленно! Глобальная фабрика для каждой конфигурации СВОЯ!

Добавлено через 7 минут
Yulunga, да тут все просто.

1. Есть модель (xsd) в нем описано как должен выглядеть xml (входящий или исходящий это не важно)

2. Есть фабрика которая знает(или может знать) много много таких xsd моделей, при помощи фабрики мы можем объектно создать нужный нам тип из любой его xsd модели и записать в xml (который будет соответствовать этой модели)

или прочитать xml по определенной схеме:
1. Убедится в момент чтения что xml соответствует схеме
2. Объектно читать xml

Добавлено через 4 минуты
Yulunga, если простыми словами и для 1С-ника
в xsd ты можешь описать структуру какого-нибудь справочника (например банки) описать типы реквизитов и т.д. и выгрузить в xml этот справочник

в другой базе 1С (где нет справочника банки) смогут прочитать твой xml и создать абстрактный справочник банки и работать с ним объектно (как будто он есть в конфигурации)

Добавлено через 6 минут
в обычном XML можно передать только примитивные типы
с помощью xsd можно передавать сложные типы

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