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

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

При разработке мобильных приложений на платформе 1С:Предприятие одной из наиболее часто встречающихся задач является организация обмена данными с центральной базой через веб-сервисы. Однако разработчики часто сталкиваются с неприятной особенностью: при публикации мобильного приложения или при генерации файла описания сервиса порт в адресе soapbind:address может бесследно исчезать. Это приводит к тому, что приложение не может достучаться до сервера, зависает или выдает ошибку «Превышено время ожидания». В этой статье мы подробно разберем, почему это происходит, и как правильно настроить доступ к веб-сервису, чтобы избежать подобных проблем.

Анализ причины возникновения ошибки

Разберем ситуацию: веб-сервис опубликован на нестандартном порту (например, 8080). В файле публикации default.vrd все указано верно, но мобильная платформа при обращении к сервису через статические WSСсылки игнорирует порт, пытаясь соединиться по стандартному 80-му порту. Это происходит из-за особенностей генерации WSDL-описания самой платформой 1С при публикации. Если в конфигурации используется жесткая привязка к WSСсылке, созданной в дереве конфигурации, то адрес внутри нее фиксируется в момент импорта WSDL. Любые изменения на стороне сервера (смена IP, порта или переход на HTTPS) потребуют пересборки расширения или конфигурации.

Проанализируем основные пути решения этой проблемы, начиная от простых правок «руками» до профессионального программного подхода.

Решение 1: Корректировка файла публикации default.vrd

Первым делом проверим, как веб-сервис описан в файле default.vrd на веб-сервере (IIS или Apache). Иногда автоматическая публикация из конфигуратора отрабатывает некорректно. Нам нужно убедиться, что секция ws содержит правильные параметры. Рассмотрим пример структуры:


<ws>
    <point name="MobileExchange"
           alias="mobile.1cws"
           enable="true"
           reuseSessions="autouse"
           sessionMaxAge="20"
           poolSize="10"
           poolTimeout="5"/>
</ws>

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

Решение 2: Динамическое создание WS-прокси

Наиболее надежным и правильным способом работы в мобильном приложении является отказ от статических WSСсылок в пользу программного создания объектов WSОпределения и WSПрокси. Это позволяет нам полностью контролировать строку подключения, включая адрес и порт. Разберем по шагам, как это реализовать.

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


Процедура ВыполнитьЗапросКСервису()
    
    // Получаем настройки из констант или справочника
    СерверАдрес = "192.168.1.100";
    ПортСервера = "8080";
    ИмяПубликации = "Base_Mobile";
    
    // Формируем полный путь к WSDL
    ПутьWSDL = "http://" + СерверАдрес + ":" + ПортСервера + "/" + ИмяПубликации + "/ws/MobileExchange?wsdl";
    
    Попытка
        // Создаем определение веб-сервиса
        // Используем таймаут для предотвращения зависания
        Определение = Новый WSОпределения(ПутьWSDL, "Пользователь1С", "Пароль1С", , 30);
        
        // Создаем прокси на основании определения
        // Параметры: Определение, ПространствоИмен, ИмяСервиса, ИмяТочкиПодключения
        Прокси = Новый WSПрокси(Определение, "http://www.mycompany.ru/mobile", "MobileExchange", "MobileExchangeSoap");
        
        // Устанавливаем авторизацию
        Прокси.Пользователь = "Пользователь1С";
        Прокси.Пароль = "Пароль1С";
        
        // Вызываем операцию сервиса
        Результат = Прокси.GetData();
        
    Исключение
        Инфо = ИнформацияОбОшибке();
        Сообщить("Ошибка вызова сервиса: " + ПодробноеОписаниеОшибки(Инфо));
    КонецПопытки;
    
КонецПроцедуры

В данном примере мы используем объект WSОпределения, который принимает в качестве первого параметра строку URL. Поскольку мы формируем её конкатенацией, порт никогда не потеряется. Обратите внимание на пятый параметр конструктора WSОпределения — это таймаут. Установка явного таймаута (например, 30 секунд) критически важна для мобильных устройств, работающих в нестабильных сетях.

Решение 3: Хранение адреса и порта в константах

Как справедливо отмечено в обсуждении, жесткое прописывание адресов в коде — плохая практика. Выясним причину: при переносе сервера или изменении проброса портов на роутере вам придется обновлять само мобильное приложение у всех пользователей. Правильнее всего вынести эти параметры в настройки.

Создадим в мобильной конфигурации константы АдресСервера, ПортСервера и ИспользоватьSSL. Тогда функция получения базового URL будет выглядеть так:


Функция ПолучитьБазовыйURL() Экспорт
    Протокол = ?(Константы.ИспользоватьSSL.Получить(), "https://", "http://");
    Адрес = Константы.АдресСервера.Получить();
    Порт = Константы.ПортСервера.Получить();
    
    Если ЗначениеЗаполнено(Порт) Тогда
        Возврат Протокол + Адрес + ":" + Формат(Порт, "ЧГ=0") + "/";
    Иначе
        Возврат Протокол + Адрес + "/";
    КонецЕсли;
КонецФункции

Проблемы авторизации и сетевые ограничения Android

Если после исправления проблемы с портом приложение начало выдавать ошибку авторизации, проанализируем настройки веб-сервера. Мобильная платформа 1С лучше всего работает с типом аутентификации Basic Authentication. Если на IIS включена только Windows Authentication (NTLM), мобильный клиент может не передать учетные данные корректно. Убедитесь, что в настройках виртуального каталога на IIS разрешена «Проверка подлинности Windows» и «Основная проверка подлинности».

Также стоит учитывать ограничения современных версий Android (начиная с версии 9.0). По умолчанию ОС запрещает передачу трафика в открытом виде (HTTP). Если ваш веб-сервис работает без SSL (по обычному HTTP), приложение может блокировать запросы на системном уровне. Выходом является либо переход на HTTPS, либо настройка файла network_security_config.xml при сборке приложения для разрешения cleartextTraffic.

Работа с драйверами в «1С:Мобильная касса»

Если ваша задача связана с «1С:Мобильная касса», и вы сталкиваетесь с тем, что приложение не запускается или не видит оборудование, проверьте состав сборки. Драйверы торгового оборудования — это внешние компоненты (библиотеки .so). При сборке APK-файла необходимо убедиться, что выбрана правильная архитектура процессора. Если вы собираете приложение только под ARMv8 (64-bit), а драйвер кассы существует только в 32-битном исполнении, он не загрузится. Рекомендуется включать обе архитектуры (ARMv7 и ARMv8) в настройках сборщика для максимальной совместимости.

В завершение отметим, что использование WSПрокси, созданного динамически через WSОпределения, в сочетании с хранением настроек в константах — это «золотой стандарт» разработки для мобильной платформы 1С. Это избавляет от проблем с портами, позволяет гибко управлять таймаутами и облегчает поддержку приложения в будущем.

← На главную