Где взять WSDL-описание SOAP-сервиса 1С:Предприятия 8.3 и почему оно не открывается
Содержание
WSDL веб-сервиса 1С отдаёт веб-сервер, а не Конфигуратор. Чтобы его получить, опубликуйте базу через Администрирование → Публикация на веб-сервере, отметьте нужный веб-сервис и откройте в браузере адрес вида http://сервер/имя_публикации/ws/имя_файла.1cws?wsdl. В ответ придёт XML-документ с описанием операций, его и передают разработчикам внешней системы.
Частая ошибка — искать команду «Сохранить WSDL» в дереве конфигурации. Её там нет. Описание генерирует модуль веб-расширения платформы в момент запроса, по метаданным объекта «Web-сервис» и связанным пакетам XDTO. Нет публикации — нет и WSDL. Всё ниже относится к платформе 8.3 и одинаково для любой конфигурации: БП, ЗУП, УТ или самописной.
Что подготовить в конфигурации до публикации
WSDL строится из свойств объекта Общие → Web-сервисы. Если в них ошибка, публикация пройдёт, а описание не сгенерируется. Перед публикацией откройте свойства веб-сервиса и проверьте пять вещей.
- Пространство имён URI. Заполнено, без пробелов и кириллицы. Например,
http://example.ru/exchange. Пустое или повторяющееся у двух сервисов пространство имён — прямой путь к ошибке генерации. - Пакеты XDTO. Указаны все пакеты, типы из которых используются в параметрах и возвращаемых значениях операций.
- Имя файла публикации. По умолчанию что-то вроде
WebService1.1cws. Именно это имя попадёт в адрес WSDL. Дайте ему понятное латинское название:exchange.1cws. - Типы параметров и возвращаемых значений. Каждый тип должен быть XDTO-типом: из пакета
http://www.w3.org/2001/XMLSchema(string,int,boolean,dateTime) или из вашего пакета. Ссылки на справочники и документы напрямую не годятся. - Права. У пользователя, под которым будет обращаться внешняя система, в роли должно быть разрешено использование операций этого веб-сервиса.
Заведите для интеграции отдельного пользователя с латинским именем и паролем. Кириллица в Basic-авторизации часто ломается на стороне внешней системы: она кодирует логин не в той кодировке, и 1С отвечает «401».
После правок выполните Конфигурация → Обновить конфигурацию базы данных (F7). Публикация читает метаданные из базы, а не из открытой в Конфигураторе конфигурации.
Чем веб-сервис отличается от HTTP-сервиса
В 8.3 есть два похожих объекта. У них разное устройство, и это влияет на ответ на вопрос «где WSDL».
| Объект | Протокол | Описание | Адрес в публикации |
|---|---|---|---|
| Web-сервис | SOAP | WSDL генерируется автоматически | /ws/имя.1cws?wsdl |
| HTTP-сервис | REST, произвольный HTTP | WSDL нет, описание пишут вручную | /hs/корневой_URL/... |
Если внешняя система просит WSDL, а в конфигурации есть только HTTP-сервис, получить WSDL не выйдет. Нужно либо делать SOAP-сервис, либо договориться о REST-обмене.
Публикация базы на IIS или Apache
Публикацию делают на той машине, где стоит веб-сервер. На ней же должны быть установлены компоненты платформы «Модули расширения веб-сервера» той же версии и разрядности, что и сервер 1С.
Конфигуратор для публикации запускайте от имени администратора Windows. Иначе он не сможет записать файлы в каталог веб-сервера и поправить его настройки, а сообщение об ошибке будет невнятным.
Публикация через Конфигуратор
- Откройте базу в Конфигураторе.
- Выберите
Администрирование → Публикация на веб-сервере. - В поле «Имя» задайте короткое латинское имя публикации, например
buh. Оно станет частью адреса. - Выберите веб-сервер: Internet Information Services или Apache нужной версии.
- Проверьте каталог публикации. Для IIS обычно
C:\inetpub\wwwroot\buh. - Отметьте флажок публикации Web-сервисов и в списке — нужные сервисы. В колонке с адресом видно имя файла
.1cws. - Флажки публикации доступа для клиентских приложений, HTTP-сервисов и OData снимите, если они не нужны.
- Нажмите «Опубликовать». Для 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="srv1c";Ref="buh";">
<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 — половина дела. Дальше внешняя система вызывает операции, и тут нужна пошаговая отладка модуля веб-сервиса.
- Включите отладку в публикации. В
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 показывает структуру вашего обмена: имена операций, поля, типы. Это не секрет уровня паролей, но открывать его всему интернету незачем.
Минимальный набор мер
- 🔒 HTTPS вместо HTTP. При Basic-авторизации логин и пароль идут в каждом запросе. Без шифрования их видно любому на пути трафика. Сертификат ставится на уровне IIS или Apache, 1С тут ничего не настраивает.
- 👤 Отдельный пользователь интеграции. Роль только с правом на операции веб-сервиса и чтение нужных данных. Без интерактивного входа и без административных прав.
- 🚫 Без логина и пароля в
default.vrd. Атрибутыusrиpwdв публикации позволяют входить без авторизации. Пароль в этом файле хранится открыто, а сервис становится доступен любому, кто знает адрес. - 🌐 Ограничение по IP. На IIS — роль «Ограничения IP-адресов и доменов», на Apache — директивы
Require ipв блокеDirectoryпубликации. - 🧹 Только нужные сервисы. Не публикуйте все веб-сервисы по умолчанию. Снимите флажки с тех, что не используются, и отключите публикацию клиентского доступа, если базу через этот веб-сервер не открывают.
Отдельная публикация для интеграции
Хорошая практика — две публикации одной базы. Первая, например buh, только для веб-клиента сотрудников во внутренней сети. Вторая, buh-ws, только с веб-сервисами, наружу, через HTTPS и с фильтром по IP партнёра.
Так проще разграничить доступ и логи. А отключение интеграции сводится к правке одной публикации, без риска задеть пользователей.