Как исправить ошибку «Unsupported protocol» при использовании HTTPСоединение на платформах 1С 8.3.15, 8.3.16 и новее

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

При обновлении платформы 1С:Предприятие до версий 8.3.15, 8.3.16 и выше разработчики часто сталкиваются с неожиданным поведением давно работающих интеграций. Код, который годами успешно обменивался данными с внешними сайтами и сервисами, внезапно начинает вызывать исключение: «Ошибка работы с Интернет: Unsupported protocol» (Неподдерживаемый протокол). При этом те же самые запросы из обычного браузера или через сторонние утилиты продолжают выполняться без каких-либо ошибок.

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

Проанализируем классический пример кода, который без проблем работает на платформе 8.3.14, но вызывает сбой на более новых релизах:


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

Попытка выполнить метод Получить() объекта HTTPСоединение на платформе 8.3.15 и выше приводит к аварийному завершению операции. Давайте разберемся в причинах этого явления.

Причина 1. Полный переход на сетевую библиотеку libcurl

Исторически в операционных системах семейства Windows платформа 1С:Предприятие использовала системную библиотеку WinHTTP (разработку Microsoft, тесно связанную с движком Internet Explorer). Эта библиотека обладает высокой отказоустойчивостью и лояльностью к различным «кривым» реализациям веб-серверов. Если сервер возвращал некорректно сформированный заголовок или нарушал стандарты разметки пакетов, WinHTTP незаметно для разработчика исправляла эти неточности и успешно возвращала тело ответа.

В рамках развития кроссплатформенности и обеспечения идентичной работы механизмов на Windows, Linux и macOS разработчики 1С приняли решение полностью унифицировать сетевой движок. Начиная с версии 8.3.15, основным инструментом для выполнения HTTP-запросов стала кроссплатформенная библиотека libcurl.

Библиотека libcurl работает значительно строже, чем WinHTTP. Она не прощает веб-серверам ошибок форматирования ответов. Если удаленный сервер присылает ответ, не соответствующий спецификациям, libcurl прерывает соединение, что транслируется в платформе 1С как «Unsupported protocol».

Причина 2. Строгий стандарт RFC 7230 и проблемы с HTTP/1.0

Еще одно важное нововведение в платформе 8.3.15 — это жесткое требование к соблюдению стандарта RFC 7230, который регламентирует синтаксис сообщений протокола HTTP/1.1.

Многие устаревшие серверы по-прежнему работают на базе протокола HTTP/1.0. При формировании ответа они могут допускать критические для нового парсера 1С синтаксические ошибки:

Новый парсер платформы 1С, обнаружив подобные несоответствия в ответе веб-сервера, мгновенно прекращает обработку и выдает ошибку неподдерживаемого протокола.

Причина 3. Блокировка устаревших версий TLS и SSL в OpenSSL

Совместно с обновлением сетевого движка в платформе 1С были обновлены и компоненты безопасности, в частности библиотека OpenSSL. В современных релизах платформы по умолчанию заблокированы устаревшие и небезопасные протоколы шифрования:

Если веб-сервер настроен на работу со старыми протоколами безопасности или использует слабые алгоритмы шифрования (шифры семейства RC4 и другие), то при попытке установить защищенное соединение HTTPS библиотека libcurl внутри 1С отклонит рукопожатие (handshake) с той же самой ошибкой «Unsupported protocol».

Причина 4. Требование протокола HTTP/2 без обратной совместимости

В современных веб-технологиях всё чаще применяется стандарт HTTP/2. Платформа 1С (объект HTTPСоединение) на текущий момент поддерживает отправку запросов только по протоколам HTTP/1.1 и HTTP/1.0.

Большинство серверов при получении запроса умеют автоматически понижать версию до HTTP/1.1 (механизм fallback). Однако, если целевой сервер настроен на жесткое требование HTTP/2 и не поддерживает откат к предыдущим версиям протокола, попытка соединения из 1С завершится ошибкой неподдерживаемого протокола.

---

Шаг 1. Локализация и диагностика проблемы

Поскольку браузеры крайне лояльны к сетевым ошибкам и автоматически сглаживают неровности протоколов, тестирование в браузере не дает объективной картины. Нам необходимо увидеть «сырые» данные, которые отдает сервер. Для интерактивной отправки и анализа запросов внутри базы можно использовать инструмент для тестирования REST API на платформе 1С.

Использование утилиты Fiddler:

Для детального анализа сетевого трафика выполним следующие действия:

  1. Запустим прокси-отладчик Fiddler.
  2. Выполним HTTP-запрос в 1С под платформой 8.3.14 (где обмен работает).
  3. Найдем этот запрос в списке Fiddler и перейдем на вкладку Inspectors -> RAW в правой части экрана. Здесь мы увидим полный текст запроса и ответа сервера вместе со всеми служебными заголовками.
  4. Выполним этот же запрос в 1С на платформе 8.3.15 или новее.
  5. Сравним полученные RAW-данные. Особое внимание следует обратить на самую первую строку ответа сервера. Если там фигурирует HTTP/1.0 или некорректный формат версии, мы нашли источник проблемы.

Использование консольной утилиты curl:

Поскольку 1С теперь работает на базе libcurl, идеальным средством диагностики будет использование консольной утилиты curl, которая присутствует во всех современных ОС. Запустим командную строку и выполним команду:

curl -v https://АдресВашегоСервера/GetUserDataJson

Ключ -v (verbose) заставит утилиту вывести подробный лог установления соединения, включая версию SSL/TLS, выбранные шифры, заголовки запроса и ответа. Любые отклонения от стандартов сразу же будут подсвечены в логе консоли.

---

Варианты решения проблемы

Разберем три основных способа устранения ошибки в зависимости от того, имеете ли вы доступ к настройкам веб-сервера.

Решение 1. Перевод веб-сервера на протокол HTTP/1.1 (Рекомендуемое)

Если вы интегрируетесь с собственным веб-ресурсом или имеете связь с администраторами стороннего сервиса, наиболее правильным и надежным решением является перевод сервера на современную версию протокола HTTP/1.1.

Как показывает практика, при обновлении настроек веб-сервера (например, IIS, Apache или Nginx) до поддержки HTTP/1.1 strict-парсер платформы 1С начинает успешно принимать ответы, и ошибка «Unsupported protocol» исчезает без изменения кода в самой 1С.

Решение 2. Разрешение использования устаревших протоколов TLS в conf.cfg

Если проблема вызвана тем, что удаленный сервер использует устаревшие протоколы шифрования TLS 1.0/1.1, а обновить ПО сервера нет возможности, можно временно понизить требования безопасности самой платформы 1С.

Для этого необходимо внести изменения в конфигурационный файл conf.cfg, который располагается в каталоге установки платформы 1С (например, C:\Program Files\1cv8\conf\conf.cfg для Windows). Добавим в него следующую строку:

ForceTLS1_0=true

Этот параметр принудительно разрешает платформе использовать протокол TLS 1.0 при установке защищенных соединений, что позволяет успешно обмениваться данными со старыми веб-серверами.

Решение 3. Корректное формирование заголовков запроса в 1С

В некоторых случаях веб-серверы могут некорректно реагировать на запросы, в которых не указан агент пользователя (User-Agent) или тип контента. Попробуем явно инициализировать заголовки запроса в коде 1С, сымитировав поведение современного веб-браузера. Посмотрим на пример реализации такого запроса:


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

// Задаем строку User-Agent, соответствующую современному браузеру
СтрокаUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36";
Заголовки.Вставить("User-Agent", СтрокаUserAgent);

// Создаем объект запроса с передачей подготовленных заголовков
Запрос = Новый HTTPЗапрос("/GetUserDataJson", Заголовки);

// Инициализируем соединение и отправляем запрос
Соединение = Новый HTTPСоединение("АдресСервера", Порт, "ИмяПользователя", "Пароль");

Попытка
    Результат = Соединение.Получить(Запрос);
    КодСостояния = Результат.КодСостояния;
    
    Если КодСостояния = 200 Тогда
        СодержимоеОтвета = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        // Выполняем обработку полученных данных
    Иначе
        ЗаписатьЛогОшибки("Сервер вернул код состояния: " + КодСостояния);
    КонецЕсли;
Исключение
    // Перехватываем и анализируем ошибку соединения
    ИнформацияОбОшибке = ИнформацияОбОшибке();
    ЗаписатьЛогОшибки("Ошибка при выполнении HTTP-запроса: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПопытки;

Использование явной установки заголовков Content-Type и User-Agent гарантирует, что веб-сервер получит предсказуемый запрос и с большей вероятностью вернет корректно сформированный ответ стандарта HTTP/1.1. Для практического освоения работы с заголовками и методами HTTP подойдёт интерактивный обучающий курс по выполнению HTTP-запросов в 1С.

---

Подводя итоги, отметим, что ужесточение требований к HTTP-протоколам в платформе 1С — это вынужденная мера, направленная на повышение безопасности и кроссплатформенности системы. При возникновении ошибки «Unsupported protocol» в первую очередь проверяйте версию протокола HTTP на стороне целевого сервера и используйте утилиту curl для выявления синтаксических ошибок в заголовках ответов.

← На главную