Как настроить подключение к сайту по защищенному протоколу HTTPS в 1С и обработать перенаправление (код 301)

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

В современной разработке взаимодействие 1С с внешними веб-сервисами практически всегда происходит по защищенному протоколу HTTPS. Однако начинающие разработчики часто сталкиваются с ситуацией, когда запрос, успешно работающий в браузере, возвращает в 1С ошибку 400 (Bad Request) или код 301 (Moved Permanently). В рамках данной статьи мы подробно разберем, как правильно сконфигурировать защищенное соединение и научим систему корректно обрабатывать перенаправления.

Основы работы с защищенным соединением HTTPS

Для начала проанализируем базовый механизм создания HTTPСоединение. Главное отличие HTTPS от стандартного HTTP заключается в использовании SSL/TLS шифрования. В платформе 1С для включения этого режима используется специальный параметр в конструкторе соединения. Рассмотрим типовой пример настройки подключения к серверу:


// Создаем объект защищенного соединения
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// Инициализируем соединение с указанием порта 443 и объекта защиты
Соединение = Новый HTTPСоединение("ya.ru", 443, , , , 30, Защита);

Обратим внимание на важные детали. Параметр ЗащищенноеСоединениеOpenSSL() без аргументов заставляет 1С использовать системное хранилище сертификатов операционной системы. Для Windows это означает обращение к сертификатам, установленным в системе, а для Linux может потребоваться дополнительная настройка путей к файлу cacert.pem.

Проблема перенаправления: почему возникает код 301?

Часто при попытке обратиться к корню сайта (например, "/") сервер возвращает код состояния 301. Это не ошибка в привычном понимании, а указание на то, что ресурс перемещен. Браузеры обрабатывают это незаметно для пользователя, автоматически переходя по новому адресу. В 1С объект HTTPСоединение не умеет автоматически следовать за перенаправлениями, поэтому нам необходимо реализовать этот механизм программно.

Когда сервер возвращает 301, он обязательно передает заголовок Location, в котором указан новый URI. Проанализируем, как извлечь этот адрес и выполнить повторный запрос.

Реализация алгоритма обработки редиректа

Разберем по шагам создание универсального кода, который сможет получить содержимое страницы даже при наличии перенаправлений. Для разбора полученного URL удобно использовать методы типовых конфигураций (БСП), если они доступны, или реализовать парсинг строки самостоятельно.


&НаКлиенте
Процедура ПолучитьСтраницуСайтаСОбработкойРедиректа()
    
    СерверСайта = "santehsmart.ru";
    ПутьНаСервере = "/";
    
    // Шаг 1: Первичная попытка соединения
    Защита = Новый ЗащищенноеСоединениеOpenSSL();
    Соединение = Новый HTTPСоединение(СерверСайта, 443, , , , , Защита);
    Запрос = Новый HTTPЗапрос(ПутьНаСервере);
    
    Ответ = Соединение.Получить(Запрос);
    
    // Шаг 2: Проверка кода состояния
    Если Ответ.КодСостояния = 200 Тогда
        Сообщить("Данные успешно получены!");
        ТекстСтраницы = Ответ.ПолучитьТелоКакСтроку();
        
    ИначеЕсли Ответ.КодСостояния = 301 Или Ответ.КодСостояния = 302 Тогда
        
        // Выясним причину перенаправления и найдем новый адрес
        НовыйАдрес = Ответ.Заголовки.Получить("Location");
        Сообщить("Обнаружено перенаправление на: " + НовыйАдрес);
        
        // Шаг 3: Разбор нового адреса (URI)
        // Если используется БСП, можно применить ОбщегоНазначенияКлиентСервер.СтруктураURI
        СтруктураURI = СпарситьАдрес(НовыйАдрес); 
        
        // Шаг 4: Повторное подключение по новому адресу
        НовоеСоединение = Новый HTTPСоединение(СтруктураURI.Хост, СтруктураURI.Порт, , , , , Защита);
        НовыйЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере);
        
        ИтоговыйРезультат = НовоеСоединение.Получить(НовыйЗапрос);
        
        Если ИтоговыйРезультат.КодСостояния = 200 Тогда
            Сообщить("Данные получены после редиректа!");
            ТекстСтраницы = ИтоговыйРезультат.ПолучитьТелоКакСтроку();
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Важные нюансы при работе с HTTPS

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

  1. Заголовок User-Agent: Многие сайты блокируют запросы, если не указан клиент. Мы рекомендуем всегда добавлять имитацию браузера в заголовки запроса. Это поможет избежать ошибки 403 (Forbidden) или 400.
    
    Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/115.0.0.0 Safari/537.36");
    
  2. Таймауты: При работе с защищенными соединениями время на "рукопожатие" (Handshake) TLS всегда больше, чем при обычном HTTP. Не оставляйте таймаут равным нулю (бесконечность), установите разумные 30-60 секунд.
  3. Использование SNI: Если на одном IP-адресе сервера хостится несколько сайтов, 1С должна передать имя хоста в TLS-приветствии. Платформа 8.3 делает это автоматически, если в параметре "Сервер" указано доменное имя, а не IP-адрес. Никогда не используйте IP-адрес для HTTPS-соединений, если это не продиктовано специфическими требованиями безопасности.

Работа с сертификатами и OpenSSL

Проанализируем ситуацию, когда сайт использует самоподписанный сертификат. В этом случае стандартный Новый ЗащищенноеСоединениеOpenSSL() выдаст ошибку аутентификации. Если вы уверены в безопасности источника, проверку сертификата можно настроить:

Для игнорирования проверки цепочки сертификатов (только в целях отладки!), можно использовать конструктор с параметрами, передав пустые ссылки на сертификаты удостоверяющих центров. Однако правильный путь — добавить сертификат сайта в доверенные на уровне операционной системы или передать его явно в объект защиты 1С.

Заключение

Мы выяснили, что успешное подключение к HTTPS-сайту в 1С требует не только указания порта 443 и использования объекта ЗащищенноеСоединениеOpenSSL, но и готовности кода к обработке ответов сервера. Код 301 является стандартным поведением для многих веб-серверов (например, при переходе с http на https или с www на без-www), и ручная обработка заголовка Location — залог надежной работы вашего интеграционного решения.

← На главную