Синхронизация между мобильными приложениями 1С и стационарными базами часто превращается в квест, особенно когда сервер находится за NAT и использует нестандартные порты (например, 10981 вместо 80). Распространенная ситуация: при проверке подключения в настройках 1С:Мобильная касса система сообщает об успехе, но при попытке реальной загрузки данных выдает ошибку связи, пытаясь достучаться до сервера по стандартному 80-му порту. Рассмотрим подробно, почему это происходит и как заставить мобильную платформу соблюдать заданные настройки.
Для начала проанализируем, почему кнопка Проверить подключение работает, а Загрузить данные — нет. В большинстве мобильных решений 1С проверка связи выполняется через простой HTTP-запрос к веб-серверу. Этот запрос отправляется по тому адресу и порту, который вы указали в строке подключения вручную. Если порт открыт и проброшен, сервер отвечает, и платформа подтверждает связь.
Однако при запуске процесса синхронизации логика меняется. Система начинает инициализировать объект WSОпределения. Для этого она обращается к WSDL-описанию сервиса. В этот момент в игру вступают механизмы формирования этого описания на стороне веб-сервера (Apache или IIS) и логика обработки URL в мобильной платформе.
Выясним причину подмены порта на уровне веб-сервера. Когда мобильное приложение запрашивает WSDL по адресу сервер:10981/ИМЯБАЗЫ/ws/EquipmentService?wsdl, веб-сервер генерирует XML-ответ. Внутри этого ответа, в самом конце, есть секция soap:address location. Именно там прописан фактический URL, по которому приложение должно вызывать методы сервиса.
Если веб-сервер настроен стандартным образом, он может не знать, что внешний запрос пришел через проброшенный порт 10981. В итоге в секции location он прописывает адрес без порта (подразумевая 80-й порт). Мобильная платформа 1С, получив этот WSDL, послушно переключается на указанный внутри него адрес, игнорируя то, что вы вводили в настройках приложения. Таким образом, обмен «сбрасывается» на порт 80.
Как это исправить на стороне веб-сервера:
default.vrd или через консоль управления) необходимо убедиться, что сервер корректно определяет свой внешний адрес.ServerName. В ней должен быть явно указан внешний адрес с портом: ServerName yourdomain.com:10981.Посмотрим на ситуацию со стороны основной базы. В конфигурации 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Прокси после его создания, но до вызова методов.
Если настройки портов в 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С:Мобильная касса чаще всего кроется не в самом приложении, а в содержимом WSDL-файла, который генерирует веб-сервер. Проверьте параметры публикации, укажите полный адрес с портом в настройках «Розницы» и, если это не помогает, используйте Nginx для трансляции портов.