При интеграции 1С со сторонними системами через веб-сервисы разработчики часто сталкиваются с ситуацией, когда тип данных получен из определения WS-ссылки, но создать соответствующий объект 1С не удается. В процессе выполнения кода возникает ошибка: Несоответствие типов XDTO: Тип не найден. Тип принадлежит пакету, отсутствующему в фабрике типов XDTO.
Рассмотрим причинно-следственные связи этой проблемы, разберем правильный подход к работе с фабриками XDTO и выясним, как грамотно опубликовать собственный Web-сервис в 1С, использующий внешнюю структуру данных.
Проанализируем ошибочный фрагмент кода, с которым сталкивается разработчик:
// Ошибочный подход
Тип_TransactionHeader = WSСсылки.Employee.ПолучитьWSОпределения().ФабрикаXDTO.Пакеты.Получить("http://wa.dms.webservice/EmployeeGetResponse").Получить("TransactionHeader");
ff = Новый ФабрикаXDTO;
Эл_Tr = ff.Создать(Тип_TransactionHeader);
Ошибка заключается в попытке создать объект типа через конструкцию Новый ФабрикаXDTO. Экземпляр Новый ФабрикаXDTO создает пустую, локальную фабрику типов, которая не знает о типах и пакетах, описанных во внешнем WSDL-файле сторонней системы.
Когда вы получаете тип данных из WSСсылки.Employee.ПолучитьWSОпределения().ФабрикаXDTO, этот тип привязан к конкретной фабрике XDTO, сформированной при считывании WSDL-схемы. Передача этого типа в новую пустую фабрику приводит к ошибке несоответствия.
Для исправления ошибки следует использовать ту же фабрику XDTO, из которой был извлечен тип данных:
// Корректный подход
ФабрикаСервиса = WSСсылки.Employee.ПолучитьWSОпределения().ФабрикаXDTO;
Тип_TransactionHeader = ФабрикаСервиса.Пакеты.Получить("http://wa.dms.webservice/EmployeeGetResponse").Получить("TransactionHeader");
Эл_Tr = ФабрикаСервиса.Создать(Тип_TransactionHeader);
Таким образом, объект создается в контексте той фабрики, которая содержит полное описание необходимых XDTO-пакетов и типов.
Разберем другую распространенную задачу: когда 1С должна выступать в роли поставщика веб-сервиса (сервера), а структура ответа строго регламентирована внешней системой.
Если при тестировании вызова сервиса в сторонних утилитах (например, SoapUI) возникает ошибка вида Ошибка вызова операции сервиса: {}::<unknownOperation>(), это свидетельствует о несоответствии пространств имен (Target Namespace), имен операций или об отсутствии зафиксированной XSD-схемы в метаданных.
Динамические фабрики XDTO, созданные в коде 1С во время выполнения программы, не участвуют в формировании WSDL-описания публичного веб-сервиса. Поле Пакеты XDTO у свойства Web-сервиса может оставаться пустым только в случае работы с примитивными типами данных (строка, число, булево). Если сервис должен принимать или возвращать сложные типы, их необходимо внедрить в дереве метаданных конфигурации.
Выполним по шагам настройку собственного Web-сервиса со сторонней XDTO-структурой:
.xsd) или WSDL-описание сторонней системы и сохраните их на диске.ФабрикаXDTO, которая после публикации автоматически включает все пакеты из метаданных:
// Формирование объекта в модуле Web-сервиса
ТипОбъекта = ФабрикаXDTO.Тип("http://wa.dms.webservice/EmployeeGetResponse", "TransactionHeader");
РезультатXDTO = ФабрикаXDTO.Создать(ТипОбъекта);
Если конфигурация находится на типовой поддержке и добавлять новые XDTO-пакеты в основное дерево метаданных нежелательно, рассмотрим альтернативные варианты решения задачи:
string. Вы можете сформировать любой XML с помощью объекта ЗаписьXML или локальной фабрики XDTO, а затем передать итоговый текст клиенту. Сторонняя система в этом случае считывает тег как строку и самостоятельно разбирает XML-содержимое.HTTP-сервис. HTTP-сервисы не требуют настройки XDTO-пакетов в метаданных и дают разработчику полный контроль над телом запроса/ответа в произвольном формате (XML, JSON).