Работа с внешними веб-сервисами и обмен данными через XML требует наличия строго описанной структуры в информационной базе. В платформе 1С для этих целей используются XDTO-пакеты. Часто разработчики сталкиваются с ситуацией, когда на руках есть только файл .wsdl или пример .xml, а структуру пакета нужно воссоздать максимально быстро и без ошибок. В этой статье мы подробно разберем, как автоматизировать этот процесс, какие инструменты использовать и как обойти ограничения платформы.
Если ваша задача — интеграция с веб-сервисом, описанным в .wsdl, самым простым и логичным путем будет создание объекта WS-ссылка. Это позволяет платформе автоматически считать все типы данных и методы сервиса. Разберем этот процесс по шагам:
file://C:/МояСхема/service.wsdl.Важно понимать: при создании WS-ссылки пакеты XDTO создаются "виртуально" внутри этой ссылки. Вы можете обращаться к ним через свойство ссылки, но они не появятся в общем списке пакетов XDTO. Если вам нужны именно отдельные пакеты для локальной обработки файлов, перейдем к следующему методу.
Часто WSDL содержит в себе блок types, внутри которого описаны схемы xsd. Чтобы создать именно XDTO-пакет в дереве метаданных, нам нужно получить чистый файл .xsd. Проанализируем, как это сделать:
Вариант А. Ручное копирование. Откроем .wsdl в текстовом редакторе, найдем тег xs:schema и скопируем все его содержимое (включая сам тег) в новый текстовый файл с расширением .xsd. Не забудьте добавить стандартный заголовок XML в начало файла.
Вариант Б. Использование SoapUI. Рассмотрим более профессиональный подход. Загрузим WSDL в бесплатную утилиту SoapUI. После импорта проекта мы сможем нажать правой кнопкой мыши на интерфейс и выбрать пункт "Export Schema". Утилита сама извлечет все вложенные типы и сохранит их в виде готовых к импорту файлов.
После получения файла .xsd выполним следующие действия в Конфигураторе:
Ситуация, когда есть только пример сообщения (.xml), сложнее, так как XML не содержит информации о типах данных (например, является ли поле строкой или числом, обязательное ли оно). Однако мы можем воспользоваться инструментами инференции схемы. Проанализируем алгоритм действий:
xsd.exe, которая входит в состав Microsoft .NET SDK. Выполним команду xsd.exe my_file.xml. Утилита создаст файл my_file.xsd на основе структуры данных.Внимание: полученную таким образом схему необходимо тщательно проверить. Автоматика может ошибиться, установив тип string для дат или неверно определив кратность элементов. После правки файла его можно импортировать в 1С стандартным способом.
Иногда структура данных меняется слишком часто, или нам не хочется загромождать дерево метаданных десятками пакетов. В этом случае мы можем использовать объект WSОпределения для создания динамической фабрики прямо в коде. Рассмотрим пример кода:
МестоположениеWSDL = "C:\Schemas\service.wsdl";
// Создаем объект определений, который прочитает структуру WSDL
WSОпределения = Новый WSОпределения(МестоположениеWSDL);
// Из определений получаем фабрику, которая содержит все типы схемы
МояФабрика = WSОпределения.ФабрикаXDTO;
// Теперь мы можем создавать объекты по типам из этой схемы
ТипОбъекта = МояФабрика.Тип("http://www.example.com/integration", "OrderRequest");
НовыйЗаказ = МояФабрика.Создать(ТипОбъекта);
Если у нас есть только файлы схем .xsd, мы можем собрать фабрику из массива файлов, не создавая WSОпределения:
МассивСхем = Новый Массив;
МассивСхем.Добавить("C:\Schemas\CommonTypes.xsd");
МассивСхем.Добавить("C:\Schemas\Orders.xsd");
// Создаем фабрику на лету
ДинамическаяФабрика = СоздатьФабрикуXDTO(МассивСхем);
Этот метод крайне полезен при разработке универсальных механизмов обмена, так как позволяет обновлять схемы без изменения метаданных конфигурации и перезапуска сеансов пользователей.
Проанализируем типичные проблемы, с которыми можно столкнуться при импорте .xsd в 1С. Платформа поддерживает стандарт XML Schema не в полном объеме. Выясним основные причины ошибок:
anyType и anyAttribute: 1С не всегда понимает, как превратить их в конкретные свойства. В пакете XDTO они могут отображаться как свойства с типом ЛюбойТип, что требует особой обработки при заполнении.xs:union и xs:list: Эти элементы стандарта XSD практически не поддерживаются объектами XDTO напрямую. Если ваша схема их содержит, импорт может завершиться неудачей.pattern) или ограничения по длине, 1С при импорте в пакет часто их игнорирует. Валидация данных в 1С будет проходить по типам, но не по сложным ограничениям.Если вы работаете в конфигурации на базе Библиотеки стандартных подсистем (БСП), обратите внимание на программные интерфейсы. Хотя в БСП нет функции "создать пакет", там есть отличные инструменты для работы с результатами. Рассмотрим применение функций общего назначения:
Например, модуль ОбщегоНазначения часто содержит методы для сериализации и десериализации XDTO в структуры 1С и обратно. Это избавляет от необходимости вручную перебирать все свойства объекта XDTO. Вы можете прочитать XML файл в объект XDTO, а затем одной строкой конвертировать его в привычную структуру или таблицу значений для дальнейшей записи в информационную базу.
Для выгрузки схемы из уже существующей WS-ссылки (если вам нужно передать ее коллегам), используйте метод ЭкспортСхемыXML у фабрики:
// Пример экспорта схемы пространства имен в текстовый документ
Схема = ФабрикаXDTO.ЭкспортСхемыXML("http://www.example.com/crm");
Схема.Записать("C:\Temp\ExportedSchema.xsd");
Подведем итог: автоматическое создание пакетов XDTO возможно через импорт .xsd или создание WS-ссылок. Если стандартные средства Конфигуратора не справляются со сложной схемой, используйте динамическое создание фабрики в коде или предварительную очистку схемы в специализированных инструментах, таких как SoapUI или Altova XMLSpy.