Как исправить ошибку «Тип принадлежит пакету, отсутствующему в фабрике типов XDTO» при работе с WS-ссылками в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 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-пакетов и типов.

Публикация собственного Web-сервиса с внешней структурой XDTO

Разберем другую распространенную задачу: когда 1С должна выступать в роли поставщика веб-сервиса (сервера), а структура ответа строго регламентирована внешней системой.

Если при тестировании вызова сервиса в сторонних утилитах (например, SoapUI) возникает ошибка вида Ошибка вызова операции сервиса: {}::<unknownOperation>(), это свидетельствует о несоответствии пространств имен (Target Namespace), имен операций или об отсутствии зафиксированной XSD-схемы в метаданных.

Динамические фабрики XDTO, созданные в коде 1С во время выполнения программы, не участвуют в формировании WSDL-описания публичного веб-сервиса. Поле Пакеты XDTO у свойства Web-сервиса может оставаться пустым только в случае работы с примитивными типами данных (строка, число, булево). Если сервис должен принимать или возвращать сложные типы, их необходимо внедрить в дереве метаданных конфигурации.

Выполним по шагам настройку собственного Web-сервиса со сторонней XDTO-структурой:

  1. Выгрузка схемы: Получите XML-схему (файлы .xsd) или WSDL-описание сторонней системы и сохраните их на диске.
  2. Импорт в дерево метаданных: В Конфигураторе перейдите в ветку Общие -> XDTO-пакеты. В контекстном меню выберите пункт Импортировать схему XML и укажите загруженный файл схемы.
  3. Привязка пакета к сервису: Откройте свойства созданного Web-сервиса и в свойстве Пакеты XDTO укажите добавленный XDTO-пакет.
  4. Настройка операций и параметров: В операциях веб-сервиса укажите типы возвращаемых значений и параметров, выбирая их из импортированного пакета XDTO.
  5. Использование глобальной фабрики XDTO: В модуле Web-сервиса формируйте объекты с помощью глобальной фабрики ФабрикаXDTO, которая после публикации автоматически включает все пакеты из метаданных:

// Формирование объекта в модуле Web-сервиса
ТипОбъекта = ФабрикаXDTO.Тип("http://wa.dms.webservice/EmployeeGetResponse", "TransactionHeader");
РезультатXDTO = ФабрикаXDTO.Создать(ТипОбъекта);

Альтернативные способы передачи сложных XML-структур

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

← На главную