Фабрикаxdto прочитатьxml ошибка

Грабли метода Прочитать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</Сумма>
</РасчетФБ>
</Документы>
...

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

  

SmokeAce

06.12.13 — 20:10

Всем привет! Гуру Web-сервисов помогите разобраться!

Итак у нас есть Web-сервис с описанием по ссылке: http://omnicomm.gisko.org:8000/AnalyticalServer/ws?wsdl

Обработка тут: https://www.dropbox.com/s/5iunw4topibragm/test.epf

При попытке авторизоваться в системе (signIn(login, password)) вываливается с ошибкой:

{ВнешняяОбработка.плЗагрузкаДанныхИзOmnicommAutocheck.МодульОбъекта(54)}: Ошибка при вызове метода контекста (signIn)

    Ответ = Прокси.signIn(Пользователь, Пароль);

по причине:

Ошибка вызова операции сервиса:  {http://omnicomm.ru/analyticalserver}:AnalyticalServer:signIn()

по причине:

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

Чтение объекта типа: {http://omnicomm.ru/analyticalserver}authResponseEntry — [1,215]

Проверка дополнительного свойства:

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

    имя: status

по причине:

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

Чтение объекта типа: {http://omnicomm.ru/analyticalserver}authResponseEntry — [1,215]

Проверка дополнительного свойства:

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

    имя: status

по причине:

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

Структура объекта не соответствует типу: {http://omnicomm.ru/analyticalserver}authResponseEntry

При этом, с помощью утилиты WireShark отлавливаю файл ответа на преобразование которого и ругается 1С-ка. Сам файл ответа:

https://www.dropbox.com/s/iiq0a66xy948cxg/signResponse.xml

Можно ли как то заставить 1С-ку понимать данный файл?

  

SmokeAce

1 — 07.12.13 — 00:27

up

  

Armando

3 — 07.12.13 — 02:38

В wsdl написано, что authResponseEntry содержит 2 элемента: dateTimeEnd и sessionId, а в ответ приходит там есть еще один элемент status. Вот от него крышу и сносит.

  

SmokeAce

4 — 07.12.13 — 02:48

там также написано что базовым типом для него является baseResponseEntry у которого еще 2 свойства …

Если кстати создать ОбъектXDTO таким образом:

    

ТипОтвета = Фабрика.Пакеты.Получить(«http://omnicomm.ru/analyticalserver»).Получить(«authResponseEntry»;);

Ответ = Фабрика.Создать(ТипОтвета);

то создается объект у которого 4 свойства …

  

SmokeAce

5 — 07.12.13 — 02:50

упс …

некорректно запостил код:

ТипОтвета = Фабрика.Пакеты.Получить(«http://omnicomm.ru/analyticalserver»).Получить(«authResponseEntry»;);

Ответ = Фабрика.Создать(ТипОтвета);

  

SmokeAce

6 — 07.12.13 — 02:52

(5) и опять «;» лишняя, отредактировать сообщение можно ?

  

SmokeAce

7 — 07.12.13 — 02:55

То что у неё крышу сносит от свойства status это понятно … Как все таки победить ?

  

Armando

8 — 07.12.13 — 03:21

Про baseResponseEntry просмотрел.

Может ему тогда error не хватает?

Я тож не очень силен в этом

  

SmokeAce

9 — 07.12.13 — 03:38

error возвращается в случае передачи некорректных данных логина или пароля … если изменить на неправильный ошибка вывалится уже на error.

  

Armando

10 — 07.12.13 — 04:06

А почему возвращается signInResponse?

1С думает, что authResponseEntry придет.

  

SmokeAce

11 — 07.12.13 — 12:44

Возможно … по wsdl signInResponse содержит элемент return с типом authResponseEntry.

Пробую создать XDTO пакет нужной структуры в дереве конфигурации, но при обновлении конфигуратор просто закрывается.

  

Armando

12 — 07.12.13 — 14:05

Что это даст?

  

Armando

13 — 07.12.13 — 14:17

из wsdl вытащи <xs:schema></xs:schema>, сохрани в xsd. Потом в дереве конфигурации XDTO-пакеты ПКМ «Импорт XML-схемы…». И там редактируй.

  

SmokeAce

14 — 07.12.13 — 15:20

(13) Импортировать схему получилось, но как не редактируй не изменяй типы, свойства скормить не удалось … Чувствую придется через httpСоединение реализовывать, но так не хочется(((

  

Armando

15 — 07.12.13 — 15:32

Нельзя сделать, чтоб веб-сервис отдавал authResponseEntry?

  

Armando

16 — 07.12.13 — 15:37

Тут либо криво реализован веб-сервис, либо 1С криво с ним работает. Одно из трех как говорится.

  

SmokeAce

17 — 07.12.13 — 15:38

Мне нет … Веб сервис написан на Java разработчиками программного обеспечения Omnicomm Autocheck по контролю топлива. Я бы с радостью указал им на ошибку если бы она была на их стороне, только вот как бы это точнее узнать))

  

SmokeAce

18 — 07.12.13 — 15:49

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

  

Armando

19 — 07.12.13 — 16:06

ТипОтвета = Определения.Сервисы.Получить(«http://omnicomm.ru/analyticalserver»;, «AnalyticalServer»).ТочкиПодключения.Получить(«AnalyticalServerPort»).Интерфейс.Операции.Получить(«signIn»).ВозвращаемоеЗначение.Тип;

однозначно говорит о том, что в ответе должен быть authResponseEntry

  

SmokeAce

20 — 07.12.13 — 17:35

(19) И не поспоришь … Буду обращаться в саппорт разработчика веб сервиса. Как что прояснится отпишусь.

Armando, спасибо!

  

Serginio1

21 — 09.12.13 — 10:16

Скорее всего signInResponse я вляется потомком authResponseEntry ( базовый тип)

Что в общем нормально. Для anyType подходят все типы.

v8: вебСервис

  

Serginio1

22 — 09.12.13 — 10:56

Нашел как использовать конфиг файл с dll

public object СоздатьКлиентаWCFConfigFile(string ИмяФайла, object TChannel, string endpointConfigurationName, object endpointAddress)

        {

            ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();

            fileMap.ExeConfigFilename = ИмяФайла;

            Configuration newConfiguration = ConfigurationManager.OpenMappedExeConfiguration(

                fileMap,

                ConfigurationUserLevel.None);

            

            Type ТипКанала=ТипДляСоздатьОбъект(TChannel);

            Type type= typeof(ConfigurationChannelFactory<>);

            Type constructed = type.MakeGenericType(ТипКанала);

            dynamic factory1 = System.Activator.CreateInstance(constructed,

                endpointConfigurationName,

                newConfiguration,

                AutoWrap.ПолучитьРеальныйОбъект(endpointAddress)

                );

          //      new ConfigurationChannelFactory<ICalculatorChannel>(

          //          «endpoint1»,

          //          newConfiguration,

          //          new EndpointAddress(«http://localhost:8000/servicemodelsamples/service»;));

            return AutoWrap.ОбернутьОбъект(factory1.CreateChannel());

        
        }

  

Serginio1

23 — 09.12.13 — 10:57

И вызов из 1с

Процедура ВызовСервисаИспользуяConfigFileНажатие(Элемент)

    // Вставить содержимое обработчика.

        врап=новый COMОбъект(«NetObjectToIDispatch45»);

        

    //Сборка=врап.загрузитьСборку(«d:MyProgramsTestNestNet45NestNet45binDebugNestNet45.dll»);

    Сборка=врап.загрузитьСборку(ИмяФайлаСборки);

    // Можно получить тип и используя сборку, что будет правильным

    //Сборка GetType(«NestNet45.ServiceReference1.MorpherSoapClient»);

    //Но в данном примере используется поиск в загруженных сборках

    TChannel=Сборка.GetType(«NestNet45.ServiceReference1.MorpherSoap»);

    ConfigFile=ИмяФайлаСборки+».config»;

    endpointConfigurationName=»MorpherSoap»;

    endpointAddress=Неопределено;

    Клиент=врап.СоздатьКлиентаWCFConfigFile(ConfigFile,TChannel,endpointConfigurationName,endpointAddress);

        

         // Вызываю метод и вывожу результат

    рез = Клиент.GetForms(«Ваяся Пупкин»);

    

    Для каждого стр  Из рез Цикл

        сообщить(стр)

    КонецЦикла;

КонецПроцедуры

  

Serginio1

24 — 09.12.13 — 11:04

Прошу прощения не в ту ветку кинул

  

sapphire

25 — 09.12.13 — 11:09

можно использовать mule в качестве ws-proxy

  

SmokeAce

26 — 10.12.13 — 01:14

Обратился в саппорт, сказали что исправят ошибку … В действительности возвращаемое значение не соответствовало описанию web-сервиса в wsdl, потому 1С-ка и ругалась. Всем спасибо за участие, можно закрывать …

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

Грабли метода Прочитать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С:Контрагент и почему-то перестали заполняться реквизиты контрагентов по ИНН, выдает ошибку:

В журнале регистрации написано:

{ОбщийМодуль.ДанныеЕдиныхГосРеестров.Модуль(31)}: Ошибка при вызове метода контекста (getCorporationRequisitesByINN)
Ответ = Прокси.getCorporationRequisitesByINN(ВходныеПараметры);
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://ws.orgregister.company1c.com/}:RequisitesWebServiceEndpointImpl7Service:getCorporationRequisitesByINN()
по причине:
При вызове веб-сервиса произошла ошибка. Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://company1c.com/orgregister/corporation}СвОКВЭД — [1,2762]Проверка дополнительного свойства:
форма: Атрибут
имя: ПрВерсОКВЭД
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://company1c.com/orgregister/corporation}СвОКВЭД — [1,2762]Проверка дополнительного свойства:
форма: Атрибут
имя: ПрВерсОКВЭД
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://company1c.com/orgregister/corporation}СвОКВЭД

Или

ОбщийМодуль.ДанныеЕдиныхГосРеестров.Модуль(181)}: Ошибка при вызове метода контекста (getCorporationRequisitesByNameAndAddress)
Ответ = Прокси.getCorporationRequisitesByNameAndAddress(ВходныеПараметры);
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://ws.orgregister.company1c.com/}:RequisitesWebServiceEndpointImpl7Service:getCorporationRequisitesByNameAndAddress()
по причине:
При вызове веб-сервиса произошла ошибка. Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://company1c.com/orgregister/corporation}СвОКВЭД — [1,17598] Проверка дополнительного свойства:
форма: Атрибут
имя: ПрВерсОКВЭД
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://company1c.com/orgregister/corporation}СвОКВЭД — [1,17598] Проверка дополнительного свойства:
форма: Атрибут
имя: ПрВерсОКВЭД
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://company1c.com/orgregister/corporation}СвОКВЭД

Вот что нужно сделать:

Нужно открыть Главное меню (1), нажать «Все функции» (2) — рис.1

Рис.1

Если у вас нет пункта «Все функции», надо открыть Главное меню (3), нажать «Сервис» (4), Парамерты (5) — рис.2

Рис.2

В открывшемся окне поставить галочку «Отображать команду «Все функции» (6), ОК (7) — рис.3

Рис.3

В открывшемся окне нажимаем на «+» Регистры сведений (8) — рис.4

Рис.4

Ищем регистр сведений «Кэш программных интерфейсов» (9) — Открыть (10) — рис.5

Рис.5

В открывшемся списке необходимо найти и удалить запись со значением в колонке Идентификатор https://api.orgregister.1c.ru/orgregister/v7?wsdl (11) — правой кнопкой — Удалить (12) — рис.6

Рис.6

После этого нужно выйти из программы и войти снова.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Существует два способа добавить XDTO-пакет в конфигурацию:

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

    Рис.1 XDTO пакеты

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

Чтобы загрузить данные из присланной нам схемы, необходимо в режиме конфигуратор открыть раздел «Общие» и «XDTO-пакеты». Через контекстное меню выбрать пункт «Импорт XML-схемы…», выбрать файл и подтвердить пространство имен, взятое из файла. После этого необходимо обновить конфигурацию, и предварительные настройки сделаны.

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

Это происходит следующими командами:


ФайлXSD = Новый Массив();
ФайлXSD.Добавить("D:1strust.xsd");
ФабрикаXDTOИзФайла = СоздатьФабрикуXDTO(ФайлXSD);
Номенклатура = ФабрикаXDTOИзФайла.Тип("http://www.1c.ru/products", "Номенклатура");

Экспорт и импорт файла

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

  1. Заполняем URI-пространство имен в свойствах XDTO пакета. Среди разработчиков 1С принято заполнять этот реквизит адресом страницы, заполненной описанием тех данных, с которыми происходит работа. Это помогает в работе, но не всегда возможно. В иных случаях заполняют произвольным текстом;
  2. Задаем тип объекта и его свойства, используя контекстное меню. Задаем имя этих параметров и для свойств определяем тип, выбирая его из предложенных платформой.

Рис.2 Параметры пакета

Рис.2 Параметры пакета

Следующим этапом будет написание процедуры для создания файла XML по описанной выше схеме. Код достаточно прост, поскольку создан XDTO-пакет, а у элемента всего 2 свойства – «Наименование» и «Артикул». Обращаться к конкретной схеме позволяет объект платформы «ФабрикаXDTO». Сама процедура состоит из:

  1. Определение схемы будущей XML;
    
    ТипФабрики = ФабрикаXDTO.Тип("http://www.primerXML.ru/Nomen","Номенклатура");
    

  2. Заполнение свойств номенклатуры;
    
    Номенклатура = ФабрикаXDTO.Создать(ТипФабрики);
    Номенклатура.Наименование = "Тест XML";
    Номенклатура.Артикул = "2";
    

  3. Создание нового XML файла.
    
    ИмяФайла = "D:1struct1.xml";
    МойXML = Новый ЗаписьXML;
    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
    МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML);
    МойXML.ЗаписатьОбъявлениеXML();
    ФабрикаXDTO.ЗаписатьXML(МойXML, номенклатура);
    МойXML.Закрыть();
    

Чтение XML-файлов с помощью конкретной фабрики XDTO по уже созданному в конфигурации пакету ничуть не сложнее. Алгоритм похож по структуре и отличается только операциями взаимодействия с XML-файлами. В данном случае нам нужно воспользоваться объектом платформы «ЧтениеXML» и прочитать содержимое в переменную. На выходе у нее будет тип «ОбъектXDTO», и вы сможете обращаться ко всем ее свойствам через точку.


ТипФабрики = ФабрикаXDTO.Тип("http://www.primerXML.ru/Nomen","Номенклатура");
 
ИмяФайла = "D:1struct1.xml";
МойXML = Новый ЧтениеXML;
МойXML.ОткрытьФайл(ИмяФайла);
номенклатура = ФабрикаXDTO.ПрочитатьXML(МойXML, ТипФабрики);
МойXML.Закрыть();

Теперь попробуем прочитать файл, схемы которого нет в нашей конфигурации. Для этого экспортируем XDTO-пакет в файл формата xsd и удалим схему из конфигурации. После этого нам придется объяснить платформе, откуда ей брать схему читаемой XML-кодом, продемонстрированным ранее. Однако в простейших случаях 1С самостоятельно может распознать все свойства.

Рис.3 Экспорт XDTO-пакета

Рис.3 Экспорт XDTO-пакета

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

Исправление ошибок

Одной из достаточно распространенных ошибок, связанных с работой с XDTO-пакетами, является «Ошибка преобразования данных XDTO». Ее суть заключается в том, что платформа не может разобрать данный ей XML-файл по заданной схеме. При получении подобной ошибки при импорте данных, необходимо проверить формат файлов – возможно, присутствуют незакрытые теги.

Зачастую проблема с ошибками преобразования данных возникает и по другим причинам:

  • Ошибки в обновлении платформы или конфигурации;
  • Обмен между базами разных версий;
  • Недочеты в алгоритме приема данных;
  • Проблемы с временной памятью конкретного компьютера.

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

Рис.4 Ошибка преобразования данных

Рис.4 Ошибка преобразования данных

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

Рис.5 Ошибка проверки данных

Рис.5 Ошибка проверки данных

Более сложная для анализа проблема, если при обмене информацией 1С выдает ошибку о несоответствии типов XDTO. В этом случае придется проверять все данные, находить ошибки и их причины. В некоторых случаях ошибки могут быть в коде, иногда – в данных информационной базы. Чтобы это понять, необходимо иметь доступ к базам причастным к обмену и четко понимать всю суть происходящего экспорта и импорта.

Рис.6 Несоответствие типов XDTO

Рис.6 Несоответствие типов XDTO

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

   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 не может прочитать файл, что-то ему не нравится. Вопрос — как понять, что именно не нравится? Файл довольно большой. Указаний на конкретное место в файле в описании ошибки нет. Как найти, что именно не нравится сериализатору в файле?

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 можно передавать сложные типы

17 янв 2019 13:51 #1

#1
от Константин

При попытке индексации кладр выбранных регионов выходит ошибка:

{Обработка.Адреса.Форма.ОбновлениеКЛАДР.Форма(1368)}: Ошибка при вызове метода контекста (ПрочитатьXML)
ТекущаяЗапись = ФабрикаXDTO.ПрочитатьXML(Чтение, ФайлЗагрузки.ТипXDTOЗаписи);
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {www.v8.1c.ru/ssl/AddressSystem}Object
Проверка дополнительного свойства:
форма: Атрибут
имя: PARENTGUID
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {www.v8.1c.ru/ssl/AddressSystem}Object

Просьба помочь решить проблему.
КАМИН:Расчет заработной платы. Версия 3.0. Базовая версия (3.0.97.3) Платформа 8.3.9.2170

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

21 янв 2019 11:57 #2

#2
от Виктория

Добрый день!
У меня тоже проблема с обновлением ФИАС.
Скачиваю с сайта fias.nalog.ru/Updates.aspx папку Base.7z, распаковываю, прописываю путь… при закрузке ошибка — В каталоге ФИАС присутствуют файлы не для всех выбранных регионов.Проверьте наличие необходимых файлов или снимите выбор с ненужного региона.
Действия все те же что и раньше…(((

Программа КАМИН 3.0.97.4 (платформа 8.3.12.1714)

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

22 янв 2019 08:35 #3

#3
от Анна Терентьева

Добрый день. На днях тоже долго возилась с ФИАС, сто раз скачивала во всех форматах, ошибка была как у вас. Если правильно помню, то не надо было распаковывать, а путь указать на архив.

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


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

22 янв 2019 08:47 #4

#4
от Юлия Невдах

Добрый день! Вы скачали необходимую область, сохранили на жёстком диске (скаченный файл ФИАС не рекомендуется размещать на рабочем столе, а так же попробуйте сохранить его по пути типа: папка в папке), например, C:UsersJuliaФИАС_Калуж.обл. Далее в программе, в обработке «Обновление адресов» прописываем этот путь к каталогу, флажок «индексировать по выбранным регионам» — отмечаем регион, нажимаем Переиндексировать.


Невдах Юлия, Группа компаний КАМИН

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


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

22 янв 2019 12:16 #5

#5
от Виктория

Спасибо! У меня получилось! Сохранила папку в папке и процесс пошел)))

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


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

14 фев 2019 22:38 #6

#6
от Виктория

Добрый вечер!
Я снова с той же проблемой…Вроде бы в прошлый раз у меня получилось обновить ФИАС при помощи «Сохранила папку в папке и процесс пошел)))», но наверно мне показалось(((
У меня 4 камина, и везде одна и та же ошибка

{Обработка.Адреса.Форма.ОбновлениеКЛАДР.Форма(1368)}: Ошибка при вызове метода контекста (ПрочитатьXML)
ТекущаяЗапись = ФабрикаXDTO.ПрочитатьXML(Чтение, ФайлЗагрузки.ТипXDTOЗаписи);
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {www.v8.1c.ru/ssl/AddressSystem}Object
Проверка дополнительного свойства:
форма: Атрибут
имя: PARENTGUID
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {www.v8.1c.ru/ssl/AddressSystem}Object

Платформа 8.3.12.1714, обновление 3.0.9.75, Windows 10, пробовала на Windows 8, та же ошибка.
Оправляла базы своему сис.админу, который обслуживает 1С. У нее на Windows XP прошло все отлично. Назад присланные базы, с подгруженным ФИАС у меня все равно не работают.
БОЛЬШАЯ просьба, помогите разобраться……..

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

15 фев 2019 08:05 #7

#7
от Николай Малышевский

Виктория

У нее на Windows XP прошло все отлично.

А у неё какая платформа?
Дело в том, что на платформах 1С 8.3.12.* частенько возникают различные проблемы именно с XDTO. Стоит попробовать обновить платформу на 8.3.13.1690.

И ещё. Почистите локальный кэш метаданных.
Это звучит непонятно, а выполняется просто: нужно открыть папку C:Пользователи<ИмяПользователя>AppDataLocal1C1Cv8, и там удалить все папки с именами вроде «edc638ed-d712-455a-a833-3597b310cb5f». Только прежде чем делать это, надо закрыть все программы на 1С.
Кстати, эта папка — скрытая, но в неё легко попасть, если в Проводнике набрать %LOCALAPPDATA%1C1Cv8

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


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

15 фев 2019 11:46 #8

#8
от Виктория

Добрый день!
Почистила локальный кеш метаданных – результата нет. Обновила платформу на 8.13.13.1690 – результата нет. Ошибка та же!!!
У сис.админ на Windows XP с платформой 8.3.10…. прошло все отлично, сегодня она попробовала на Windows 7 с платформой 8.3.12…. тоже все отлично.
У меня на 3-х компьютерах с Windows 10 результата нет + на 1-м ком. Windows 8 тоже без результата(((

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

15 фев 2019 12:41 #9

#9
от Ирина

Поддерживаю! Тоже так и не стыкуется с ФИАС 1С. Беру из ФИАС ФНС (распакованный ОГРОМНЫЙ) и вытаскиваю оттуда необходимый регион. Пока в КАМИН 3-3.5-4 только так…..

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

15 фев 2019 12:45 #10

#10
от AWG

Поддерживаю! Тоже так и не стыкуется с ФИАС 1С. Беру из ФИАС ФНС (распакованный ОГРОМНЫЙ) и вытаскиваю оттуда необходимый регион. Пока в КАМИН 3-3.5-4 только так…..

В 3.0, 3.5, 4.0 на текущий момент не поддерживается работа с адресным классификатором с сайта 1С с поддержкой адресов по муниципальному делению, скачайте с сайта 1С адресный классификатор без поддержки адресов по муниципальному делению.


Гржегоржевский Андрей, ГК «КАМИН»

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


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

Понравилась статья? Поделить с друзьями:
  • Учителя унижают нашу самооценку лексическая ошибка
  • Фабия ошибка р0341
  • Учителю надо было еще многое объяснить ошибка
  • Фабия ошибка 16555
  • Учительница указала мне мои ошибки