При разработке интеграций между мобильным приложением и основной информационной базой 1С разработчики часто сталкиваются с цепочкой типовых ошибок при настройке SOAP-сервисов: сначала веб-сервер возвращает код 404 Not Found, затем при создании прокси возникает исключение «Порт не найден», а на финальном этапе платформа сообщает о попытке передачи недопустимого объекта между клиентом и сервером. Разберем по шагам, как локализовать и последовательно устранить каждую из этих проблем.
Ошибка с кодом 404 при вызове конструктора WSОпределения означает, что веб-сервер (Apache или IIS) не может найти запрашиваемый ресурс по указанному URL-адресу. Выясним основные причины этой ситуации:
http://[Адрес_Сервера]/[ИмяПубликации]/ws/[ИмяСервиса].1cws?wsdl. Обратим внимание: имена публикации и сервиса чувствительны к регистру символов.default.vrd). Проверим файл default.vrd, расположенный в каталоге публикации веб-сервера. В секции веб-сервисов должно быть установлено разрешение на публикацию: либо общий атрибут <ws enable="true">, либо явное описание конкретного сервиса <service name="..." enable="true" publishName="..."/>.wsap24.dll для Apache 2.4). При несовпадении модуль не загружается, и запросы к .1cws завершаются ошибкой 404.default.vrd обязательно перезапустим службу веб-сервера.Для быстрой проверки работоспособности публикации введем сформированный адрес в адресную строку браузера на рабочем компьютере или воспользуемся специализированными утилитами (например, SoapUI). В ответ браузер должен отобразить корректную XML-структуру схемы WSDL.
Когда схема WSDL успешно получена, разработчики переходят к созданию объекта WSПрокси, где нередко возникает ошибка: «по причине: Порт не найден». Проанализируем сигнатуру конструктора объекта WSПрокси:
Конструктор принимает следующие параметры: Новый WSПрокси(Определения, URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения).
Четвертый параметр — ИмяТочкиПодключения (порт) — не является произвольной строкой или именем операции. В платформе 1С точка подключения формируется автоматически на основании имени веб-сервиса и версии протокола SOAP:
[ИмяСервиса]Soap.[ИмяСервиса]Soap12.Точное имя порта всегда можно проверить в тексте самой WSDL-схемы внутри тега <wsdl:port name="...">. Если в конфигурации сервис называется ZaprosOstatok, то в конструкторе прокси следует указывать "ZaprosOstatokSoap" или "ZaprosOstatokSoap12".
Объекты WSОпределения и WSПрокси являются несериализуемыми серверными типами данных. Попытка объявить переменную с прокси на клиенте, вернуть объект WSПрокси с сервера на клиент или передать его через параметры формы приводит к ошибке передачи недопустимого объекта между контекстами.
Рассмотрим правильную организацию работы: все операции по созданию определений, инициализации прокси и непосредственному вызову веб-сервиса должны полностью выполняться в серверной процедуре или функции (директива &НаСервере или &НаСервереБезКонтекста). На сторону клиента следует возвращать только готовые сериализуемые типы данных: строки, числа, структуры или массивы.
Посмотрим на практический пример реализации клиент-серверного взаимодействия в модуле формы мобильного приложения:
&НаКлиенте
Процедура ПолучитьНаименованиеПоАртикулу(Команда)
Если ПустаяСтрока(АртикулПоиска) Тогда
Предупреждение("Укажите артикул для поиска!");
Возврат;
КонецЕсли;
// Вызываем серверную функцию для обращения к Web-сервису
РезультатПоиска = ПолучитьДанныеНаСервере(АртикулПоиска);
Если РезультатПоиска.Успех Тогда
НаименованиеНоменклатуры = РезультатПоиска.Наименование;
Иначе
Сообщить(РезультатПоиска.ТекстОшибки);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДанныеНаСервере(Знач Артикул)
Результат = Новый Структура("Успех, Наименование, ТекстОшибки", Ложь, "", "");
АдресWSDL = "http://192.168.1.167/wsExchange/ws/ZaprosOstatok.1cws?wsdl";
URIПространстваИмен = "http://www.company.ru/wsExchange";
ИмяСервиса = "ZaprosOstatok";
ИмяТочкиПодключения = "ZaprosOstatokSoap12";
Попытка
// Инициализируем WSDL-описание сервиса с указанием таймаута соединения
Определения = Новый WSОпределения(АдресWSDL, "ПользовательWS", "ПарольWS", 10);
// Создаем прокси для выполнения операций
Прокси = Новый WSПрокси(Определения, URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения);
Прокси.Пользователь = "ПользовательWS";
Прокси.Пароль = "ПарольWS";
Прокси.Таймаут = 10;
// Вызываем операцию веб-сервиса
ОтветСервиса = Прокси.ПолучитьДанные(Артикул);
Результат.Успех = Истина;
Результат.Наименование = ОтветСервиса;
Исключение
Результат.ТекстОшибки = "Ошибка при обращении к веб-сервису: " + ОписаниеОшибки();
КонецПопытки;
Возврат Результат;
КонецФункции
Разберем дополнительные нюансы, которые необходимо учитывать при промышленной эксплуатации мобильных решений:
Новый WSОпределения(...) при каждом сетевом обращении загружает всю WSDL-схему по сети. В мобильных сетях это создает лишний трафик и задержки. Рекомендуется добавить в дерево метаданных объект WS-ссылка, содержащий статическую WSDL-схему, и создавать прокси сразу через WSСсылки[ИмяСсылки].СоздатьWSПрокси(...).Таймаут в конструкторах WSОпределения и объекте WSПрокси, чтобы приложение не зависало при отсутствии ответа от сервера.