Как правильно настроить HTTPS-соединение в 1С и победить ошибку 301 Moved Permanently?

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

При интеграции 1С с внешними веб-ресурсами или парсинге веб-страниц разработчики часто сталкиваются с ситуацией, когда сервер возвращает код состояния 301 Moved Permanently или возникает ошибка Couldn't resolve host name. Разберем по шагам, почему возникают эти проблемы, как корректно инициализировать объект HTTPСоединение для работы по защищенному протоколу HTTPS и как правильно обрабатывать перенаправления (редиректы).

Причина 1: Некорректное указание имени хоста в конструкторе HTTPСоединение

Проанализируем распространенную ошибку: указание протокола https:// или http:// непосредственно в строке адреса сервера в конструкторе HTTPСоединение.

Синтаксис-помощник платформы 1С четко регламентирует назначение первого параметра конструктора: это имя хоста (доменное имя или IP-адрес). Указание схемы протокола (http:// или https://) внутри первого параметра приводит к тому, что сетевая подсистема платформы пытается разрешить имя вида https://example.com как единый хост. В результате возникает исключение:

Ошибка работы с Интернет: Couldn't resolve host name

Для включения шифрования SSL/TLS протокол в строке не пишется, а передается специальный объект в соответствующий параметр конструктора.

Причина 2: Отсутствие объекта ЗащищенноеСоединениеOpenSSL

В платформе 1С:Предприятие 8.3 для установки защищенного соединения по протоколу HTTPS используется объект ЗащищенноеСоединениеOpenSSL. Если попытаться отправить запрос к HTTPS-серверу без указания данного объекта, веб-сервер либо отклонит подключение, либо вернет HTTP-код перенаправления 301 (редирект с незащищенного HTTP на защищенный HTTPS).

Посмотрим на пример правильной инициализации безопасного соединения:


// 1. Указываем только имя хоста без http:// или https://
СерверИсточник = "www.trial-market.ru";
ОтносительныйАдрес = "/sredstva-dlya-kukhni-i-kukhonnoj-tekhniki/sredstva-dlya-kukhni/sredstvo-dlya-kukhni-mister-muskul-450ml-kurok.html";

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

// 3. Передаем SSL в параметр ЗащищенноеСоединение конструктора HTTPСоединение
// Параметры: Сервер, Порт, Пользователь, Пароль, Прокси, Таймаут, ЗащищенноеСоединение
Соединение = Новый HTTPСоединение(СерверИсточник, , , , , , SSL);

// 4. Формируем и отправляем запрос
Запрос = Новый HTTPЗапрос(ОтносительныйАдрес);
Ответ = Соединение.Получить(Запрос);

КодСостояния = Ответ.КодСостояния;

Причина 3: Обработка кодов перенаправления (301, 302, 307, 308)

В отличие от веб-браузеров, нативный объект 1С HTTPСоединение не следует по редиректам автоматически. Если ресурс был перемещен, веб-сервер возвращает код состояния 301 или 302, а в заголовке ответа Location указывает новый целевой адрес страницы.

Разберем алгоритм обработки перенаправлений:

  1. Проверяем код ответа сервера (301, 302, 307, 308).
  2. Считываем заголовок Location из коллекции Ответ.Заголовки.
  3. Анализируем полученный путь: он может быть как относительным (например, /catalog/new-item.html), так и абсолютным (https://new-domain.ru/catalog/new-item.html).
  4. Если передан относительный путь — повторяем запрос в рамках текущего HTTPСоединение. Если адрес ведет на другой хост — создаем новый экземпляр HTTPСоединение.
  5. Обязательно ограничиваем количество повторных запросов счетчиком (например, не более 5 итераций), чтобы защититься от зацикливания.

Посмотрим, как реализовать универсальный цикл обработки редиректов:


Хост = "www.trial-market.ru";
ПутьРесурса = "/old-url.html";
SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);

МаксРедиректов = 5;
ТекущийРедирект = 0;

Пока ТекущийРедирект < МаксРедиректов Цикл
    Соединение = Новый HTTPСоединение(Хост, , , , , , SSL);
    Запрос = Новый HTTPЗапрос(ПутьРесурса);
    Ответ = Соединение.Получить(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        // Страница успешно получена
        ТекстСтраницы = Ответ.ПолучитьТелоКакСтроку();
        Прервать;
    ИначеЕсли Ответ.КодСостояния = 301 
        Или Ответ.КодСостояния = 302 
        Или Ответ.КодСостояния = 307 
        Или Ответ.КодСостояния = 308 Тогда
        
        НовыйАдрес = Ответ.Заголовки.Получить("Location");
        Если ПустаяСтрока(НовыйАдрес) Тогда
            ВызватьИсключение "Сервер вернул редирект, но заголовок Location отсутствует.";
        КонецЕсли;
        
        // Если вернулся относительный путь
        Если Лев(НовыйАдрес, 1) = "/" Тогда
            ПутьРесурса = НовыйАдрес;
        Иначе
            // Если вернулся полный URL, необходимо разобрать хост и относительный путь
            // Для парсинга URL в типовых конфигурациях можно использовать ОбщегоНазначенияКлиентСервер.СтруктураURI()
            Прервать; 
        КонецЕсли;
        
        ТекущийРедирект = ТекущийРедирект + 1;
    Иначе
        ВызватьИсключение "Ошибка HTTP с кодом: " + Строка(Ответ.КодСостояния);
    КонецЕсли;
КонецЦикла;

Дополнительные рекомендации при парсинге сайтов

Современные веб-серверы и системы защиты от ботов анализируют параметры входящих HTTP-пакетов. Чтобы минимизировать ошибки доступа и блокировки, учтем следующие нюансы:

  1. Заголовок User-Agent: Сервер может возвращать ошибку или редирект, если запрос не содержит идентификатор браузера. Всегда задавайте реальный User-Agent в заголовках объекта HTTPЗапрос через метод Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0...").
  2. Работа с Cookies: При перенаправлении сервер может передавать сессионные куки в заголовке Set-Cookie. Для успешного перехода по следующему адресу их необходимо извлечь и передать в новый запрос в заголовке Cookie.
  3. Разбор HTML-кода: Для извлечения данных из полученного ответа Ответ.ПолучитьТелоКакСтроку() штатно применяются объекты ЧтениеHTML, ПостроительDOM и ДокументDOM с поддержкой выражений XPath.
← На главную