Как правильно задать пространство имен для веб-сервиса в 1С и исправить ошибку «Сервис не найден»?

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

При освоении механизмов интеграции через SOAP-технологии разработчики часто сталкиваются с ошибкой вида Сервис не найден. {URI_Пространства_Имен}:ИмяСервиса. Нередко возникает ощущение, что платформа 1С избирательно реагирует на названия адресов: с одними строками сервис подключается штатно, а с другими выдает сбой. Разберем по шагам, что представляет собой пространство имен в веб-сервисах 1С, почему схема URI не влияет на шифрование трафика и как гарантированно избавиться от ошибок сопоставления сервиса.

Что такое пространство имен веб-сервиса и как оно работает

Проанализируем природу параметра URI пространства имен (в WSDL-схеме — targetNamespace). Главное заблуждение заключается в восприятии этого значения как реального сетевого адреса в интернете, по которому платформа 1С пытается перейти или отправить запрос. Это не так.

URI пространства имен — это чисто текстовый, уникальный строковый идентификатор XML-схемы. Он необходим лишь для того, чтобы исключить конфликты одинаковых имен типов и методов при интеграции различных систем. Выясним важные детали:

  1. Протоколы в URI: Префикс http:// или https:// в начале строки пространства имен — это просто формальный синтаксис стандарта W3C. Наличие https:// внутри URI никак не включает шифрование SSL/TLS. Безопасность передачи данных определяется исключительно параметрами веб-сервера (IIS или Apache) и протоколом фактической ссылки подключения.
  2. Альтернативный синтаксис URN: Чтобы не путать себя и коллег интернет-ссылками, пространство имен можно объявлять через схему URN. Например, значение urn:enterprise1c:myservice:v1 является абсолютно корректным пространством имен.
  3. Требование бинарной идентичности: Платформа 1С выполняет поиск сервиса по посимвольному соответствию строк. Значения с завершающим слэшем и без него являются двумя совершенно разными пространствами имен. Чувствительность к регистру и пробелам также абсолютная.

Основные причины ошибки «Сервис не найден»

Рассмотрим, из-за каких факторов при инициализации WSПрокси или WSОпределения возникает ошибка обнаружения веб-сервиса:

  1. Рассинхронизация файла публикации (default.vrd): Если вы создали веб-сервис или изменили его имя в дереве метаданных, эти изменения не попадут на веб-сервер автоматически. Пока не будет выполнена повторная публикация базы, веб-сервер просто не зарегистрирует новую точку входа.
  2. Кэширование WSDL-описания: Веб-серверы IIS и Apache кэшируют манифесты WSDL. Если изменить пространство имен в конфигураторе и сразу вызвать сервис, сервер может продолжать отдавать старый кэшированный файл со старым пространством.
  3. Устаревшая статическая WS-ссылка: При использовании объекта метаданных WSСсылка файл описания сервиса сохраняется внутри конфигурации. Любые правки на стороне веб-сервиса требуют ручного обновления этой ссылки через контекстное меню.
  4. Путаница между сервисом, операцией и точкой подключения: Конструктор WSПрокси принимает строго определенный набор параметров: URI пространства имен, имя сервиса и имя точки подключения. Передача имени метода или операции вместо имени сервиса вызовет ошибку.

Пошаговый алгоритм правильной настройки и диагностики

Разберем последовательность действий, которая позволяет безошибочно запустить веб-сервис:

  1. Задаем свойства в метаданных: В ветке «Веб-сервисы» конфигуратора указываем осмысленное имя сервиса и задаем уникальное пространство имен без случайных пробелов на конце.
  2. Выполняем публикацию: Открываем меню «Администрирование — Публикация на веб-сервере», проверяем флажки напротив нужного веб-сервиса и нажимаем кнопку «Опубликовать». При необходимости перезапускаем службу веб-сервера или пул приложений.
  3. Проверяем WSDL в браузере: Открываем адрес публикации вида http://имя_сервера/база/ws/ИмяСервиса.1cws?wsdl. Находим атрибут targetNamespace в заголовке и сверяем его со строкой в вашем коде вызова.

Динамическое создание WSПрокси без жестко заданных строк

Посмотрим на практический пример кода, который защищает от ошибок опечаток в пространстве имен и именах точек подключения. Вместо ручного ввода строк прочитаем метаданные прямо из WSDL:


// Создаем объект определений на основе WSDL-манифеста
Определения = Новый WSОпределения("http://localhost/my_base/ws/ws_baza1.1cws?wsdl", ИмяПользователя, ПарольПользователя);

// Извлекаем сервис и точку подключения непосредственно из описания
Сервис = Определения.Сервисы[0];
ТочкаПодключения = Сервис.ТочкиПодключения[0];

// Создаем прокси динамически, исключая несовпадение пространств имен
Прокси = Новый WSПрокси(Определения, Сервис.URIПространстваИмен, Сервис.Имя, ТочкаПодключения.Имя);
Прокси.Пользователь = ИмяПользователя;
Прокси.Пароль = ПарольПользователя;

// Вызываем целевую операцию веб-сервиса
Результат = Прокси.ВыполнитьДействие();

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

← На главную