Как исправить ошибку «нет интернет подключения» при выполнении HTTP-запросов в мобильном приложении 1С?

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

При разработке мобильных приложений на платформе 1С:Предприятие часто возникает ситуация, когда устройство подключено к сети (Wi-Fi или мобильные данные работают корректно), но при попытке выполнить программный код обмена данными возникает ошибка соединения. Особенно часто это происходит при попытке интеграции с внешними API, такими как брокеры сообщений (RabbitMQ, CloudAMQP) или веб-сервисы, работающие по протоколу HTTPS.

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

Анализ исходного кода и диагностика проблемы

Давайте рассмотрим код, который вызывал ошибку. Автор пытался отправить POST-запрос в сервис CloudAMQP, используя полный URL в конструкторе соединения. Вот фрагмент проблемного кода:


// ОШИБОЧНЫЙ ПОДХОД
APIURL = "https://mustang.rmq.cloudamqp.com/api/exchanges/rcskgwio/agent001_exchange/publish";
HTTPRequest = Новый HTTPЗапрос(APIURL);
HTTPConnection = Новый HTTPСоединение("mustang.rmq.cloudamqp.com");
Response = HTTPConnection.ОтправитьДляОбработки(HTTPRequest);

На первый взгляд может показаться, что параметры заданы, но при выполнении этого кода на мобильном устройстве (и часто на ПК) платформа возвращает ошибку, интерпретируемую как отсутствие интернета. Разберем основные причины этого поведения по порядку.

Ошибка 1: Некорректное разделение адреса (URL)

Первая и самая заметная ошибка заключается в том, как формируются объекты HTTPСоединение и HTTPЗапрос. Платформа 1С строго разграничивает понятие "Сервер" (хост) и "Ресурс" (путь к файлу или методу API).

Когда мы передаем полный URL в HTTPЗапрос при уже созданном соединении, или пытаемся использовать протокол (https://) внутри имени сервера, веб-сервер на той стороне может не понять структуру заголовков, которые генерирует 1С.

Правило разделения:

  1. В конструктор HTTPСоединение передается только адрес сервера (доменное имя или IP). Без протокола (http/https) и без пути.
  2. В конструктор HTTPЗапрос передается только относительный путь к ресурсу (все, что идет после доменного имени).

Давайте исправим структуру:


// Правильное разделение
Сервер = "mustang.rmq.cloudamqp.com";
Ресурс = "/api/exchanges/rcskgwio/agent001_exchange/publish";

Соединение = Новый HTTPСоединение(Сервер); // Пока без SSL, об этом ниже
Запрос = Новый HTTPЗапрос(Ресурс);

Ошибка 2: Отсутствие параметров защищенного соединения (SSL)

Это критическая ошибка, из-за которой соединение с https:// адресами гарантированно не будет работать или будет "висеть" до таймаута. В исходном коде URL начинается с https, что подразумевает шифрование. Однако конструктор HTTPСоединение по умолчанию пытается установить связь через 80-й порт (незащищенный HTTP).

Сервер CloudAMQP, как и большинство современных API, отклоняет незащищенные соединения или перенаправляет их, но 1С не всегда корректно обрабатывает редиректы без явных настроек.

Чтобы работать с HTTPS, нам необходимо передать в конструктор соединения объект ЗащищенноеСоединениеOpenSSL. Для мобильных устройств это особенно важно, так как требования к безопасности там выше.

Давайте создадим корректный объект соединения:


// Обязательно для HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

// 443 - стандартный порт для HTTPS
Соединение = Новый HTTPСоединение(
    "mustang.rmq.cloudamqp.com", // Сервер
    443,                           // Порт
    ,                              // Пользователь (не для Basic Auth, а для прокси)
    ,                              // Пароль (не для Basic Auth)
    ,                              // Прокси
    10,                            // Таймаут в секундах
    ЗащищенноеСоединение           // Объект SSL
);

Ошибка 3: Проблемы с сертификатами на мобильных устройствах

Даже если код написан верно, на мобильном устройстве может возникнуть ошибка "соединение разорвано" или "сертификат недействителен". Это связано с тем, что список доверенных корневых сертификатов на старых версиях Android или iOS может быть устаревшим.

Сервисы типа CloudAMQP часто используют сертификаты от Let's Encrypt. Если мобильная ОС старая, она может не доверять этому центру сертификации. В контексте разработки и тестирования можно попытаться использовать сертификат клиента или обновить ОС, но программно в 1С мы должны быть уверены, что используем корректный системный сертификат или файл сертификата, если это требуется спецификой корпоративной сети.

Ошибка 4: Разрешения мобильного приложения

Если приложение собирается в "Сборщике мобильных приложений" или разрабатывается через мобильную платформу, необходимо проверить манифест прав доступа. Операционная система Android блокирует доступ в сеть для приложений, которые явно этого не запросили.

Что нужно проверить:

  1. Откройте свойства корня конфигурации.
  2. Перейдите в раздел "Мобильное приложение".
  3. Убедитесь, что установлены галочки напротив разрешений "Интернет" (Internet) и "Состояние сети" (Access Network State).

Ошибка 5: Формирование тела запроса (JSON)

В исходном примере автор собирает JSON вручную, склеивая строки. Это крайне ненадежный подход. Если в переменных QueueName или MessageBody окажутся кавычки, переносы строк или спецсимволы, структура JSON нарушится (станет невалидной). Сервер вернет ошибку 400 Bad Request, которую разработчик может ошибочно принять за проблему соединения.

Рассмотрим правильный способ формирования JSON с использованием встроенных объектов платформы ЗаписьJSON:


// Подготовка данных
СтруктураJSON = Новый Структура;
СтруктураJSON.Вставить("properties", Новый Структура);
СтруктураJSON.Вставить("routing_key", QueueName);
СтруктураJSON.Вставить("payload", MessageBody);
СтруктураJSON.Вставить("payload_encoding", "string");

// Сериализация в строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураJSON);
ТелоЗапроса = ЗаписьJSON.Закрыть();

Итоговое правильное решение

Теперь объединим все исправления в единый рабочий блок кода, который будет корректно работать как на ПК, так и на мобильном устройстве. Обратите внимание на использование КодировкаТекста.UTF8 при установке тела запроса — это стандарт для JSON-обмена.


// 1. Определение данных подключения
Сервер = "mustang.rmq.cloudamqp.com";
Ресурс = "/api/exchanges/rcskgwio/agent001_exchange/publish";
Пользователь = "ваш_логин";
Пароль = "ваш_пароль";

// 2. Формирование тела JSON безопасным способом
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("properties", Новый Структура);
СтруктураДанных.Вставить("routing_key", "test_queue"); // Пример очереди
СтруктураДанных.Вставить("payload", "Привет, мир!");
СтруктураДанных.Вставить("payload_encoding", "string");

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
СтрокаJSON = ЗаписьJSON.Закрыть();

// 3. Создание защищенного соединения
// Важно: порт 443 и ЗащищенноеСоединениеOpenSSL
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443, , , , 15, ЗащищенноеСоединение);

// 4. Подготовка заголовков и запроса
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");

// Basic Authentication
// Для корректной работы Base64 строку лучше перевести в ДвоичныеДанные, затем кодировать
СтрокаAuth = Пользователь + ":" + Пароль;
Двоичные = ПолучитьДвоичныеДанныеИзСтроки(СтрокаAuth);
AuthHeader = "Basic " + Base64Строка(Двоичные); 
// Примечание: функция Base64Строка может возвращать переносы строк, их нужно удалить
AuthHeader = СтрЗаменить(AuthHeader, Символы.ПС, "");
AuthHeader = СтрЗаменить(AuthHeader, Символы.ВК, "");

Заголовки.Вставить("Authorization", AuthHeader);

Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);

// 5. Выполнение запроса с обработкой ошибок
Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        Сообщить("Успешно: " + Ответ.ПолучитьТелоКакСтроку());
    Иначе
        // Обработка логических ошибок (нет прав, неверная очередь и т.д.)
        Сообщить("Ошибка сервера: " + Ответ.КодСостояния + Символы.ПС + Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;
    
Исключение
    // Обработка физических ошибок соединения
    ОписаниеОшибки = ИнформацияОбОшибке().Описание;
    Сообщить("Не удалось установить соединение: " + ОписаниеОшибки);
КонецПопытки;

Дополнительные рекомендации по CloudAMQP

В случае работы с RabbitMQ через CloudAMQP, обратите внимание на часть URL: /rcskgwio/. Это имя виртуального хоста (vhost). Убедитесь, что:

  1. Пользователь, указанный в Basic Auth, имеет права на доступ к этому vhost.
  2. Vhost действительно существует.
  3. Вы не перепутали имя vhost и имя пользователя (в CloudAMQP они часто совпадают, но не всегда).

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

← На главную