Проверка web-сервиса 1С после публикации: WSDL, тестовый вызов, отладка
Содержание
Опубликованный web-сервис 1С проверяют в два хода. Сначала открывают в браузере адрес http://сервер/имя_публикации/ws/имя_сервиса?wsdl: если после ввода логина и пароля пришёл XML с описанием операций, публикация работает. Затем делают настоящий вызов операции — из 1С через WSПрокси, из SoapUI, Postman или curl — и смотрят, что вернул модуль сервиса.
Частое заблуждение: «WSDL открылся — значит, сервис работает». Это не так. WSDL отдаёт веб-расширение 1С по метаданным, код модуля при этом не выполняется. Ошибка в модуле, нехватка прав или лицензий вылезут только при вызове операции. Поэтому проверка опубликованного web-сервиса 1С всегда заканчивается тестовым запросом.
Всё ниже относится к платформе 8.3 и не зависит от конфигурации: БП, ЗУП, УТ или своя разработка публикуют web-сервисы одинаково.
Подготовка: что проверить в публикации до первого запроса
Большая часть «не работает » решается ещё до запросов. Пройдитесь по списку.
Сервис есть в конфигурации базы данных
Web-сервис добавляют в ветке Общие → Web-сервисы дерева конфигурации. После этого конфигурацию нужно не просто сохранить, а обновить: Конфигурация → Обновить конфигурацию базы данных (F7). Пока основная конфигурация не применена к базе, веб-сервер про новый сервис не знает.
Сервис отмечен при публикации
Публикация делается из Конфигуратора, запущенного от имени администратора Windows: Администрирование → Публикация на веб-сервере. На закладке Web-сервисы проверьте:
- ✅ флажок публикации web-сервисов включён;
- ✅ нужный сервис отмечен в списке;
- ✅ в колонке адреса видно имя файла, например
exchange.1cws.
Если сервис добавили в конфигурацию после публикации, откройте этот диалог заново, отметьте сервис и нажмите Опубликовать. Для Apache после каждой публикации нужен перезапуск службы веб-сервера.
Перезапуск Apache или IIS обрывает все текущие подключения через этот веб-сервер: веб-клиент, другие сервисы, мобильные приложения. Делайте это вне рабочего времени или предупредите пользователей.
Файл default.vrd
Публикация создаёт в каталоге веб-сервера файл default.vrd. Это первое, что стоит открыть при странном поведении. Фрагмент для web-сервисов выглядит так:
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
base="/trade"
ib="Srvr="srv1c";Ref="trade";">
<ws pointEnableCommon="true">
<point name="Exchange" alias="exchange.1cws" enable="true"/>
</ws>
</point>
Здесь видно три вещи: имя публикации (base), строку подключения к базе (ib) и сервис с флагом enable. Если сервиса в списке нет или стоит enable="false", вызов не дойдёт до 1С.
Права пользователя 1С
Web-сервис вызывается от имени пользователя информационной базы. Заведите для интеграции отдельного пользователя с паролем и латинским логином, например ws_exchange. Кириллица в логине при базовой HTTP-аутентификации часто ломается на стороне внешней системы — запрос уходит в другой кодировке, и 1С пользователя не находит.
Пользователю нужны права на все объекты, которые читает или пишет код операции. Отдельного «права на web-сервис» для запуска самой операции нет, а вот на справочники и документы — есть.
Доступ веб-сервера к базе
Для файловой базы учётная запись, под которой работает веб-сервер, должна иметь права на чтение и запись каталога базы. Для IIS это обычно IUSR и пользователи пула приложений, для Apache под Windows — учётная запись службы. Для клиент-серверной базы проверьте, что с машины веб-сервера доступен сервер 1С по портам агента и менеджера кластера (по умолчанию 1540 и 1541) и диапазону портов рабочих процессов.
Шаг 1. Открываем WSDL опубликованного web-сервиса в браузере
Адрес собирается из трёх частей:
| Часть | Пример | Откуда взять |
|---|---|---|
| Сервер | http://srv-web | имя или IP машины с Apache/IIS |
| Имя публикации | /trade | поле «Имя» в диалоге публикации, атрибут base в vrd |
| Сервис | /ws/exchange.1cws или /ws/Exchange | адрес файла или имя сервиса в конфигурации |
Полный адрес: http://srv-web/trade/ws/exchange.1cws?wsdl. Браузер спросит логин и пароль — введите пользователя 1С.
Что означает результат:
- 📄 XML с корнем
definitions— веб-сервер, расширение 1С и аутентификация работают; - 🔒 повторный запрос пароля или 401 — неверный логин, пароль или у пользователя не задан пароль, а внешняя система его передаёт;
- ❓ 404 — неверное имя публикации или сервиса, либо сервис не отмечен при публикации;
- 💥 500 с текстом ошибки 1С — веб-расширение не смогло подключиться к базе (права на каталог, сервер 1С недоступен, нет лицензии).
Что смотреть внутри WSDL
WSDL — паспорт web-сервиса 1С. Из него внешняя система берёт всё, что нужно для вызова. Проверьте:
- targetNamespace — должно совпадать с «URI пространства имен» в свойствах сервиса. Если интегратор жалуется «не тот namespace», ответ здесь.
- operation — список операций. Если новой операции нет, конфигурация базы данных не обновлена.
- types — типы параметров и возврата. Параметр типа
stringвместо ожидаемой XDTO-структуры значит, что в свойствах параметра указан не тот тип. - soapAction в секции
binding— это значение нужно передавать в заголовке при ручном вызове по SOAP 1.1. - address location в секции
service— адрес, куда клиенты будут слать запросы.
Если сервис опубликован за прокси или NAT, в address location может оказаться внутренний адрес. Внешние клиенты, которые строят прокси по WSDL, будут стучаться туда и получать таймаут. В SoapUI и Postman адрес вызова можно поправить вручную.
Шаг 2. Тестовый вызов web-сервиса прямо из 1С
Самый быстрый способ проверить сервис изнутри — внешняя обработка с одной командой. Запускать её можно из любой базы, даже из той же самой. Код на сервере:
&НаСервере
Процедура ПроверитьСервисНаСервере()
АдресWSDL = "http://srv-web/trade/ws/exchange.1cws?wsdl";
Пользователь = "ws_exchange";
Пароль = "пароль";
Определения = Новый WSОпределения(АдресWSDL, Пользователь, Пароль);
Прокси = Новый WSПрокси(Определения,
"http://www.example.org/exchange", // URI пространства имен сервиса
"Exchange", // имя сервиса
"ExchangeSoap"); // имя точки подключения
Прокси.Пользователь = Пользователь;
Прокси.Пароль = Пароль;
Попытка
Ответ = Прокси.Ping("тест");
Сообщить("Ответ сервиса: " + Строка(Ответ));
Исключение
Сообщить("Ошибка вызова: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Пояснения к коду:
- 🔹
WSОпределенияскачивает и разбирает WSDL — если здесь ошибка, проблема в публикации или авторизации, а не в операции; - 🔹 имя точки подключения у сервисов 1С строится как имя сервиса плюс
Soap(SOAP 1.1) илиSoap12; точное значение — атрибутnameу элементаportв WSDL; - 🔹
Ping— имя операции из WSDL; параметры передаются как в обычную функцию; - 🔹 текст исключения содержит сообщение, которое вызвал код модуля сервиса — это первая подсказка при отладке.
Для постоянной интеграции вместо WSОпределения удобнее загрузить описание в конфигурацию: ветка Общие → WS-ссылки, команда добавления по адресу WSDL. Затем прокси создаётся одной строкой: WSСсылки.Exchange.СоздатьWSПрокси(ПространствоИмен, "Exchange", "ExchangeSoap"). Для разовой проверки внешняя обработка проще: она не меняет конфигурацию.
Шаг 3. Проверка web-сервиса 1С через SoapUI, Postman и curl
Сторонний клиент нужен, чтобы увидеть ровно то, что увидит внешняя система: сырой SOAP-конверт, заголовки, код ответа.
SoapUI
- Создайте проект:
File → New SOAP Project. - В поле
Initial WSDLвставьте адрес с?wsdl. Если WSDL закрыт паролем, сначала сохраните его из браузера в файл и укажите путь к файлу. - SoapUI создаст шаблоны запросов для каждой операции. Откройте нужный, заполните параметры вместо
?. - Внизу окна запроса откройте вкладку авторизации, выберите
Basic, введите логин и пароль, включите упреждающую отправку (Authenticate pre-emptively). - Отправьте запрос зелёной стрелкой. Справа появится ответ, на вкладке
Raw— HTTP-код и заголовки.
Postman
Postman не строит запросы по WSDL так удобно, как SoapUI, зато привычен многим разработчикам.
- метод
POST, адрес без?wsdl:http://srv-web/trade/ws/exchange.1cws; - вкладка
Authorization→Basic Auth; - заголовок
Content-Type: text/xml; charset=utf-8для SOAP 1.1 илиapplication/soap+xml; charset=utf-8для SOAP 1.2; - для SOAP 1.1 добавьте заголовок
SOAPActionсо значением из WSDL; - тело —
raw, тип XML, SOAP-конверт.
curl
Удобно для проверки прямо с сервера, где нет графического интерфейса. Сохраните конверт в файл ping.xml:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ex="http://www.example.org/exchange">
<soap:Body>
<ex:Ping>
<ex:Text>тест</ex:Text>
</ex:Ping>
</soap:Body>
</soap:Envelope>
И вызовите:
curl -i -u ws_exchange:пароль \
-H "Content-Type: text/xml; charset=utf-8" \
-H "SOAPAction: <значение soapAction из WSDL>" \
--data-binary @ping.xml \
http://srv-web/trade/ws/exchange.1cws
Ключ -i выводит заголовки ответа: сразу видно код 200, 401 или 500. Имена элементов внутри Ping — это имена параметров операции, как они указаны в WSDL.
| Инструмент | Когда брать | Ограничения |
|---|---|---|
| Обработка в 1С | проверка «1С — 1С», быстро | не показывает сырой XML |
| SoapUI | разбор WSDL, шаблоны запросов | тяжёлый, нужна Java |
| Postman | если команда уже им пользуется | конверт пишется руками |
| curl | проверка с сервера, скрипты | всё вручную, нужен шаблон конверта |
Шаг 4. Отладка модуля web-сервиса в Конфигураторе
Когда запрос доходит до 1С, но ответ неверный, нужно остановиться в коде операции. Вызов web-сервиса выполняется в отдельном сеансе, и отладчик сам к нему не цепляется.
- Разрешите отладку в публикации. В
default.vrdвнутри элементаpointдобавьте строку и перезапустите веб-сервер:
<debug enable="true" protocol="tcp" url="tcp://srv-debug"/>
Здесь srv-debug — машина, где открыт Конфигуратор. Если отладка в базе настроена по протоколу HTTP, укажите protocol="http" и адрес сервера отладки.
2. В Конфигураторе откройте Отладка → Подключение, нажмите Автоматическое подключение и отметьте тип Сеанс Web-сервиса.
3. Поставьте точку останова в процедуре операции модуля сервиса.
4. Отправьте запрос из SoapUI или обработки. Выполнение остановится на точке, дальше — пошагово, как в обычном коде.
Не оставляйте debug enable="true" в рабочей публикации. Отладка замедляет обработку запросов, а открытый порт отладки — лишняя дверь в базу. После проверки удалите строку и перезапустите веб-сервер в нерабочее время.
Когда клиент ждёт дольше таймаута
Пока вы стоите на точке останова, внешняя система не получает ответа. SoapUI и Postman по умолчанию ждут минуту и рвут соединение. Для долгой отладки увеличьте таймаут в настройках клиента или отлаживайте через обработку из Шага 2 — у конструктора WSПрокси есть параметр Таймаут в секундах.
Шаг 5. Где искать следы вызова: журнал регистрации и логи
Отладчик подключать не всегда можно, особенно на рабочей базе. Тогда идут по логам.
Журнал регистрации
Откройте журнал в режиме Предприятия или в Конфигураторе (Администрирование → Журнал регистрации). Отфильтруйте по пользователю интеграции и по приложению Web-сервис. Видно:
- 🟢 события начала и завершения сеанса — вызов дошёл до базы;
- 🔴 ошибки с текстом исключения и модулем, где оно возникло;
- 📝 записи, которые вы сами пишете кодом через
ЗаписьЖурналаРегистрации().
Последний пункт — главный приём для боевых сервисов. Пишите в журнал входящие параметры и результат каждой операции с отдельным именем события, например Обмен.Входящий. Через месяц, когда партнёр скажет «мы отправили, а у вас пусто», вы откроете журнал и увидите, приходил ли запрос.
Логи веб-сервера
Если в журнале регистрации пусто, запрос не дошёл до 1С. Смотрите логи веб-сервера:
- Apache —
error.logиaccess.logв каталогеlogsустановки Apache; - IIS —
C:\inetpub\logs\LogFiles, а также журнал событий Windows.
В access.log видно, был ли запрос и с каким кодом ответил сервер. В error.log — ошибки загрузки модуля 1С.
Технологический журнал
Для трудных случаев включают технологический журнал через файл logcfg.xml в каталоге conf платформы. Для поиска ошибок web-сервиса хватает событий исключений (EXCP). Журнал быстро растёт, поэтому включайте его на время проверки и ограничивайте срок хранения.
Ошибки при проверке web-сервиса и что они значат
Повторное использование сеансов
Если сервис вызывают часто, каждый вызов открывает новый сеанс 1С: это расход лицензий и времени на старт. В default.vrd у элемента ws есть атрибут reuseSessions. Значение autouse включает пул сеансов. Рядом задают sessionMaxAge — сколько секунд живёт неиспользуемый сеанс — и poolSize.
<ws pointEnableCommon="true" reuseSessions="autouse" sessionMaxAge="20" poolSize="10">
Учтите: при повторном использовании сеанс один на несколько вызовов, и значения, которые код запоминает в переменных модуля сеанса, переходят между запросами разных клиентов.