Почему 1С:Мобильная касса игнорирует нестандартный порт при обмене через веб-сервис и как это исправить?

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

Синхронизация между мобильными приложениями 1С и стационарными базами часто превращается в квест, особенно когда сервер находится за NAT и использует нестандартные порты (например, 10981 вместо 80). Распространенная ситуация: при проверке подключения в настройках 1С:Мобильная касса система сообщает об успехе, но при попытке реальной загрузки данных выдает ошибку связи, пытаясь достучаться до сервера по стандартному 80-му порту. Рассмотрим подробно, почему это происходит и как заставить мобильную платформу соблюдать заданные настройки.

Разберем причину: разница между проверкой связи и инициализацией WS-соединения

Для начала проанализируем, почему кнопка Проверить подключение работает, а Загрузить данные — нет. В большинстве мобильных решений 1С проверка связи выполняется через простой HTTP-запрос к веб-серверу. Этот запрос отправляется по тому адресу и порту, который вы указали в строке подключения вручную. Если порт открыт и проброшен, сервер отвечает, и платформа подтверждает связь.

Однако при запуске процесса синхронизации логика меняется. Система начинает инициализировать объект WSОпределения. Для этого она обращается к WSDL-описанию сервиса. В этот момент в игру вступают механизмы формирования этого описания на стороне веб-сервера (Apache или IIS) и логика обработки URL в мобильной платформе.

Проанализируем проблему формирования WSDL-описания

Выясним причину подмены порта на уровне веб-сервера. Когда мобильное приложение запрашивает WSDL по адресу сервер:10981/ИМЯБАЗЫ/ws/EquipmentService?wsdl, веб-сервер генерирует XML-ответ. Внутри этого ответа, в самом конце, есть секция soap:address location. Именно там прописан фактический URL, по которому приложение должно вызывать методы сервиса.

Если веб-сервер настроен стандартным образом, он может не знать, что внешний запрос пришел через проброшенный порт 10981. В итоге в секции location он прописывает адрес без порта (подразумевая 80-й порт). Мобильная платформа 1С, получив этот WSDL, послушно переключается на указанный внутри него адрес, игнорируя то, что вы вводили в настройках приложения. Таким образом, обмен «сбрасывается» на порт 80.

Как это исправить на стороне веб-сервера:

  1. В настройках публикации на стороне веб-сервера (в файле default.vrd или через консоль управления) необходимо убедиться, что сервер корректно определяет свой внешний адрес.
  2. Для Apache проверьте директиву ServerName. В ней должен быть явно указан внешний адрес с портом: ServerName yourdomain.com:10981.
  3. Для IIS проверьте настройки привязок (Bindings) и убедитесь, что в файле конфигурации публикации 1С не переопределяются адреса без учета порта.

Настройка «Адреса публикации» в 1С:Розница

Посмотрим на ситуацию со стороны основной базы. В конфигурации 1С:Розница, которая выступает сервером, существуют настройки синхронизации с мобильными устройствами. Часто адрес публикации хранится в константах или параметрах узла обмена.

Если в 1С:Розница в поле Адрес публикации или Адрес веб-сервиса указана строка без порта, то при обмене сервер может передать эту строку мобильному клиенту в качестве параметра для следующего шага обмена. Проверьте, чтобы в базе-источнике адрес был прописан полностью, включая протокол и порт:

http://my-server.com:10981/base_name

Проанализируем программный код инициализации обмена

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

Типовой пример создания прокси-объекта:


мАдресМобильногоМоста = "http://my-server.com:10981/base_name";
Определение = Новый WSОпределения(мАдресМобильногоМоста + "/ws/synchro?wsdl"); 
Прокси = Новый WSПрокси(Определение, "http://www.1c.ru/SSL/Exchange", "Exchange", "ExchangeSoap");

Обратите внимание: если в мобильной платформе наблюдается баг парсера (что случалось в старых версиях 8.3.10-8.3.12), то при создании WSОпределения порт может отсекаться. В таких случаях программисты используют обходной путь: принудительное переопределение порта в объекте WSПрокси после его создания, но до вызова методов.

Использование Reverse Proxy (Nginx) как универсальное решение

Если настройки портов в 1С продолжают вести себя нестабильно, рассмотрим системный подход. Опытные администраторы рекомендуют использовать Nginx в качестве обратного прокси-сервера. Это решает проблему раз и навсегда.

Суть метода: Nginx принимает запросы на стандартном 80-м порту (или 443 для SSL) и перенаправляет их внутри вашей сети на порт 10981 вашего веб-сервера 1С. Для мобильного приложения адрес будет выглядеть стандартно, без портов, что исключает ошибки парсинга и проблемы с WSDL. Настройка в конфигурационном файле Nginx будет выглядеть примерно так:


server {
    listen 80;
    server_name your-domain.ru;
    location / {
        proxy_pass http://127.0.0.1:10981;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Это решение также повышает безопасность, так как вы не выставляете нестандартный порт 1С напрямую в интернет, а используете защищенный прокси.

Очистка кэша и обновление приложения

Выясним еще одну важную деталь. Мобильная платформа 1С активно кэширует WSDL-описания. Если вы сначала попытались настроиться на 80-й порт, а потом изменили его на 10981, приложение может продолжать использовать старую структуру из кэша.

Пошаговые действия для сброса кэша:

  1. Зайдите в настройки Android -> Приложения -> 1С:Мобильная касса.
  2. Нажмите «Остановить» (Force Stop).
  3. Перейдите в раздел «Память» и выберите Очистить кэш (важно: не нажимайте «Стереть данные», иначе настройки базы удалятся).
  4. Убедитесь, что вы используете последнюю версию мобильного приложения из Google Play или RuStore, так как в свежих релизах исправлено множество ошибок работы с сетью.

Подведем итог: проблема с игнорированием порта в 1С:Мобильная касса чаще всего кроется не в самом приложении, а в содержимом WSDL-файла, который генерирует веб-сервер. Проверьте параметры публикации, укажите полный адрес с портом в настройках «Розницы» и, если это не помогает, используйте Nginx для трансляции портов.

← На главную