Несоответствие типов xdto 1с что это
Использование объектов XDTO в web-сервисах
Механизм XDTO представляет собой гибкое средство моделирования данных, которое широко используется в технологии web-сервисов 1С:Предприятия. В этой статье мы рассмотрим, как с использованием XDTO можно задавать различные типы данных и как их применять в web-сервисах.
Способность сериализоваться/десериализоваться в формат переноса данных позволяет объекту переноса данных мигрировать с одного компьютера на другой. Между разными компьютерами и даже разными процессами одного компьютера нет единого адресного пространства и нет возможности передавать объект по ссылке. Поэтому сериализация является единственным способом взаимодействия между этими процессами. Сериализация позволяет представить объект в некоторой промежуточной форме, например в виде xml, передать эту промежуточную форму заданному процессу заданного компьютера и обратно десериализовать объект в вид, пригодный для программного использования.
Свойство замкнутости позволяет объекту переноса данных обеспечить необходимый уровень целостности, т.к. если бы какая-либо его часть ссылалась на другие объекты, то после переноса и десериализации эта ссылка стала бы недействительной, из чего следовало бы, что и сам объект переноса данных был бы непригоден для дальнейшего использования. Свойство замкнутости не запрещает иметь ссылки внутри объекта переноса данных, т.к. объект сериализуется/десериализуется как единой целое и механизм сериализации обеспечивает правильное преобразование ссылок внутри объекта переноса данных.
Механизм XDTO позволяет определять объекты переноса данных, которые могут образовывать строгую иерархию и могут сериализоваться в XML. Эти свойства позволили использовать объекты XDTO в качестве параметров и возвращаемых значений операций web-сервисов.
Все типы данных XDTO подразделяются на типы-значения и типы-объекты. Типы-значения позволяют определять простые типы, например, строки, числа, даты, булевы значения и т.д. Типы-объекты позволяют определять сложные типы, такие как структуры и массивы. Рассмотрим более подробно, как задавать с помощью XDTO некоторые характерные типы.
Строки
Для создания строкового значения нужно:
Строка при передаче представляется в виде текста xml тега:
Следует учесть, что строки конвертируются в UTF-8 при сериализации.
Целые числа
Для создания целочисленного значения нужно:
Число при передаче представляется в виде текста xml тега:
Дробные числа
Для создания дробного значения нужно:
Число при передаче представляется в виде текста xml тега:
Для создания значения даты нужно:
Число при передаче представляется в виде текста xml тега:
Лексическое представление даты задается в формате:
Временная зона может быть не указана.
Лексическое представление времени задается в формате:
Временная зона может быть не указана.
Лексическое представление даты вместе со временем задается в формате:
Структуры
Структуры моделируются типами-объектами. Перед тем как использовать структуру необходимо создать пакет XDTO, описываающий тип-объект структуры (например, через редактор XDTO). Тип-объект может содержать свойства, котрые соответствуют элементам структуры. Каждое свойство характеризуется уникальным именем и типом. Тип свойства может быть как типом-значением, так и типом-объектом.
Например, для создания структуры Номенклатура из демо-конфигурации Web-Сервисы нужно:
Структура при передаче представляется в виде xml структуры:
Массивы
Например, для создания массива номенклатур, определенного в свойстве Элементы структуры НоменклатураГруппа из демо-конфигурации Web-Сервисы нужно:
Массив при передаче представлятся в виде xml структуры:
Рассмотрим, как создавать типы и элементы в случае клиента web-сервиса и в случае сервера web-сервиса.
Каждая реализация веб-сервиса (серверная часть web-сервиса) может использовать глобальную XDTO фабрику (получаемую через свойство глобального контекста ФабрикаXDTO) для создания объектов и значений web-сервиса.
Веб-сервис. Ошибка. Несоответствие типов XDTO: Свойство является списковым
Всем доброго дня!
Вопрос для гуру веб-сервисов.
Имеется следующий код:
Определения = Новый WSОпределения(«https://apitest.merlion.com/re/mlservice3?wsdl", Пользователь, Пароль);
ВебСервис = Новый WSПрокси(Определения, «https://apitest.merlion.com/re/mlservice3", «MLService», «MLPort»);
ВебСервис.Пользователь = Пользователь;
ВебСервис.Пароль = Пароль;
Результат = ВебСервис.getCatalog(«All»);
При отрабатывании выдает ошибку:
<ВнешняяОбработка.MERLION_API_20.Форма.Форма.Форма(432)>: Ошибка при вызове метода контекста (getCatalog)
Результат = ВебСервис.getCatalog(«All»);
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса:
по причине:
При вызове веб-сервиса произошла ошибка. Неизвестная ошибка. Несоответствие типов XDTO:
Свойство является списковым
по причине:
Несоответствие типов XDTO:
Свойство является списковым
Вопрос: чего ему надо? и как пофиксить?
Заранее премного благодарен за конструктивные ответы!
по причине:
-2147221005(0x800401F3): Invalid class string
не подскажете, чего ему надо?
(6) Надеюсь в 1С хватит здравого смысла выпустить новую версию Native API, что бы можно было возвращать и передавать в параметрах метода объекты ВК, как это можно делать с COM.
Не ну конечно можно написать метод. Например здесь http://catalog.mista.ru/public/466196/
Можно конечно написать универсальный метод для получения данных свойств или полей получив типы через рефлексию и используя люмбды. Например
Ошибка преобразования данных XDTO в 1С
Ошибка преобразования данных XDTO: Текст XML содержит недопустимый символ.
На самом деле ошибка преобразования XDTO является не какой-то определенной ошибкой, а является большим семейством ошибок возникающих при работе одного из базовых механизмов платформы 1С. Этот механизм обеспечивает передачу данных между различными подсистемами платформы, при этом данные из внутреннего представления одной подсистемы преобразуются в текстовый формат XML, передаются в другую подсистему, и там опять преобразуются во внутреннее представление. Ошибка преобразования XDTO говорит, что прямом или обратном преобразовании обнаружено какое-то несоответствие, из-за которого оно не может быть выполнено.
Частные причины ошибки
Существует очень много частных причин ошибки преобразования XDTO. Сведения доступные под кнопкой Подробно могут помочь в понимании частной причины, но далеко не всегда.
Прежде чем приступить к диагностике причины ошибки XDTO, следует выполнить стандартные профилактические операции над ИБ: очистить кэш, проверить состояния файла, выполнить тестирование ИБ.
Взаимодействие Клиента и Сервера
При запуске 1С в режиме Тонкий клиент взаимодействие клиента с ИБ происходит с использование преобразования XDTO, и если оно приводит к ошибке, то в тех случаях, когда это возможно, следует воспользоваться режим Толстый клиент.
Сырые и Неоригинальные решения
Если ошибка преобразования XDTO возникает в неоригинальной конфигурации или неоригинальной обработке, то возможно, причина в неоригинальном коде, который не был должным образом оттестирован. Это возможно и в оригинальных решения от 1С после установки сырых обновлений.
В этом случае необходимо отказаться от использования неоригинального или сырого решения и вернуться к предыдущему состоянию кода из архива.
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С не предоставляет никаких подсказок и проходится пользоваться сторонними утилитами, и даже при выполнении большая часть элементов находится в состоянии «Неопределено» и даже тип или его свойство можно увидеть только в спецификации.
После обновления Бухгалтерии предприятия 3.0 возникает ошибка «Ошибка преобразования данных XDTO:»
Вчера обновлял бухгалтерские базы, в частности 2 базы Бухгалтерия предприятия 3.0.
Базы стандартные, без изменений.
Обновление происходило на версию 3.0.34.13, платформа 8.3.4.437, базы серверные (Microsoft SQL Server 2008 R2).
После обновления все было нормально, сам запускал базу, пользователи не жаловались.
Но на следующий день, сегодня, у всех пользователей этих баз при попытке запуска в режиме 1С:Предприятие возникает ошибка:
Детальное описание ошибки:
<ОбщийМодуль.СтандартныеПодсистемыКлиентПовтИсп.Модуль(56)>: Ошибка при вызове метода контекста
(ПараметрыРаботыКлиентаПриЗапуске)
ПараметрыКлиента = СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиентаПриЗапуске(Параметры);
по причине:
Ошибка при вызове серверного метода.
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: <http://v8.1c.ru/8.2/managed-application/modules>cli Форма: Элемент Тип:
<http://v8.1c.ru/8.1/data/core>FixedStructure
При выводе ошибки возможно либо «Завершить работу», либо «Перезапустить».
Если пользователь щелкает «Перезапустить», то со второго раза ему удается войти в программу, где он нормально работает.
Дополнительные сложности возникли у пользователей, который включили себе интерфейс Такси, у них при нажатии «Перезапустить» не получалось входить в 1с, появлялась еще одна ошибка.
Чистка кэша не помогает.
Способы решения:
1) Для быстрого временного решения проблемы можно в настройках базы в списке баз 1с установить основной режим запуска «Толстый клиент» вместо «Выбирать автоматически» (пользователю с включенный интерфейсом Такси это не помогло).
2) Включить возможность изменения конфигурации базы и добавить пустую строку в любой общий модуль (взято здесь: http://forum-mista.pro/topic.php?id=713977).
Второй способ решил проблему полностью.