При разработке интеграционных решений на платформе 1С программисты часто сталкиваются с тем, что созданный XDTO-пакет упорно отказывается появляться в выпадающем списке при настройке параметров или возвращаемых значений метода Web-сервиса. Эта ситуация типична для тех, кто только начинает осваивать технологию SOAP-обмена. Разберем детально, как правильно связать пакет данных с сервисом и какие нюансы настройки необходимо учесть, чтобы архитектура обмена работала корректно.
Проанализируем первую и самую распространенную причину проблемы. В среде разработки 1С недостаточно просто создать XDTO-пакет в дереве конфигурации. Объект Web-сервис является изолированным описанием интерфейса, и ему нужно явно «сообщить», какие именно схемы данных он имеет право использовать.
Рассмотрим порядок действий для подключения пакета:
Web-сервиса.Order).Только после того, как пакет добавлен в этот «белый список», платформа позволит выбирать типы, определенные внутри этого пакета, в качестве типов параметров и возвращаемых значений методов. Это фундаментальный механизм типизации в 1С: без явного указания состава пакетов WSDL-описание сервиса не сможет корректно сформироваться.
Выясним вторую важную причину, по которой нужный объект может не отображаться в списке. В структуре XDTO-пакета существует разделение на Типы объектов (Type Definitions) и Свойства/Элементы.
Разберем ситуацию подробнее: если вы создали в пакете только корневой Элемент, но не определили для него Тип объекта (Complex Type), то в списке выбора Web-сервиса вы его не увидите. Платформа ожидает, что возвращаемое значение метода — это конкретный Тип, а не экземпляр элемента. Для решения этой задачи проверим структуру пакета:
OrderType.OrderType.Посмотрим на технический аспект именования. Для корректной работы Web-сервиса и XDTO-пакета крайне желательно, чтобы их Пространства имен (URI) соответствовали логике вашего приложения. Хотя технически они могут различаться, их несовпадение часто вносит путаницу при генерации WSDL-схемы.
Рекомендуется придерживаться следующих правил:
http://www.yourcompany.ru/orders).Имя пространства имен должно логически соотноситься с типами данных, которые он отдает.После того как мы успешно настроили метаданные и тип Order стал доступен в интерфейсе, необходимо правильно написать программный код метода GetData. Нам нужно не просто вернуть структуру или таблицу, а создать объект через ФабрикуXDTO.
Проанализируем пример кода для формирования возвращаемого значения:
Функция GetData(НомерЗаказа)
// 1. Определяем тип объекта из нашего пакета
ТипОбъектаOrder = ФабрикаXDTO.Тип("http://www.yourcompany.ru/orders", "OrderType");
// 2. Создаем экземпляр объекта XDTO
НовыйЗаказ = ФабрикаXDTO.Создать(ТипОбъектаOrder);
// 3. Заполняем свойства объекта
НовыйЗаказ.Number = НомерЗаказа;
НовыйЗаказ.Date = ТекущаяДата();
// 4. Возвращаем объект XDTO
Возврат НовыйЗаказ;
КонецФункции
Важно помнить, что если в качестве возвращаемого значения в свойствах метода указан тип из XDTO-пакета, то функция обязана возвращать объект типа ОбъектXDTO. Если вернуть обычную Структуру или Ссылку, вызов метода завершится ошибкой сериализации.
В ходе обсуждения часто звучат советы перейти на HTTP-сервисы как на более современные. Однако у Web-сервисов (SOAP) есть неоспоримые преимущества, которые мы разберем:
Рассмотрим еще один важный момент. Бывает так, что все настройки выполнены верно, но внешние потребители (или SoapUI) не видят обновленную структуру. Это происходит из-за кэширования WSDL-описания на стороне веб-сервера (Apache или IIS).
В таких случаях выполним следующие действия:
Используя комплексный подход — от настройки списка Пакеты XDTO в свойствах сервиса до программного создания объектов через ФабрикаXDTO.Создать() — вы сможете успешно реализовать надежный механизм обмена данными.