Как исправить ошибку «Server returned nothing (no headers, no data)» при выполнении GET-запроса в 1С?

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

При разработке механизмов интеграции 1С с внешними системами через HTTP-протокол программисты часто сталкиваются с неочевидным поведением платформы. Одной из самых коварных ошибок является сообщение: «Ошибка работы с Интернет: Server returned nothing (no headers, no data)». Эта ошибка (технически соответствующая коду 52 в библиотеке libcurl) означает, что сервер разорвал соединение, не отправив в ответ ни одного байта данных или заголовков. В этой статье мы подробно разберем, почему это происходит, как диагностировать проблему и какие способы реализации HTTP-обмена существуют — в этом поможет инструмент логирования и анализа HTTP-запросов в 1С.

Проанализируем ситуацию и найдем причину

Рассмотрим типичный пример кода (например, при реализации HTTP API сервиса), который приводит к подобной ошибке, как это было описано в сообщении автора темы:


Сервер = "api.example.com"; 
Соединение = Новый HTTPСоединение(Сервер, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL); 
ЗапросHTTP = Новый HTTPЗапрос("/check?А=12345"); 
Ответ = Соединение.ВызватьHTTPМетод("GET", ЗапросHTTP);

Ситуация осложняется тем, что при проверке того же самого URL через обычный браузер всё работает корректно. Это наталкивает на мысль, что 1С формирует сетевой пакет иначе, чем браузер. Для выяснения причины нам необходимо использовать инструменты перехвата трафика, такие как Fiddler или Charles. Сравним заголовки, которые отправляет браузер, и те, что уходят из 1С.

Решение 1: Отключение автоматической прокси-авторизации

Одной из наиболее вероятных причин, выявленных в ходе обсуждения, является заголовок Proxy-Authorization: NTLM. Платформа 1С по умолчанию пытается использовать системные настройки прокси-сервера из Internet Explorer (Windows). Если в системе включено «Автоматическое определение параметров», 1С может ошибочно пытаться авторизоваться на прокси (что отличается от стандартной аутентификации через Access и Refresh токены), даже если прямой доступ к интернету не требует этого.

Многие современные веб-серверы или системы защиты (WAF), видя некорректные или лишние заголовки авторизации, просто сбрасывают соединение. Чтобы исключить влияние прокси, нам нужно явно запретить его использование в коде.

Разберем, как правильно инициализировать соединение без прокси:


// Создаем пустой объект прокси и указываем не использовать системные настройки
ПроксиБезНастроек = Новый ИнтернетПрокси(Ложь); 

// Либо явно вызываем метод отключения
ПроксиБезНастроек.НеИспользоватьПрокси();

// Передаем этот объект в конструктор HTTPСоединение (6-й параметр)
Соединение = Новый HTTPСоединение(Сервер, 443, , , ПроксиБезНастроек, , Новый ЗащищенноеСоединениеOpenSSL);

Этот простой шаг часто убирает лишние заголовки и позволяет серверу корректно принять запрос.

Решение 2: Эмуляция браузера через User-Agent

Многие серверы (например, защищенные Cloudflare) настроены так, чтобы блокировать запросы от автоматизированных скриптов и библиотек. Если в запросе 1С отсутствует заголовок User-Agent или он содержит стандартное значение 1C+Enterprise, сервер может мгновенно закрыть соединение.

Посмотрим на пример добавления заголовка, имитирующего современный браузер:


ЗапросHTTP = Новый HTTPЗапрос("/check?А=12345");
ЗапросHTTP.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36");

Ответ = Соединение.Получить(ЗапросHTTP);

Решение 3: Правильное кодирование параметров URL

Обратим внимание на строку запроса в исходном сообщении: "/check?А="+СтрокаЗапроса. Здесь используется кириллический символ «А» в качестве имени параметра (подобная передача параметров в GET-запросе часто встречается в веб-клиентах). Браузеры автоматически кодируют такие символы в формат URL-encoded (например, %D0%90), но 1С в объекте HTTPЗапрос этого автоматически не делает.

Выясним, как правильно подготовить строку запроса. Все параметры, содержащие кириллицу, пробелы или спецсимволы, должны быть обработаны функцией КодироватьСтроку.


ИмяПараметра = КодироватьСтроку("А", СпособКодированияСтроки.URLКодирование);
ЗначениеПараметра = КодироватьСтроку(СтрокаЗапроса, СпособКодированияСтроки.URLКодирование);

СтрокаРесурса = "/check?" + ИмяПараметра + "=" + ЗначениеПараметра;
ЗапросHTTP = Новый HTTPЗапрос(СтрокаРесурса);

Решение 4: Настройка протоколов TLS (SSL)

Ошибка «Server returned nothing» часто возникает на этапе SSL Handshake. Если сервер требует протокол TLS 1.2 или 1.3, а клиент 1С (или операционная система, на которой он запущен) пытается использовать старые протоколы (TLS 1.0, SSL 3.0), сервер разорвет соединение.

Рассмотрим, как принудительно указать безопасные протоколы в 1С:


// Явно указываем использование только современных протоколов TLS
Протоколы = Новый Массив;
Протоколы.Добавить(ПротоколЗащищенногоСоединения.TLS12);

// Создаем защищенное соединение с указанием протоколов
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено, Протоколы);

Соединение = Новый HTTPСоединение(Сервер, 443, , , , , Защита);

Важно: Если ваш сервер 1С работает под управлением старой ОС (например, Windows Server 2008 R2), убедитесь, что поддержка TLS 1.2 включена на уровне реестра системы.

Решение 5: Удаление заголовка Expect: 100-continue

Библиотека curl, используемая внутри платформы 1С, иногда добавляет служебный заголовок Expect: 100-continue. Это заставляет сервер ждать подтверждения перед приемом данных. Некоторые серверы не понимают этот стандарт и просто обрывают связь.

Попробуем принудительно очистить этот заголовок в нашем объекте HTTPЗапрос:


ЗапросHTTP.Заголовки.Вставить("Expect", "");

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

  1. Проверка антивирусов: Некоторые антивирусные решения (например, Kaspersky) выполняют инспекцию SSL-трафика. Они подменяют сертификат сервера своим собственным. Если 1С не доверяет сертификату антивируса, соединение будет разорвано. Попробуйте временно отключить проверку защищенных соединений в настройках антивируса.
  2. Серверный вызов на Linux: Если код выполняется на стороне сервера под управлением Linux, убедитесь, что в системе установлены пакеты ca-certificates. Без актуальных корневых сертификатов 1С не сможет установить защищенное соединение.
  3. Использование Postman: Перед написанием кода в 1С всегда проверяйте запрос в Postman. Если там запрос проходит, внимательно изучите вкладку «Headers» в Postman и воспроизведите все заголовки (особенно Host, Accept, Accept-Encoding) в 1С.

Подводя итог, можно сказать, что ошибка «Server returned nothing» — это не приговор, а сигнал к более детальной настройке сетевого взаимодействия. Чаще всего проблема решается отключением прокси или правильной настройкой защищенного соединения OpenSSL.

← На главную