Интеграция различных информационных систем на платформе 1С:Предприятие 8 с помощью веб-сервисов (SOAP) — это классическое и надежное решение для настройки бесшовного обмена данными. Однако в процессе разработки программисты часто сталкиваются с неочевидными ошибками платформы при инициализации объектов подключения. Одна из самых распространенных проблем — ошибка «Сервис не найден» при вызове метода СоздатьWSПрокси.
В этой статье мы подробно разберем, почему возникает эта ошибка, как правильно сопоставить параметры веб-сервиса, где найти корректное пространство имен (URI) в конфигурации и как написать надежный код для статического и динамического подключения к веб-сервисам.
Рассмотрим типовую ситуацию. Разработчик импортирует стороннюю WSDL-ссылку в ветку метаданных «Общие — WS-ссылки» своей конфигурации. Импорт проходит успешно, структура веб-сервиса, его операции и параметры отлично видны в дереве метаданных. Однако при попытке программно обратиться к этой ссылке и создать прокси-класс система выдает исключение:
{ОбщийМодуль.ВебСервисы.Модуль(3)}: Ошибка при вызове метода контекста (СоздатьWSПрокси): Сервис не найден
Выясним первопричину этой проблемы. Ошибка происходит из-за неверного понимания сигнатуры метода СоздатьWSПрокси. Давайте проанализируем синтаксис этого метода платформы:
Прокси = WSСсылки.ИмяWSСсылки.СоздатьWSПрокси(
ПространствоИмен,
ИмяСервиса,
ИмяТочкиПодключения
);
Основные параметры метода:
http://server/base/ws/service.1cws?wsdl). Это ключевая ошибка! URL-адрес публикации и логическое пространство имен веб-сервиса — это совершенно разные вещи.licenseSoap или имя_сервисаSoap).Если в качестве первого параметра (Пространства имен) передается некорректная строка, платформа не сможет сопоставить ее со схемой WSDL и выбросит исключение «Сервис не найден».
Разберем по шагам, как определить корректные параметры для успешного создания прокси-соединения:
Обратите внимание: это значение может выглядеть как произвольная строка (например, просто license или http://www.company.ru/crm). Оно не обязано быть реально существующей ссылкой в интернете — это лишь уникальный текстовый идентификатор схемы данных.
Если у вас нет доступа к конфигуратору базы-источника, вы можете посмотреть это свойство прямо в базе-приемнике. Для этого разверните вашу импортированную WS-ссылку в дереве метаданных Конфигуратора, выделите сам веб-сервис внутри нее и посмотрите его свойства. В строке «URI пространства имен» будет указано точное значение.
Рассмотрим пример правильного кода инициализации статического прокси:
// Пример корректного создания прокси на основе статической WS-ссылки
ПространствоИмен = "http://www.company.ru/license"; // Взято из свойств веб-сервиса
ИмяСервиса = "license";
ИмяТочки = "licenseSoap";
// Создаем прокси-объект
Прокси = WSСсылки.WSlicense.СоздатьWSПрокси(ПространствоИмен, ИмяСервиса, ИмяТочки);
// Задаем параметры авторизации (учетные данные пользователя базы-источника)
Прокси.Пользователь = "Администратор";
Прокси.Пароль = "СекретныйПароль123";
// Теперь мы можем вызывать методы сервиса
Результат = Прокси.ПолучитьСтатусЛицензии();
Хотя использование статических WS-ссылок в дереве метаданных выглядит простым, на практике этот метод имеет серьезный недостаток. Схема веб-сервиса (структура методов, параметры, типы данных XDTO) «зашивается» в конфигурацию в момент импорта. Если разработчики удаленной базы изменят состав параметров веб-сервиса или даже просто обновят пространство имен, ваша интеграция мгновенно сломается. Для исправления ситуации придется открывать Конфигуратор, обновлять WS-ссылку вручную и выполнять обновление конфигурации базы данных.
Чтобы избежать этих проблем и сделать интеграцию гибкой, мы рекомендуем использовать динамическое создание WS-прокси через объект WSОпределения. В этом случае WSDL-описание схемы скачивается непосредственно в момент обращения к сервису.
Давайте посмотрим на практический пример динамического подключения:
// Адрес публикации веб-сервиса с суффиксом ?wsdl
АдресПубликации = "http://192.168.1.100/trade_base/ws/license.1cws?wsdl";
Логин = "IntegrationUser";
Пароль = "Pass123456";
Попытка
// Шаг 1. Динамически загружаем описание схемы WSDL
Определения = Новый WSОпределения(АдресПубликации, Логин, Пароль);
// Шаг 2. Создаем WS-прокси, передавая объект определений
// Пространство имен, имя сервиса и точку подключения берем из структуры описания
ПространствоИмен = "http://www.company.ru/license";
ИмяСервиса = "license";
ИмяТочки = "licenseSoap";
Прокси = Новый WSПрокси(Определения, ПространствоИмен, ИмяСервиса, ИмяТочки);
// Передаем авторизационные данные для выполнения самих операций
Прокси.Пользователь = Логин;
Прокси.Пароль = Пароль;
// Выполняем удаленный метод
Результат = Прокси.ПроверитьПодключение();
Сообщить("Успешное подключение: " + Результат);
Исключение
Сообщить("Ошибка инициализации веб-сервиса: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки
При разработке интеграционных механизмов на современных версиях платформы 1С:Предприятие (начиная с релизов 8.3.20 и выше) необходимо учитывать ряд архитектурных изменений и требований безопасности:
ОбщегоНазначения.СоздатьWSПрокси(Параметры)
КэшПрограммныхИнтерфейсов, а также автоматически применяет системные настройки прокси-серверов.
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Определения = Новый WSОпределения(АдресHTTPS, Логин, Пароль, , , ЗащищенноеСоединение);
HTTP 401 Unauthorized.
Хотя веб-сервисы на протоколе SOAP (с использованием XML и XDTO) до сих пор активно поддерживаются и используются в экосистеме 1С, современным стандартом разработки становятся HTTP-сервисы (REST API).
HTTP-сервисы передают данные в легком формате JSON, не требуют сложного сопоставления пространств имен и генерации жестких схем WSDL, а также работают значительно быстрее за счет меньшего объема передаваемого служебного трафика. Если вы проектируете новую интеграционную схему между конфигурациями с нуля, рекомендуем сделать выбор в пользу HTTP-сервисов — это избавит вас от большинства проблем с несовместимостью пространств имен, кэшированием определений и долгим разбором тяжелых XML-пакетов. Для быстрой реализации такого решения можно использовать конструктор API для организации обмена в формате JSON.