Почему не синхронизируется мобильное приложение 1С:УНФ за NAT и как исправить ошибку 404?

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

При организации удаленной работы с мобильными приложениями 1С (например, мобильным клиентом или приложением «1С:Управление нашей фирмой») системные администраторы часто сталкиваются с ситуацией, когда обычный веб-клиент в браузере работает без нареканий, а мобильное приложение выдает ошибку вида:

Ошибка при вызове метода контекста {ОтправитьПакетОбменаВСервис} - При вызове веб-сервиса произошла ошибка... HTTP Status 404 Not Found

При этом в тексте ошибки видно, что запрос отправляется не на опубликованный IIS или Apache внутри локальной сети, а на веб-сервер внешнего хоста (шлюза), теряя указанный при подключении нестандартный порт. Проанализируем, почему это происходит и как правильно настроить сетевую инфраструктуру.

Выясним причину ошибки: разница между веб-клиентом и SOAP-сервисами

Разберем детально механизм взаимодействия мобильного приложения с платформой «1С:Предприятие»:

  1. Работа веб-клиента: Обычный браузер при подключении пользователя работает с относительными путями. Если вы обратились по адресу с нестандартным портом, браузер сохраняет этот контекст и выполняет все последующие запросы к тому же адресу и порту, поэтому трансляция портов (PAT) вида внешний_IP:7772 -> локальный_IP:80 работает стабильно.
  2. Работа SOAP веб-сервисов: Мобильное приложение использует опубликованный веб-сервис (в случае УНФ — MobileService). На первом этапе мобильное устройство успешно запрашивает WSDL-описание сервиса по указанному адресу с внешним портом.
  3. Генерация конечной точки (endpoint): Модуль расширения веб-сервера 1С динамически генерирует файл WSDL. Внутри WSDL содержится элемент soap:address location="...", указывающий абсолютный URL, куда клиент обязан отправлять вызовы методов (например, ОтправитьПакетОбменаВСервис). Веб-сервер (IIS или Apache) передает платформе 1С свой локальный номер порта (внутренний 80-й порт).
  4. Потеря порта: Платформа 1С формирует WSDL, в котором для 80-го порта номер порта в URL опускается (так как 80 — стандартный порт HTTP). Мобильное приложение парсит этот адрес и последующие вызовы отправляет уже на 80-й порт хоста/шлюза, минуя правило трансляции портов. В итоге запрос попадает на веб-сервер хоста (например, Apache на Linux), где база не опубликована, и сервер возвращает ошибку HTTP 404 Not Found.

Способ 1. Симметричный проброс портов (выравнивание внешнего и внутреннего порта)

Рассмотрим самый простой способ обойти проблему генерации адреса в WSDL. Если мы используем один и тот же номер порта снаружи и внутри сети, веб-сервер передаст модулю 1С правильный порт, и он попадет в WSDL-схему.

Разберем по шагам настройку на примере IIS:

  1. Откроем Диспетчер служб IIS на сервере, где опубликована база 1С.
  2. В дереве подключений выберем сайт, на котором выполнена публикация (по умолчанию Default Web Site).
  3. В правой панели действий нажмем Привязки... (Bindings).
  4. Добавим новую привязку для протокола HTTP с указанием внешнего нестандартного порта (например, 7772) или изменим существующую.
  5. На внешнем маршрутизаторе или гипервизоре настроим правило NAT/PAT так, чтобы внешний порт 7772 перенаправлялся на внутренний порт 7772 виртуальной машины (симметричная трансляция 1 к 1).

После этого при запросе WSDL платформа 1С увидит локальный порт 7772, включит его в адрес soap:address location, и мобильное приложение сможет успешно выполнять обмен.

Способ 2. Настройка Reverse Proxy на базе Apache или Nginx

Если на внешнем хосте уже запущен веб-сервер (например, Apache на Ubuntu), оптимальным архитектурным решением будет использование его в качестве обратного прокси-сервера (Reverse Proxy). В этом случае отпадает необходимость открывать нестандартные порты наружу.

Проанализируем конфигурацию Apache на хосте:

  1. Включим необходимые модули проксирования на сервере Ubuntu:
    
    sudo a2enmod proxy
    sudo a2enmod proxy_http
    sudo systemctl restart apache2
    
  2. В конфигурационном файле виртуального хоста Apache добавим директивы проксирования запросов к базе 1С на внутренний IIS:
    
    <VirtualHost *:80>
        ServerName erp.example.com
    
        ProxyPreserveHost On
        ProxyPass /test_unf1/ http://192.168.1.50/test_unf1/
        ProxyPassReverse /test_unf1/ http://192.168.1.50/test_unf1/
    </VirtualHost>
    

Директива ProxyPreserveHost On передает оригинальный заголовок хоста во внутренний IIS, что позволяет платформе 1С корректно сформировать пути для мобильного клиента.

Способ 3. Переход на защищенный протокол HTTPS со стандартным портом 443

Для мобильных приложений настоятельно рекомендуется использовать защищенное соединение. Поскольку порт 443 является стандартным для HTTPS, при его использовании порт не подставляется в URL, что полностью исключает конфликты трансляции адресов.

Разберем схему настройки:

  1. На внешнем веб-сервере (хосте) настраиваем SSL-сертификат (например, бесплатный Let's Encrypt).
  2. Настраиваем терминацию SSL на внешнем веб-сервере, проксируя расшифрованный HTTP-трафик на локальный IIS виртуальной машины.
  3. В настройках мобильного приложения указываем защищенный адрес вида https://server.domain.ru/test_unf1 без указания портов.

В результате мобильное приложение работает по безопасному каналу, а модуль веб-сервисов 1С формирует корректные конечные точки без потери портов.

← На главную