При освоении механизмов интеграции через SOAP-технологии разработчики часто сталкиваются с ошибкой вида Сервис не найден. {URI_Пространства_Имен}:ИмяСервиса. Нередко возникает ощущение, что платформа 1С избирательно реагирует на названия адресов: с одними строками сервис подключается штатно, а с другими выдает сбой. Разберем по шагам, что представляет собой пространство имен в веб-сервисах 1С, почему схема URI не влияет на шифрование трафика и как гарантированно избавиться от ошибок сопоставления сервиса.
Проанализируем природу параметра URI пространства имен (в WSDL-схеме — targetNamespace). Главное заблуждение заключается в восприятии этого значения как реального сетевого адреса в интернете, по которому платформа 1С пытается перейти или отправить запрос. Это не так.
URI пространства имен — это чисто текстовый, уникальный строковый идентификатор XML-схемы. Он необходим лишь для того, чтобы исключить конфликты одинаковых имен типов и методов при интеграции различных систем. Выясним важные детали:
http:// или https:// в начале строки пространства имен — это просто формальный синтаксис стандарта W3C. Наличие https:// внутри URI никак не включает шифрование SSL/TLS. Безопасность передачи данных определяется исключительно параметрами веб-сервера (IIS или Apache) и протоколом фактической ссылки подключения.urn:enterprise1c:myservice:v1 является абсолютно корректным пространством имен.Рассмотрим, из-за каких факторов при инициализации WSПрокси или WSОпределения возникает ошибка обнаружения веб-сервиса:
WSСсылка файл описания сервиса сохраняется внутри конфигурации. Любые правки на стороне веб-сервиса требуют ручного обновления этой ссылки через контекстное меню.WSПрокси принимает строго определенный набор параметров: URI пространства имен, имя сервиса и имя точки подключения. Передача имени метода или операции вместо имени сервиса вызовет ошибку.Разберем последовательность действий, которая позволяет безошибочно запустить веб-сервис:
http://имя_сервера/база/ws/ИмяСервиса.1cws?wsdl. Находим атрибут targetNamespace в заголовке и сверяем его со строкой в вашем коде вызова.Посмотрим на практический пример кода, который защищает от ошибок опечаток в пространстве имен и именах точек подключения. Вместо ручного ввода строк прочитаем метаданные прямо из WSDL:
// Создаем объект определений на основе WSDL-манифеста
Определения = Новый WSОпределения("http://localhost/my_base/ws/ws_baza1.1cws?wsdl", ИмяПользователя, ПарольПользователя);
// Извлекаем сервис и точку подключения непосредственно из описания
Сервис = Определения.Сервисы[0];
ТочкаПодключения = Сервис.ТочкиПодключения[0];
// Создаем прокси динамически, исключая несовпадение пространств имен
Прокси = Новый WSПрокси(Определения, Сервис.URIПространстваИмен, Сервис.Имя, ТочкаПодключения.Имя);
Прокси.Пользователь = ИмяПользователя;
Прокси.Пароль = ПарольПользователя;
// Вызываем целевую операцию веб-сервиса
Результат = Прокси.ВыполнитьДействие();
Такой подход полностью снимает проблему несовпадения строк и гарантирует, что вызываемое пространство имен в точности соответствует манифесту, опубликованному на веб-сервере.