Где взять WSDL-описание SOAP-сервиса 1С:Предприятия 8.3 и почему оно не открывается

· 10 мин

Содержание

WSDL веб-сервиса 1С отдаёт веб-сервер, а не Конфигуратор. Чтобы его получить, опубликуйте базу через Администрирование → Публикация на веб-сервере, отметьте нужный веб-сервис и откройте в браузере адрес вида http://сервер/имя_публикации/ws/имя_файла.1cws?wsdl. В ответ придёт XML-документ с описанием операций, его и передают разработчикам внешней системы.

Частая ошибка — искать команду «Сохранить WSDL» в дереве конфигурации. Её там нет. Описание генерирует модуль веб-расширения платформы в момент запроса, по метаданным объекта «Web-сервис» и связанным пакетам XDTO. Нет публикации — нет и WSDL. Всё ниже относится к платформе 8.3 и одинаково для любой конфигурации: БП, ЗУП, УТ или самописной.

Что подготовить в конфигурации до публикации

WSDL строится из свойств объекта Общие → Web-сервисы. Если в них ошибка, публикация пройдёт, а описание не сгенерируется. Перед публикацией откройте свойства веб-сервиса и проверьте пять вещей.

  1. Пространство имён URI. Заполнено, без пробелов и кириллицы. Например, http://example.ru/exchange. Пустое или повторяющееся у двух сервисов пространство имён — прямой путь к ошибке генерации.
  2. Пакеты XDTO. Указаны все пакеты, типы из которых используются в параметрах и возвращаемых значениях операций.
  3. Имя файла публикации. По умолчанию что-то вроде WebService1.1cws. Именно это имя попадёт в адрес WSDL. Дайте ему понятное латинское название: exchange.1cws.
  4. Типы параметров и возвращаемых значений. Каждый тип должен быть XDTO-типом: из пакета http://www.w3.org/2001/XMLSchema (string, int, boolean, dateTime) или из вашего пакета. Ссылки на справочники и документы напрямую не годятся.
  5. Права. У пользователя, под которым будет обращаться внешняя система, в роли должно быть разрешено использование операций этого веб-сервиса.

Заведите для интеграции отдельного пользователя с латинским именем и паролем. Кириллица в Basic-авторизации часто ломается на стороне внешней системы: она кодирует логин не в той кодировке, и 1С отвечает «401».

После правок выполните Конфигурация → Обновить конфигурацию базы данных (F7). Публикация читает метаданные из базы, а не из открытой в Конфигураторе конфигурации.

Чем веб-сервис отличается от HTTP-сервиса

В 8.3 есть два похожих объекта. У них разное устройство, и это влияет на ответ на вопрос «где WSDL».

ОбъектПротоколОписаниеАдрес в публикации
Web-сервисSOAPWSDL генерируется автоматически/ws/имя.1cws?wsdl
HTTP-сервисREST, произвольный HTTPWSDL нет, описание пишут вручную/hs/корневой_URL/...

Если внешняя система просит WSDL, а в конфигурации есть только HTTP-сервис, получить WSDL не выйдет. Нужно либо делать SOAP-сервис, либо договориться о REST-обмене.

Публикация базы на IIS или Apache

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

Конфигуратор для публикации запускайте от имени администратора Windows. Иначе он не сможет записать файлы в каталог веб-сервера и поправить его настройки, а сообщение об ошибке будет невнятным.

Публикация через Конфигуратор

  1. Откройте базу в Конфигураторе.
  2. Выберите Администрирование → Публикация на веб-сервере.
  3. В поле «Имя» задайте короткое латинское имя публикации, например buh. Оно станет частью адреса.
  4. Выберите веб-сервер: Internet Information Services или Apache нужной версии.
  5. Проверьте каталог публикации. Для IIS обычно C:\inetpub\wwwroot\buh.
  6. Отметьте флажок публикации Web-сервисов и в списке — нужные сервисы. В колонке с адресом видно имя файла .1cws.
  7. Флажки публикации доступа для клиентских приложений, HTTP-сервисов и OData снимите, если они не нужны.
  8. Нажмите «Опубликовать». Для Apache после этого перезапустите службу веб-сервера.

В каталоге публикации появится файл default.vrd. Это и есть вся настройка публикации. Фрагмент для веб-сервисов выглядит так:

<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       base="/buh"
       ib="Srvr=&quot;srv1c&quot;;Ref=&quot;buh&quot;;">
  <ws pointEnableCommon="true">
    <point name="Exchange" alias="exchange.1cws" enable="true"/>
  </ws>
</point>

Атрибут alias — то самое имя в адресе WSDL. enable="false" выключает конкретный сервис без повторной публикации.

Публикация из командной строки

На сервере без графической оболочки или в скрипте развёртывания удобнее утилита webinst.exe из каталога bin платформы:

cd "C:\Program Files\1cv8\8.3.24.1548\bin"
webinst.exe -publish -iis -wsdir buh -dir "C:\inetpub\wwwroot\buh" -connstr "Srvr=srv1c;Ref=buh;"

Для Apache 2.4 вместо -iis укажите -apache24 и добавьте -confpath с путём к httpd.conf. Номер версии в пути замените на свой. Утилита не умеет отмечать отдельные веб-сервисы, поэтому после неё проверьте default.vrd руками.

Что проверить на IIS и Apache

Веб-серверЧто настроитьТипичный симптом, если забыли
IISКомпоненты «Расширения ISAPI» и «Фильтры ISAPI»404 или 500 на любой адрес публикации
IISРазрядность пула приложений совпадает с разрядностью модуля 1СОшибка загрузки модуля, 500
IISПрава группы IIS_IUSRS на каталог bin платформы, для файловой базы — на каталог базы500, ошибка доступа к файлам
ApacheВ httpd.conf есть LoadModule _1cws_module с путём к wsap24.dll нужной версииApache не стартует или отдаёт файл default.vrd как текст
ApacheРазрядность Apache и модуля совпадаетСлужба Apache не запускается

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

Адрес WSDL и как сохранить описание в файл

Адрес складывается из четырёх частей:

http://webserver/buh/ws/exchange.1cws?wsdl
       │         │   │  │
       │         │   │  └─ имя файла публикации (alias)
       │         │   └──── фиксированный сегмент для SOAP
       │         └──────── имя публикации
       └────────────────── сервер с IIS/Apache

Откройте адрес в браузере. Браузер спросит логин и пароль пользователя 1С. После входа появится XML, который начинается с <definitions или <wsdl:definitions. Сохраните страницу через Ctrl+S как exchange.wsdl.

Без браузера то же самое делает curl:

curl -u integration:Passw0rd -o exchange.wsdl "http://webserver/buh/ws/exchange.1cws?wsdl"

Ключ -u передаёт данные для Basic-авторизации. Если файл получился размером в пару сотен байт, откройте его: скорее всего, внутри HTML-страница ошибки, а не описание.

Адрес сервиса внутри WSDL

В конце описания есть блок <soap:address location="...">. В нём 1С подставляет хост из того запроса, которым вы получили WSDL.

Отсюда ловушка. Если вы скачали описание по адресу http://localhost/buh/..., внешняя система будет стучаться на localhost — то есть сама к себе. Скачивайте WSDL по тому имени, по которому к сервису будут обращаться снаружи. Если сервер стоит за обратным прокси или NAT, поправьте location в сохранённом файле вручную либо задайте адрес точки доступа в настройках клиента.

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

Почему описание не генерируется: разбор ошибок

Сообщения 1С на этапе генерации WSDL обычно короткие. Чтобы понять, что именно не так, идите от простого к сложному.

Сначала отделите веб-сервер от 1С

Откройте в браузере адрес публикации без /ws/...: http://webserver/buh/. Если публикация с доступом для клиентских приложений включена, откроется веб-клиент. Если выключена — придёт ответ от модуля 1С, а не стандартная страница IIS «404». По виду ответа понятно, дошёл ли запрос до 1С вообще.

Затем проверьте сам сервис без ?wsdl. Запрос http://webserver/buh/ws/exchange.1cws без параметра не отдаёт описание, но ответ уже приходит от 1С.

Ошибки в метаданных

🔎 Самые частые причины, по которым 1С не может собрать описание:

  • 📛 в двух веб-сервисах одной конфигурации одинаковое пространство имён URI;
  • 🧩 тип параметра указан как «Произвольный» или как ссылочный тип конфигурации;
  • 📦 тип взят из пакета XDTO, который не добавлен в свойство «Пакеты XDTO» веб-сервиса;
  • 🔤 в имени операции или параметра есть символы, недопустимые в XML-именах;
  • 🔁 после правки метаданных не обновили конфигурацию базы данных, и на сервере старая версия.

💡 Быстрая проверка пакета: в контекстном меню пакета XDTO есть экспорт XML-схемы. Если схема выгружается с ошибкой, WSDL с этим пакетом тоже не соберётся.

Где искать текст ошибки

  • Журнал регистрации базы. Отберите события за минуту, когда открывали WSDL. Ошибки сеансов веб-сервисов попадают туда же, что и ошибки пользователей.
  • Журнал событий Windows (раздел «Приложение»). Туда пишут IIS и модуль расширения, если ошибка случилась до входа в 1С.
  • Логи Apache error.log. Ошибки загрузки wsap24.dll видны сразу при старте службы.

Отладка веб-сервиса средствами платформы

Получить WSDL — половина дела. Дальше внешняя система вызывает операции, и тут нужна пошаговая отладка модуля веб-сервиса.

  1. Включите отладку в публикации. В default.vrd внутри корневого point добавьте строку:
<debug enable="true" protocol="http" url="http://srv1c:1550"/>

Адрес и порт — те, на которых работает сервер отладки (dbgs). Для протокола TCP формат адреса другой, смотрите справку платформы по default.vrd. 2. В Конфигураторе запустите отладку по HTTP и откройте Отладка → Подключение. 3. Нажмите «Автоматическое подключение» и отметьте сеансы веб-сервисов. 4. Поставьте точку останова в процедуре операции в модуле веб-сервиса. 5. Вызовите операцию из SoapUI или из внешней системы. Выполнение остановится на точке.

Отладку включайте на тестовой копии или в окно без нагрузки. Остановленный на точке сеанс держит запрос внешней системы, и та может решить, что сервис упал.

После отладки уберите строку debug из default.vrd или поставьте enable="false".

Проверка через SoapUI

SoapUI — бесплатный клиент для SOAP. Создайте новый SOAP-проект и вставьте адрес WSDL. Программа прочитает операции и соберёт шаблоны запросов. В свойствах запроса укажите Basic-авторизацию, логин и пароль пользователя 1С.

Удобно, что SoapUI показывает и запрос, и ответ целиком. Если внешняя система жалуется на «неверный формат», сравните её запрос с тем, что собрал SoapUI.

Другие способы получить или проверить описание

Иногда опубликовать базу нельзя: нет доступа к веб-серверу, политика безопасности, база ещё в разработке. Варианты:

СпособКогда подходитОграничения
Временная публикация на рабочей станции разработчикаНужен WSDL для согласования форматаАдрес в soap:address придётся поправить
Экспорт XML-схемы пакета XDTOВнешней стороне нужны только типы данныхЭто XSD без операций, не полный WSDL
Получение WSDL из другой базы 1С кодомПроверка, что описание читаетсяНужна работающая публикация
Объект Общие → WS-ссылки в базе-клиентеИнтеграция 1С с 1СИмпортирует WSDL, а не создаёт его

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

Определения = Новый WSОпределения(
    "http://webserver/buh/ws/exchange.1cws?wsdl",
    "integration", "Passw0rd");

Для Каждого Сервис Из Определения.Сервисы Цикл
    Сообщить("Сервис: " + Сервис.Имя + ", URI: " + Сервис.URIПространстваИмен);
    Для Каждого Точка Из Сервис.ТочкиПодключения Цикл
        Для Каждого Операция Из Точка.Интерфейс.Операции Цикл
            Сообщить("  Операция: " + Операция.Имя);
        КонецЦикла;
    КонецЦикла;
КонецЦикла;

Если код выводит список операций, описание валидное и читается сторонним клиентом. Если падает на первой строке — текст исключения подскажет, что не так: авторизация, адрес или содержимое WSDL.

Как закрыть WSDL и сам сервис от посторонних

Опубликованный WSDL показывает структуру вашего обмена: имена операций, поля, типы. Это не секрет уровня паролей, но открывать его всему интернету незачем.

Минимальный набор мер

  1. 🔒 HTTPS вместо HTTP. При Basic-авторизации логин и пароль идут в каждом запросе. Без шифрования их видно любому на пути трафика. Сертификат ставится на уровне IIS или Apache, 1С тут ничего не настраивает.
  2. 👤 Отдельный пользователь интеграции. Роль только с правом на операции веб-сервиса и чтение нужных данных. Без интерактивного входа и без административных прав.
  3. 🚫 Без логина и пароля в default.vrd. Атрибуты usr и pwd в публикации позволяют входить без авторизации. Пароль в этом файле хранится открыто, а сервис становится доступен любому, кто знает адрес.
  4. 🌐 Ограничение по IP. На IIS — роль «Ограничения IP-адресов и доменов», на Apache — директивы Require ip в блоке Directory публикации.
  5. 🧹 Только нужные сервисы. Не публикуйте все веб-сервисы по умолчанию. Снимите флажки с тех, что не используются, и отключите публикацию клиентского доступа, если базу через этот веб-сервер не открывают.

Отдельная публикация для интеграции

Хорошая практика — две публикации одной базы. Первая, например buh, только для веб-клиента сотрудников во внутренней сети. Вторая, buh-ws, только с веб-сервисами, наружу, через HTTPS и с фильтром по IP партнёра.

Так проще разграничить доступ и логи. А отключение интеграции сводится к правке одной публикации, без риска задеть пользователей.

Можно ли получить WSDL без логина и пароля?
Только если в публикации прописан пользователь по умолчанию или используется аутентификация ОС. Для внешних систем так делать не стоит: сервис станет доступен всем, кто знает адрес.
Изменится ли WSDL после обновления конфигурации?
Да, если поменялись операции, параметры или пакеты XDTO веб-сервиса. Внешней системе тогда нужно заново импортировать описание. Типовое обновление БП или ЗУП ваш собственный веб-сервис не трогает, если он не в составе типовой конфигурации.
Почему в WSDL адрес сервера не тот, что нужен?
1С подставляет в soap:address хост из запроса, которым скачали описание. Скачайте WSDL по внешнему имени сервера или исправьте адрес в сохранённом файле.
Работает ли получение WSDL для файловой базы?
Да. Публикация файловой базы на IIS или Apache отдаёт WSDL так же, как клиент-серверная. Учётной записи веб-сервера нужны права на каталог базы.
Нужна ли лицензия 1С на обращения к веб-сервису?
Сеансы веб-сервисов, как и другие сеансы, требуют лицензий на сервере 1С. При частых вызовах помогает повторное использование сеансов в свойствах веб-сервиса: меньше новых сеансов — меньше нагрузка.