При обновлении платформы 1С:Предприятие до версий 8.3.15, 8.3.16 и выше разработчики часто сталкиваются с неожиданным поведением давно работающих интеграций. Код, который годами успешно обменивался данными с внешними сайтами и сервисами, внезапно начинает вызывать исключение: «Ошибка работы с Интернет: Unsupported protocol» (Неподдерживаемый протокол). При этом те же самые запросы из обычного браузера или через сторонние утилиты продолжают выполняться без каких-либо ошибок.
В этой статье мы подробно разберем, почему возникает данная проблема, что именно изменилось в сетевом механизме платформы 1С начиная с версии 8.3.15, как локализовать ошибку с помощью инструментов диагностики и какими способами её можно устранить.
Проанализируем классический пример кода, который без проблем работает на платформе 8.3.14, но вызывает сбой на более новых релизах:
Соединение = Новый HTTPСоединение("АдресСервера", Порт, "ИмяПользователя", "Пароль");
Запрос = Новый HTTPЗапрос("/GetUserDataJson");
Результат = Соединение.Получить(Запрос);
Попытка выполнить метод Получить() объекта HTTPСоединение на платформе 8.3.15 и выше приводит к аварийному завершению операции. Давайте разберемся в причинах этого явления.
Исторически в операционных системах семейства Windows платформа 1С:Предприятие использовала системную библиотеку WinHTTP (разработку Microsoft, тесно связанную с движком Internet Explorer). Эта библиотека обладает высокой отказоустойчивостью и лояльностью к различным «кривым» реализациям веб-серверов. Если сервер возвращал некорректно сформированный заголовок или нарушал стандарты разметки пакетов, WinHTTP незаметно для разработчика исправляла эти неточности и успешно возвращала тело ответа.
В рамках развития кроссплатформенности и обеспечения идентичной работы механизмов на Windows, Linux и macOS разработчики 1С приняли решение полностью унифицировать сетевой движок. Начиная с версии 8.3.15, основным инструментом для выполнения HTTP-запросов стала кроссплатформенная библиотека libcurl.
Библиотека libcurl работает значительно строже, чем WinHTTP. Она не прощает веб-серверам ошибок форматирования ответов. Если удаленный сервер присылает ответ, не соответствующий спецификациям, libcurl прерывает соединение, что транслируется в платформе 1С как «Unsupported protocol».
Еще одно важное нововведение в платформе 8.3.15 — это жесткое требование к соблюдению стандарта RFC 7230, который регламентирует синтаксис сообщений протокола HTTP/1.1.
Многие устаревшие серверы по-прежнему работают на базе протокола HTTP/1.0. При формировании ответа они могут допускать критические для нового парсера 1С синтаксические ошибки:
HTTP 1.0 вместо стандартного HTTP/1.0).LF вместо обязательной последовательности CRLF).Новый парсер платформы 1С, обнаружив подобные несоответствия в ответе веб-сервера, мгновенно прекращает обработку и выдает ошибку неподдерживаемого протокола.
Совместно с обновлением сетевого движка в платформе 1С были обновлены и компоненты безопасности, в частности библиотека OpenSSL. В современных релизах платформы по умолчанию заблокированы устаревшие и небезопасные протоколы шифрования:
Если веб-сервер настроен на работу со старыми протоколами безопасности или использует слабые алгоритмы шифрования (шифры семейства RC4 и другие), то при попытке установить защищенное соединение HTTPS библиотека libcurl внутри 1С отклонит рукопожатие (handshake) с той же самой ошибкой «Unsupported protocol».
В современных веб-технологиях всё чаще применяется стандарт HTTP/2. Платформа 1С (объект HTTPСоединение) на текущий момент поддерживает отправку запросов только по протоколам HTTP/1.1 и HTTP/1.0.
Большинство серверов при получении запроса умеют автоматически понижать версию до HTTP/1.1 (механизм fallback). Однако, если целевой сервер настроен на жесткое требование HTTP/2 и не поддерживает откат к предыдущим версиям протокола, попытка соединения из 1С завершится ошибкой неподдерживаемого протокола.
---
Поскольку браузеры крайне лояльны к сетевым ошибкам и автоматически сглаживают неровности протоколов, тестирование в браузере не дает объективной картины. Нам необходимо увидеть «сырые» данные, которые отдает сервер. Для интерактивной отправки и анализа запросов внутри базы можно использовать инструмент для тестирования REST API на платформе 1С.
Использование утилиты Fiddler:
Для детального анализа сетевого трафика выполним следующие действия:
HTTP/1.0 или некорректный формат версии, мы нашли источник проблемы.Использование консольной утилиты curl:
Поскольку 1С теперь работает на базе libcurl, идеальным средством диагностики будет использование консольной утилиты curl, которая присутствует во всех современных ОС. Запустим командную строку и выполним команду:
curl -v https://АдресВашегоСервера/GetUserDataJson
Ключ -v (verbose) заставит утилиту вывести подробный лог установления соединения, включая версию SSL/TLS, выбранные шифры, заголовки запроса и ответа. Любые отклонения от стандартов сразу же будут подсвечены в логе консоли.
---
Разберем три основных способа устранения ошибки в зависимости от того, имеете ли вы доступ к настройкам веб-сервера.
Если вы интегрируетесь с собственным веб-ресурсом или имеете связь с администраторами стороннего сервиса, наиболее правильным и надежным решением является перевод сервера на современную версию протокола HTTP/1.1.
Как показывает практика, при обновлении настроек веб-сервера (например, IIS, Apache или Nginx) до поддержки HTTP/1.1 strict-парсер платформы 1С начинает успешно принимать ответы, и ошибка «Unsupported protocol» исчезает без изменения кода в самой 1С.
Если проблема вызвана тем, что удаленный сервер использует устаревшие протоколы шифрования TLS 1.0/1.1, а обновить ПО сервера нет возможности, можно временно понизить требования безопасности самой платформы 1С.
Для этого необходимо внести изменения в конфигурационный файл conf.cfg, который располагается в каталоге установки платформы 1С (например, C:\Program Files\1cv8\conf\conf.cfg для Windows). Добавим в него следующую строку:
ForceTLS1_0=true
Этот параметр принудительно разрешает платформе использовать протокол TLS 1.0 при установке защищенных соединений, что позволяет успешно обмениваться данными со старыми веб-серверами.
В некоторых случаях веб-серверы могут некорректно реагировать на запросы, в которых не указан агент пользователя (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 для выявления синтаксических ошибок в заголовках ответов.