Ошибка проверки данных xdto структура объекта не соответствует типу 1с
Исходя из личного практического опыта поиска решения этой проблемы в Интернет, я выяснил, что у пользователей 1С:Предприятие 8.3 такая проблема случается не редко.
Общая причина ошибки
На самом деле ошибка преобразования XDTO является не какой-то определенной ошибкой, а является большим семейством ошибок возникающих при работе одного из базовых механизмов платформы 1С. Этот механизм обеспечивает передачу данных между различными подсистемами платформы, при этом данные из внутреннего представления одной подсистемы преобразуются в текстовый формат XML, передаются в другую подсистему, и там проходят обратное преобразование во внутреннее представление. Ошибка преобразования XDTO говорит, что прямом или обратном преобразовании обнаружено какое-то несоответствие, из-за которого оно не может быть выполнено.
Частные причины ошибки
Существует очень много частных причин ошибки преобразования XDTO. Сведения доступные под кнопкой Подробно могут помочь в понимании частной причины, но далеко не всегда.
Прежде чем приступить к диагностике причины ошибки XDTO, следует выполнить стандартные профилактические операции над ИБ: очистить кэш, проверить состояния файла, выполнить тестирование ИБ.
Взаимодействие Клиента и Сервера
При запуске 1С в режиме Тонкий клиент взаимодействие клиента с ИБ происходит с использование преобразования XDTO, и если оно приводит к ошибке, то в тех случаях, когда это возможно, следует воспользоваться режим Толстый клиент.
Сырые и Неоригинальные решения
Если ошибка преобразования XDTO возникает в неоригинальной конфигурации или неоригинальной обработке, то возможно, причина в неоригинальном коде, который не был должным образом оттестирован. Это возможно и в оригинальных решения от 1С после установки сырых обновлений.
В этом случае необходимо отказаться от использования неоригинального или сырого решения и вернуться к предыдущему состоянию кода из архива.
Ошибка преобразования XDTO при загрузке данных из файлов
Если ошибка XDTO возникает при загрузке данных из файла, то причину ошибки можно обнаружить в самом файле. В моем случае, я выполнял загрузку данных данных из файла XML в новую ИБ, версия которой была несколько новее, чем версия ИБ источника. Во время загрузки возникала ошибка:
Гарантируем стабильный обмен без ошибок между программами 1С. Гарантии фиксируем в договоре.
Одним из самых популярных форматов данных, используемых практически в любой компании, является XML (расширяемый язык разметки). Разработчики 1С создали специальный объект XDTO для удобства своих клиентов и простого взаимодействия с файлами XML, поэтому программисту 1С важно работать с этими объектами платформы, так как обмен данными через XML встречается постоянно.
Преимущества механизма XDTO
Этот функционал создавался как удобный инструмент обмена данными между конфигурациями и другими приложениями. Также этот механизм используют для работы с web-сервисами и для обработки произвольных данных. Большое преимущество XDTO перед другими способами – в нем есть возможность обращаться к файлу XML, как к объекту 1С. То есть все реквизиты можно будет получить, описывая структуру через точку, не задумываясь о скобках, тегах и атрибутах.
Взаимодействие с файлами XML происходит по заранее установленным правилам, описанным в объекте структуры конфигурации – XDTO – пакеты в 1С 8.3. Суть этих элементов структуры в том, что они представляют собой схемы, по которым будут распознаваться данные из XML-файлов. В типовых конфигурациях уже присутствуют подобные объекты, но при работе с конкретными файлами понадобятся другие схемы.
Существует два способа добавить XDTO-пакет в конфигурацию:
-
Собственноручно создать. Этот вариант подойдет при самостоятельной работе с XML определенного формата. Зная, какие данные будут подаваться на вход для импорта с использованием XDTO, можно заранее создать в конфигурации нужный объект. Этот вариант хорош, если обмен данными налажен и никаких изменений не планируется;
Чтобы загрузить данные из присланной нам схемы, необходимо в режиме конфигуратор открыть раздел «Общие» и «XDTO-пакеты». Через контекстное меню выбрать пункт «Импорт XML-схемы…», выбрать файл и подтвердить пространство имен, взятое из файла. После этого необходимо обновить конфигурацию, и предварительные настройки сделаны.
Но на самом деле в последнем случае нам необязательно создавать XDTO-пакеты в конфигурации 1С 8.3. Существует возможность только использовать XSD-схему, присланную нам из отдельного файла, не внося изменения в структуру базы 1С. Для этого нужно воспользоваться кодом, объясняющим платформе 1С, какой тип объекта с какими параметрами будет загружаться.
Это происходит следующими командами:
Экспорт и импорт файла
После того как мы разобрались с принципами использования пакетов XDTO, нужно посмотреть на механику работы с файлами XML. Лучше всего это будет видно на простом примере, чтобы понять основы. Добавим новый элемент в раздел XDTO-пакетов и настроим его следующим образом:
- Заполняем URI-пространство имен в свойствах XDTO пакета. Среди разработчиков 1С принято заполнять этот реквизит адресом страницы, заполненной описанием тех данных, с которыми происходит работа. Это помогает в работе, но не всегда возможно. В иных случаях заполняют произвольным текстом;
- Задаем тип объекта и его свойства, используя контекстное меню. Задаем имя этих параметров и для свойств определяем тип, выбирая его из предложенных платформой.
Следующим этапом будет написание процедуры для создания файла XML по описанной выше схеме. Код достаточно прост, поскольку создан XDTO-пакет, а у элемента всего 2 свойства – «Наименование» и «Артикул». Обращаться к конкретной схеме позволяет объект платформы «ФабрикаXDTO». Сама процедура состоит из:
- Определение схемы будущей XML;
- Заполнение свойств номенклатуры;
- Создание нового XML файла.
Чтение XML-файлов с помощью конкретной фабрики XDTO по уже созданному в конфигурации пакету ничуть не сложнее. Алгоритм похож по структуре и отличается только операциями взаимодействия с XML-файлами. В данном случае нам нужно воспользоваться объектом платформы «ЧтениеXML» и прочитать содержимое в переменную. На выходе у нее будет тип «ОбъектXDTO», и вы сможете обращаться ко всем ее свойствам через точку.
Теперь попробуем прочитать файл, схемы которого нет в нашей конфигурации. Для этого экспортируем XDTO-пакет в файл формата xsd и удалим схему из конфигурации. После этого нам придется объяснить платформе, откуда ей брать схему читаемой XML-кодом, продемонстрированным ранее. Однако в простейших случаях 1С самостоятельно может распознать все свойства.
Лучше все-таки не рассчитывать на понятливость платформы 1С, а использовать точную схему XML. Многие специалисты используют сторонний софт для их создания, но для этого необходим достаточно большой опыт и уровень подготовки. Работа с пакетами XDTO требует внимания и соблюдения точного соответствия файлов заданной схеме, чтобы минимизировать возможные ошибки.
Исправление ошибок
Одной из достаточно распространенных ошибок, связанных с работой с XDTO-пакетами, является «Ошибка преобразования данных XDTO». Ее суть заключается в том, что платформа не может разобрать данный ей XML-файл по заданной схеме. При получении подобной ошибки при импорте данных, необходимо проверить формат файлов – возможно, присутствуют незакрытые теги.
Зачастую проблема с ошибками преобразования данных возникает и по другим причинам:
- Ошибки в обновлении платформы или конфигурации;
- Обмен между базами разных версий;
- Недочеты в алгоритме приема данных;
- Проблемы с временной памятью конкретного компьютера.
Более сложная для анализа проблема, если при обмене информацией 1С выдает ошибку о несоответствии типов XDTO. В этом случае придется проверять все данные, находить ошибки и их причины. В некоторых случаях ошибки могут быть в коде, иногда – в данных информационной базы. Чтобы это понять, необходимо иметь доступ к базам причастным к обмену и четко понимать всю суть происходящего экспорта и импорта.
На первый взгляд работа с XDTO достаточно сложна, поэтому на первое время рекомендуется добавлять XDTO-пакеты в 1С для большего порядка и учета. Конечно, все нюансы изучить сразу невозможно, но в процессе работы вы будете продолжать учиться. Но с уверенной теоретической базой намного удобнее начинать разбираться в этом вопросе.
Здравствуйте! Надеюсь на вашу помощь, бьюсь безрезультатно уже который день, как в стену уперся ( Ситуация такая. Есть сайт, предоставляющий веб сервис рассылки смс, адрес WSDL пакета таков: Создаю в конфигурации объект "WS-Ссылка", все создается без проблем. Необходимо реализовать работу с этим сервисом из 1С. Написал простенькую обработочку, которая обращается к функции GetCurrentCredit этого веб сервиса. После запуска 1С думает и выкидывает вот такую вот ошибку: <Обработка.Обработка2.Форма.Форма>: Ошибка при вызове метода контекста (GetCurrentCredit): Ошибка вызова операции сервиса: < Результат = Прокси.GetCurrentCredit(Логин); по причине: Ошибка вызова операции сервиса: < по причине: Неизвестная ошибка. Ошибка преобразования данных XDTO: Чтение объекта типа: < - [1,179] Проверка дополнительного свойства: форма: Элемент имя: amount по причине: Ошибка преобразования данных XDTO: Чтение объекта типа: < - [1,179] Проверка дополнительного свойства: форма: Элемент имя: amount по причине: Ошибка проверки данных XDTO: Структура объекта не соответствует типу: < Причем ошибка не зависит от того, присваиваю ли я возвращаемый результат чему-то (в данном случае переменной Результат) или нет. Не зависит и от того, какие логин и пароль передаю. Возникает впечатление, что 1С просто не может обработать ответ с сервера. Что-то можно сделать? Может я что-то делаю не так? Очень прошу помощи, не первый день уже бьюсь с этой дрянью :(Обработка.Обработка2.Форма.Форма>
ошибка в веб-сервисе у тебя скорее всего. проверь, какой тип возвращает и как он описан в пакете.
Это просто я делал много попыток, чтобы заработало, забыл убрать. ДА и объявление результата тоже не нужно, но это не влияет на результат. Просто пытался уже подходить со всех сторон.
через прокси работаешь? у меня было похожее, прокси мешал.
А как обойти проблему? Интернет в офисе раздается через прокси, это да. Пробовал дома, дома прокси нет (интернет раздается через рутер), возникла та же проблема. Может тогда дело не в прокси?
функция имеет параметры? может их больше или меньше? тип параметра - строка?
Функция GetCurrentCredit имеет один параметр auth. Это структура со строчными параметрами username и password. Система не ругается на недопустимый параметр, она почему то ругается на возвращаемое значение этой функции, которое имеет тип result.
при выполнении функции сервиса, может возникать внутренняя ошибка. тут сервис в натуре пощупать надо, а доступа к нему нету
У них похоже сервак лежал. Уже есть доступ. Работал с этим сервисом через сайт - все работает. Через 1с - не хочет.
Попробуй ответный xml сохранить в файл. И открыть его в фабрике
А как сохранить ответ в файл? Ваш код, я так понимаю, читает уже сохраненный XML.
Нужна помощь, не знаю в какую сторону копать. Если это глюк 1С (несостыковка со сторонним сервисом), как реализовать работу с этим веб сервисом сторонними средствами? Главное чтобы работало все через 1С
Скорее глюк этого вебсервиса, проверь получится ли у тебя вебсервисом аэрофлота работать.
С вебсервисом могу работать через сторонние средства, например такие как Аэрофлот проверить не могу, надо просить админа добавить мне его в разрешенный список. Даже если он заработает, что это мне даст? Может можно как то сохранить ответный XML в файл, и вручную его обрабатыватть? Или вручную формировать XML и отправлять на сервер. Только как это реализовать? Вопрос критичен, к сожалению, в пятницу уже надо сдать рабочую версию, а решения все нет :(
В браузере по ссылке ничего не вижу. А должен был получить wsdl. Не работает вебсервис?
Упс.. нагнал - ff все показал, хром меня ввел в заблуждение.
хм.. а у меня выдает это: Ошибка проверки данных XDTO: Структура объекта не соответствует типу: < Ошибка преобразования данных XDTO: Чтение объекта типа: < - [1,217] Проверка дополнительного свойства: форма: Элемент имя: comment Неизвестная ошибка. Ошибка преобразования данных XDTO: Чтение объекта типа: < - [1,217] Проверка дополнительного свойства: форма: Элемент имя: comment Ошибка вызова операции сервиса: < Ошибка вызова операции сервиса: < Ошибка при вызове метода контекста (GetCurrentCredit): Ошибка вызова операции сервиса: <
В приведенном примере ответа отсутствует элемент recipient. По схеме он должен быть хотя бы один.
Ну так не на него же ругается. Да и зачем в итоге серверу возвращать пустую инфу, если он просто возвращает то, что у него попросили?
Да, не на него. А то что в это именно то что возвращает сервер по твоему запросу? А тут логику искать не надо, надо просто чтобы все соответствовало схеме.
Тот сырой XML текст, что я привел, это ответ сервера на функцию GetCurrentCredit. Получено с помощью сайта, что я приводил выше.
>>Может можно как то сохранить ответный XML в файл, и вручную его обрабатыватть? Или вручную формировать XML и отправлять на сервер. Только как это реализовать? Вопрос критичен, к сожалению, в пятницу уже надо сдать рабочую версию, а решения все нет :(
У меня была проблема с отладкой Вэб сервиса при передаче структуры. Если объявить через LocflHOST на сервере, то структура проходит. Если с другого компютера через глобальный адрес то метод ложится с ошибкой преобразования во втором байте чего то там.
Сделай на тоже Net или нативе Delphi или С++ Оле Объект который будет обращаться к серверу
много букв. как я курил веб сервисы и их дружбу с 1С. шаг первый - проверить сервис на одыкватность - использую soapUI 3.0 бесплатное. Удобное шаг второй - при условии что выполнен первый - начинаем курить 1С. импортируем в 1С сервис (это раз). Даже на этом этапе можно увидеть дружит 1С или нет с этим сервисом. Хоть и стандарт обще принятый, но то что курят одни системы 1С на отказ не курит. домой приду попробую курнуть.
кстати тож не могу получить тот самы wdsl =/ Proxy Encountered Error Connection Timeout: Could not contact the remote server. Possible causes include mistyped URL, transient network problems, overloaded remote server, and misconfigured proxy server. хотя может и рабочая прокся пьет. так что с дому гляну
Ошибка при вызове метода контекста (GetCurrentCredit): Ошибка вызова операции сервиса: < Есть нормальное описание работы сервиса и методов, а не только вашего представления ? код для затравки (wdsl принят в конфу как ws-ссылка "WS") Функция СоздатьПрокси(знач ИмяWS = "WS",
Читайте также: