WS-ссылки в конфигурации 1С 8.3: импорт WSDL, вызов внешнего сервиса и разбор ошибок

· 9 мин

Содержание

WS-ссылка в 1С — это объект метаданных в ветке Общие → WS-ссылки дерева конфигурации, в котором хранится импортированное описание (WSDL) чужого SOAP-сервиса. Создали ссылку один раз, и дальше обращаетесь к внешней системе из кода одной строкой: WSСсылки.ИмяСсылки.СоздатьWSПрокси(...), а платформа сама собирает SOAP-конверт и разбирает ответ.

Путаница начинается, когда WS-ссылки смешивают с web-сервисами и HTTP-сервисами 1С. Это три разных механизма. WS-ссылка нужна, чтобы 1С была клиентом и сама ходила в чужой сервис. Web-сервис и HTTP-сервис нужны, чтобы внешние системы ходили в 1С. Ниже — как настроить WS-ссылку, как опубликовать свою точку входа и что делать, когда вызов падает.

Что такое WS-ссылка и чем она отличается от web-сервиса и HTTP-сервиса

Платформа 1С 8.3 даёт три инструмента интеграции по HTTP. Они решают разные задачи, и выбор зависит от того, кто к кому обращается и по какому протоколу.

МеханизмГде в конфигуратореНаправлениеПротоколЧто описывает
WS-ссылкаОбщие → WS-ссылки1С вызывает чужой сервисSOAPИмпортированный WSDL внешней системы
Web-сервисОбщие → Web-сервисыВнешняя система вызывает 1СSOAPСвои операции, WSDL генерирует платформа
HTTP-сервисОбщие → HTTP-сервисыВнешняя система вызывает 1СHTTP (REST-стиль)Шаблоны URL и методы GET/POST/PUT/DELETE

Для вызова чужого REST API WS-ссылка не подходит. Там нужен объект HTTPСоединение и HTTPЗапрос: WSDL у REST-сервисов нет, описывать нечего.

💡 Признак, что вам нужна именно WS-ссылка: внешняя сторона прислала адрес вида https://.../service?wsdl или файл .wsdl. Это SOAP, и WS-ссылка закрывает его целиком.

Что даёт WS-ссылка по сравнению с ручной сборкой XML:

  • 🧩 типы данных из WSDL превращаются в XDTO-пакет внутри конфигурации, их видно в дереве;
  • ⚙️ платформа сама формирует SOAP-конверт, заголовки и разбирает ответ;
  • 🔁 операции сервиса вызываются как методы объекта: Прокси.GetRate(...);
  • 🛑 SOAP-ошибки (fault) превращаются в исключения, их ловят обычным Попытка ... Исключение.

Как создать WS-ссылку в конфигураторе: импорт WSDL

WS-ссылка — часть конфигурации. Значит, добавлять её нужно в конфигураторе, а изменения потом применять к базе. В типовой конфигурации на поддержке удобнее делать это в расширении, чтобы не снимать объект с поддержки.

Пошаговая настройка

  1. Откройте конфигуратор и дерево конфигурации (Конфигурация → Открыть конфигурацию).
  2. Разверните ветку Общие, найдите WS-ссылки.
  3. Правой кнопкой по ветке → Добавить. Откроется окно импорта WSDL.
  4. Укажите источник: адрес WSDL (например, https://partner.example.ru/rates?wsdl) или путь к файлу .wsdl на диске.
  5. Если сервис закрыт паролем, введите логин и пароль в окне импорта: они нужны только для скачивания описания и в конфигурации не сохраняются.
  6. Дайте ссылке понятное имя латиницей или кириллицей без пробелов, например КурсыПартнера.
  7. Сохраните конфигурацию и выполните Конфигурация → Обновить конфигурацию базы данных (F7).

После импорта раскройте созданную ссылку. Внутри будут сервисы, точки подключения (порты) и операции с параметрами. Эти имена понадобятся в коде, поэтому лучше скопировать их прямо отсюда, а не набирать вручную.

Если WSDL состоит из нескольких файлов

Крупные сервисы раскладывают описание на основной WSDL и подключаемые схемы XSD. При импорте по URL платформа подтягивает их сама. При импорте из файла все подключаемые схемы должны лежать рядом, иначе импорт закончится ошибкой разбора.

Внешний сервис изменил контракт (добавил поле, переименовал операцию)? WS-ссылка об этом не узнает. Описание статичное, его нужно импортировать заново. Удобно пересоздать ссылку с тем же именем: тогда код вызова менять не придётся.

Вызов внешнего сервиса через WS-ссылку: код, SOAP и XDTO

Объект WSПрокси доступен на сервере, в толстом клиенте и во внешнем соединении. В тонком и веб-клиенте его нет. Поэтому вызов всегда выносят в процедуру с директивой &НаСервере или в серверный общий модуль.

Простой вызов с примитивными параметрами

&НаСервере
Функция ПолучитьКурсНаСервере(КодВалюты)

    Прокси = WSСсылки.КурсыПартнера.СоздатьWSПрокси(
        "http://partner.example.ru/rates",  // URI пространства имён из WSDL
        "RatesService",                     // имя сервиса
        "RatesServiceSoap",                 // имя точки подключения
        ,                                   // интернет-прокси
        30);                                // таймаут, секунд

    Прокси.Пользователь = "api_user";
    Прокси.Пароль = ПарольСервиса();

    Попытка
        Курс = Прокси.GetRate(КодВалюты, ТекущаяДатаСеанса());
    Исключение
        ЗаписьЖурналаРегистрации("Интеграция.КурсыПартнера",
            УровеньЖурналаРегистрации.Ошибка, , ,
            ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        Возврат Неопределено;
    КонецПопытки;

    Возврат Курс;

КонецФункции

Три первых параметра СоздатьWSПрокси берутся из WSDL: атрибут targetNamespace, элементы service и port. Ошибка в любом из них даёт исключение ещё до сетевого обращения.

Сложные параметры: объекты XDTO

Если операция принимает не строку, а структуру (заказ, контрагент, пакет документов), её собирают через фабрику XDTO прокси:

Фабрика = Прокси.ФабрикаXDTO;
ТипЗапроса = Фабрика.Тип("http://partner.example.ru/rates", "RateRequest");

Запрос = Фабрика.Создать(ТипЗапроса);
Запрос.Currency = "USD";
Запрос.OnDate = ТекущаяДатаСеанса();

Ответ = Прокси.GetRateEx(Запрос);
Сумма = Ответ.Rate;

Имена типов и свойств чувствительны к регистру и должны совпадать с XSD символ в символ. Массив в ответе приходит как СписокXDTO: его перебирают циклом Для Каждого.

Статическая WS-ссылка или динамический WSПрокси

Тот же вызов можно сделать без объекта метаданных: описание скачивается в момент выполнения через Новый WSОпределения(АдресWSDL, Пользователь, Пароль), а прокси создаётся конструктором Новый WSПрокси(Определения, URI, Сервис, Точка).

КритерийWS-ссылка (статическая)WSОпределения (динамический)
Где хранится WSDLВ конфигурацииСкачивается при каждом создании
Нужна ли правка конфигурацииДаНет, работает и во внешней обработке
Скорость первого вызоваВыше, WSDL уже разобранНиже: лишний запрос за описанием
Смена адреса сервера (тест/прод)Нужна доработкаАдрес WSDL берётся из настройки
Реакция на смену контрактаПовторный импортПодхватывается сама
Типы в дереве конфигурацииВидны, есть подсказкиНет

Практическое правило: стабильный контракт и одна точка подключения — WS-ссылка. Несколько стендов, внешняя обработка или сервис, который часто меняется, — динамический вариант. Если создаёте WSОпределения в цикле, кэшируйте прокси на время сеанса: каждый раз качать WSDL заметно медленнее.

Публикация своего web-сервиса 1С для внешних систем

Обратная задача: 1С отдаёт данные, а внешняя система вызывает её по SOAP. Тогда создают объект в ветке Общие → Web-сервисы, описывают операции и пишут их обработчики в модуле сервиса. Чтобы сервис стал доступен снаружи, базу публикуют на веб-сервере.

Что нужно для публикации

  • 🖥 веб-сервер Apache 2.4 или IIS на машине, где установлены модули расширения веб-сервера 1С (компонент выбирается при установке платформы);
  • 🔑 права администратора ОС на этой машине;
  • 📂 доступ к каталогу публикации у пользователя, от имени которого работает веб-сервер.

Шаги

  1. Запустите конфигуратор от имени администратора ОС.
  2. Откройте Администрирование → Публикация на веб-сервере.
  3. Укажите имя публикации (оно станет частью адреса), тип веб-сервера и каталог.
  4. На вкладке веб-сервисов отметьте нужные сервисы. Для HTTP-сервисов — отдельная вкладка.
  5. Нажмите Опубликовать и согласитесь на перезапуск веб-сервера.

Перезапуск веб-сервера обрывает текущие сеансы веб-клиента и все вызовы, которые идут через эту публикацию. Публикуйте вне рабочего времени или предупредите пользователей.

После публикации WSDL доступен по адресу вида http://сервер/ИмяПубликации/ws/ИмяСервиса?wsdl, HTTP-сервисы — по http://сервер/ИмяПубликации/hs/КорневойURL/.... Откройте адрес WSDL в браузере: если видите XML, публикация работает.

Авторизация и безопасность при интеграции через WS

Безопасность здесь две стороны: как 1С представляется чужому сервису и как чужие системы входят в 1С.

Когда 1С — клиент

  • 🔐 Логин и пароль задают свойствами Прокси.Пользователь и Прокси.Пароль (HTTP Basic). Не храните их в константах открытым текстом. В конфигурациях на БСП для этого есть безопасное хранилище: ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище и парный метод чтения.
  • 🔒 Для адреса https:// передайте в СоздатьWSПрокси объект Новый ЗащищенноеСоединениеOpenSSL(). Если у партнёра сертификат от собственного центра, укажите файл с его корневым сертификатом через СертификатыУдостоверяющихЦентровФайл, а не отключайте проверку.
  • 🌐 Через корпоративный прокси работают с объектом ИнтернетПрокси, он идёт четвёртым параметром.

Когда 1С — сервер

  • 👤 Внешняя система входит под пользователем информационной базы. Заведите отдельного пользователя под интеграцию, без интерактивного входа.
  • 🧾 В роли этого пользователя дайте право на использование только нужных операций web-сервиса. Полные права «на всякий случай» превращают сервис в дверь ко всей базе.
  • 🛡 Внешнюю публикацию закрывайте HTTPS на веб-сервере и, по возможности, ограничением по IP-адресам партнёра.

Если в кластере включены профили безопасности, обращения к внешним адресам из кода должны быть разрешены в профиле. Иначе вызов упадёт с ошибкой доступа, хотя сеть и пароль в порядке.

Где применяют WS-ссылки на практике

Чаще всего WS-ссылка появляется там, где партнёр отдаёт только SOAP:

  • 🏦 банковские и платёжные шлюзы старого образца, загрузка выписок и статусов платежей;
  • 🚚 службы доставки и логистические операторы: расчёт тарифа, создание накладной, трекинг;
  • 🏭 обмен с ERP другого вендора, MES или WMS, у которых SOAP-интерфейс — стандарт;
  • 🏢 обмен между двумя базами 1С: одна публикует web-сервис, другая подключается к нему через WS-ссылку;
  • 📊 справочные сервисы с курсами, классификаторами, проверкой реквизитов.

Связка «база-источник с web-сервисом + база-приёмник с WS-ссылкой» удобна, когда типовой механизм обмена не подходит, а прямого доступа к серверу базы-партнёра нет. Обе стороны пишутся на одном языке, а контракт задаёт WSDL, который генерирует сама платформа.

Для регулярных вызовов используйте регламентное задание, а не кнопку на форме. Так обмен не зависит от того, открыта ли форма у пользователя, а ошибки попадают в журнал регистрации.

Ошибки при вызове через WS-ссылку и как их отлаживать

Начинайте с того, на каком шаге падает вызов. Создание прокси, сетевой запрос и разбор ответа дают разные ошибки.

Диагностика: выберите симптом

Как увидеть, что реально уходит в сеть

Самый быстрый приём — проверить сервис отдельно от 1С. Загрузите тот же WSDL в SoapUI или аналогичный инструмент и отправьте запрос с теми же данными. Работает там, но не работает из 1С — проблема в коде или в сети сервера 1С. Не работает нигде — вопрос к партнёру.

Ещё два приёма:

  • 🔍 запустите сеанс отладки на сервере (в параметрах конфигуратора включите отладку на сервере) и посмотрите значения XDTO-объектов в табло до и после вызова;
  • 🧪 направьте прокси через локальный HTTP-перехватчик (Fiddler и подобные) параметром ИнтернетПрокси, чтобы увидеть SOAP-конверт и ответ целиком. Делайте это только на тестовом стенде: в журнал перехватчика попадут пароли.

Помните, что вызов идёт от имени учётной записи службы сервера 1С, а не от вашего пользователя Windows. Прокси-сервер, сертификаты и доступ к сети нужно проверять именно для неё.

Частые вопросы

Можно ли вызвать WS-ссылку из тонкого клиента?
Напрямую нет: объект WSПрокси в тонком и веб-клиенте недоступен. Вызов выносят в серверную процедуру или общий модуль, а клиент получает уже готовый результат.
Нужно ли снимать типовую конфигурацию с поддержки, чтобы добавить WS-ссылку?
Нет. WS-ссылку можно добавить в расширение конфигурации, тогда типовая остаётся на поддержке и обновляется как раньше.
Сохраняется ли пароль, введённый при импорте WSDL?
Нет. Он используется только для скачивания описания. Для рабочих вызовов логин и пароль задают в коде свойствами прокси.
Подходит ли WS-ссылка для REST API в формате JSON?
Нет. WS-ссылка работает только с SOAP-сервисами, у которых есть WSDL. Для REST используют HTTPСоединение и HTTPЗапрос, а JSON разбирают через ЧтениеJSON.
Как переключить WS-ссылку с тестового сервера на рабочий?
Адрес точки подключения берётся из импортированного WSDL. Если стендов несколько, удобнее динамический вариант через WSОпределения, где адрес WSDL хранится в настройке и меняется без правки конфигурации.