Почему при обращении к веб-сервису 1С возникает ошибка «Имя сервиса не задано» и как ее исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При публикации и отладке SOAP веб-сервисов в среде 1С:Предприятие 8.3 разработчики нередко сталкиваются с ситуацией, когда привычное обращение к сервису через веб-браузер возвращает ошибку «Имя сервиса не задано». При этом информационная база через веб-клиент открывается без сбоев, публикация на веб-сервере (Apache или IIS) выполнена штатно, но получить WSDL-описание или вызвать методы сервиса из внешних систем не удается. Разберем по шагам, почему возникает эта ошибка, как изменилось поведение платформы и как правильно настроить подключение сторонних клиентов.

Анализ механизма публикации и структуры файла default.vrd

Для начала проанализируем, как описывается публикация веб-сервисов в конфигурационном файле default.vrd. При ручном формировании или выгрузке из конфигуратора публикация SOAP-сервисов выглядит следующим образом:


<?xml version="1.0" encoding="UTF-8"?>
<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="/gos4"
        ib="Srvr="ad.reality:1741";Ref="gos4";">
    <ws publishExtensionsByDefault="true">
        <point name="InterfaceVersion"
                alias="InterfaceVersion.1cws"
                enable="true"
                reuseSessions="dontuse"
                sessionMaxAge="20"
                poolSize="10"
                poolTimeout="5"/>
        <point name="CreateStatementDepartments"
                alias="createsd.1cws"
                enable="true"
                reuseSessions="autouse"
                sessionMaxAge="20"
                poolSize="10"
                poolTimeout="5"/>
    </ws>
    <httpServices publishByDefault="false"/>
    <standardOdata enable="true"/>
</point>

Посмотрим на параметры секции ws. Атрибут name задает имя объекта метаданных веб-сервиса в дереве конфигурации 1С, а атрибут alias определяет виртуальный путь (псевдоним), по которому этот сервис слушает входящие сообщения.

Выясним причину ошибки «Имя сервиса не задано»

В более старых версиях платформы (8.1 и ранних сборках 8.2) при вводе в браузере ссылки вида http://хост/база/ws/InterfaceVersion.1cws веб-сервер мог автоматически перенаправлять пользователя на схему описания WSDL. Начиная с версии 8.3 механизм работы модуля расширения веб-сервера 1С изменился:

  1. Конечная точка SOAP (эндпоинт) рассчитана исключительно на прием пакетов методом HTTP POST.
  2. Если отправить на этот адрес запрос методом HTTP GET без дополнительных параметров, модуль расширения расценивает действие как некорректный вызов метода веб-сервиса без передачи имени операции и возвращает ошибку: «Имя сервиса не задано».
  3. Псевдоним с расширением .1cws больше не является физическим файлом на диске — это лишь виртуальный алиас в системе ресурсов платформы.

Решение 1. Корректное формирование ссылки на WSDL-описание

Разберем, как получить структуру XML-схемы WSDL в браузере или внешнем приложении. Чтобы модуль веб-сервера 1С вернул техническое описание контракта, необходимо явно запросить WSDL с помощью суффикса ?wsdl:

  1. Обращение по псевдониму (alias из vrd):
    http://127.0.0.1:8080/gos4/ws/InterfaceVersion.1cws?wsdl
  2. Прямое обращение по имени метаданных сервиса:
    http://127.0.0.1:8080/gos4/ws/InterfaceVersion?wsdl

Обратим внимание на регистр символов: путь /ws/, а также имена сервисов и их псевдонимов чувствительны к регистру, особенно при использовании веб-сервера Apache под любой операционной системой.

Решение 2. Настройка авторизации (Preemptive Authentication) в SoapUI

После получения корректной ссылки на WSDL разработчики часто сталкиваются со следующей проблемой: при попытке импортировать URL в утилиту тестирования (например, SoapUI) возникает ошибка авторизации, либо в Журнале регистрации 1С вовсе отсутствуют записи о попытке входа. Выясним причину такого поведения.

Классическая схема базовой аутентификации HTTP Basic Authentication работает так: клиент делает первоначальный запрос без заголовков, сервер отвечает кодом 401 Unauthorized с заголовком WWW-Authenticate, после чего клиент повторяет запрос с логином и паролем. Модуль веб-сервисов 1С при обращении к WSDL не всегда корректно инициирует challenge-запрос, из-за чего клиент завершает сессию с ошибкой, даже не попытавшись передать учетные данные.

Чтобы обойти эту проблему, применим упреждающую авторизацию (Preemptive Authentication), при которой учетные данные отправляются сразу в первом запросе:

  1. При создании проекта в SoapUI укажем учетные данные прямо в ссылке:
    http://Логин:Пароль@127.0.0.1:8080/gos4/ws/InterfaceVersion?wsdl
  2. Для глобального включения авторизации перейдем в меню SoapUI: Preferences → вкладка HTTP Settings → включим флаг Authenticate Preemptively.
  3. Для отдельного запроса в проекте откроем вкладку Auth в нижней части окна, выберем тип Basic, введем имя пользователя и пароль, а в выпадающем списке Pre-emptive auth выберем значение Authenticate preemptively.

Решение 3. Проверка настроек веб-серверов и прав доступа

Если после указания параметров запрос все равно не доходит до информационной базы, проверим окружение веб-сервера и настройки безопасности в 1С:

  1. Проброс заголовков в Apache: В конфигурационном файле httpd.conf убедимся, что включена передача заголовка авторизации в модуль 1С, добавив директиву:
    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
  2. Настройка IIS: В диспетчере IIS для каталога опубликованного приложения должна быть включена «Анонимная проверка подлинности» (Anonymous Authentication). Если включить встроенную проверку Windows или Basic на уровне IIS, веб-сервер будет перехватывать запросы до того, как они попадут к пользователям базы 1С.
  3. Пользователи в файле vrd: Если в параметре ib файла default.vrd указаны жестко заданные параметры Usr и Pwd, платформа всегда подключается под этой системной учетной записью. Если требуется персонализированная авторизация внешних систем, параметры Usr и Pwd из строки соединения следует удалить.
  4. Права в 1С: У пользователя базы данных, под которым выполняется вызов, в назначенных ролях обязательно должно быть установлено право «Использование» для вызываемого объекта Web-сервис.

Рассмотренный комплекс мер полностью решает проблемы с отображением WSDL-схемы веб-сервисов на платформе 1С:Предприятие 8.3 и обеспечивает стабильное взаимодействие с внешними SOAP-клиентами.

← На главную