Работа с внешними веб-сервисами и API через 1С:Предприятие — стандартная задача для современного разработчика. Однако часто мы сталкиваемся с ошибкой «Ошибка работы с Интернет: Failure when receiving data from the peer». Эта ошибка (часто соответствующая коду 56 в библиотеке libcurl) сигнализирует о том, что удаленный сервер или промежуточный узел (шлюз, прокси) неожиданно разорвал соединение в момент передачи данных. Рассмотрим подробно, почему это происходит и как реанимировать обмен данными. Постоянную синхронизацию данных между системами настраивают на базе автоматизации регулярного обмена данными через веб-сервис.
Проанализируем классическую ситуацию: вы пытаетесь подключиться к ресурсу по протоколу HTTPS (порт 443), но в конструкторе HTTPСоединение не указываете параметры защиты. Современные веб-серверы требуют обязательной инициализации SSL/TLS. Без этого соединение будет сброшено сразу после попытки передачи данных.
Разберем правильный пример инициализации соединения. Для работы с защищенными ресурсами нам необходимо создать объект ЗащищенноеСоединениеOpenSSL. Мы можем использовать системные сертификаты Windows, чтобы не прописывать пути к файлам сертификатов вручную.
// Инициализируем защищенное соединение, используя сертификаты ОС
СертификатыОС = Новый СертификатыУдостоверяющихЦентровWindows();
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, СертификатыОС);
// Создаем соединение с указанием объекта защиты
Соединение = Новый HTTPСоединение(
"myhost.ru", // Хост
443, // Порт для HTTPS
, // Пользователь
, // Пароль
, // Прокси
10, // Таймаут в секундах
Защита // Тот самый объект защищенного соединения
);
Запрос = Новый HTTPЗапрос("/");
Результат = Соединение.Получить(Запрос);
Обратите внимание: если вы используете старые версии платформы 1С или работаете на Linux, параметры инициализации сертификатов могут отличаться, но наличие самого объекта ЗащищенноеСоединениеOpenSSL критически важно.
В исходном сообщении темы автор использовал метод ОтправитьДляОбработки. Этот метод по сути выполняет POST или PUT запрос, передавая тело файла на сервер. Если ваша задача — просто скачать XML-файл или прочитать страницу, сервер может отклонить POST-запрос на этот URL, так как он ожидает только скачивание (GET). Для оперативной проверки работы методов и заголовков запросов пригодится консоль для тестирования REST API в 1С.
Выясним, как правильно скачивать файлы во временное хранилище. Вместо отправки данных, мы должны использовать метод Получить. Посмотрим на пример кода:
Хост = "reforum.ru";
АдресРесурса = "/export/1c/2013-08-07/advert_stats.xml";
ИмяФайлаДляСохранения = ПолучитьИмяВременногоФайла("xml");
// Соединение (предположим, что сайт работает по обычному HTTP на 80 порту)
Соединение = Новый HTTPСоединение(Хост);
Попытка
// Метод Получить скачивает данные с сервера и сохраняет их в файл на диске
Соединение.Получить(АдресРесурса, ИмяФайлаДляСохранения);
Сообщить("Файл успешно загружен в: " + ИмяФайлаДляСохранения);
Исключение
Сообщить("Произошла ошибка: " + ОписаниеОшибки());
КонецПопытки;
Многие современные сайты (особенно защищенные системами Cloudflare или BitNinja) блокируют запросы, если в них указан стандартный идентификатор программы. По умолчанию 1С передает User-Agent вида 1C+Enterprise/8.3. Для сервера это выглядит как активность бота, и он разрывает соединение с ошибкой «Failure when receiving data».
Рассмотрим, как «прикинуться» браузером. Нам нужно добавить соответствующий заголовок в объект HTTPЗапрос. Проанализируем пример:
Запрос = Новый HTTPЗапрос("/api/data.xml");
// Устанавливаем заголовок, имитирующий браузер Chrome на Windows 10
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");
Результат = Соединение.Получить(Запрос);
Важный совет: Иногда также требуется передать заголовок Accept, чтобы сервер понимал, какой формат данных мы ожидаем получить — это актуально при интеграции 1С с Google Таблицами.
Если код выполняется на сервере под управлением устаревшей ОС (например, Windows Server 2008 R2 или Windows Server 2012 без обновлений), возникнет конфликт протоколов шифрования. Большинство современных сайтов требуют TLS 1.2 или TLS 1.3. Старые системы по умолчанию пытаются использовать TLS 1.0, который серверы сбрасывают из соображений безопасности.
Что мы можем сделать в этой ситуации:
Иногда ошибка возникает только при передаче больших объемов данных (например, когда XML-файл весит несколько мегабайт). Это может быть связано с параметром MTU (Maximum Transmission Unit) — максимальным размером пакета в вашей сети. Если пакет слишком велик и какой-то роутер на пути не может его фрагментировать, соединение обрывается.
Проанализируем ситуацию: «рукопожатие» (handshake) проходит успешно, заголовки получены, но как только начинается передача «тела» ответа, происходит обрыв. В этом случае попробуйте выполнить следующие действия:
MTU на сетевой карте сервера до 1400 или 1450 (это решается системным администратором через командную строку).Даже если в коде HTTPСоединение вы не указываете прокси, 1С может автоматически подхватывать настройки из системных параметров Windows (Internet Options). Если прокси настроен некорректно или требует авторизации, которую 1С не знает как пройти «автоматом», возникнет ошибка работы с Peer.
Чтобы исключить влияние системных настроек, попробуйте явно передать пустой прокси-сервер:
БезПрокси = Новый HTTPПрокси; // Пустой объект прокси
Соединение = Новый HTTPСоединение("host.com", , , , БезПрокси);
Ошибка «Failure when receiving data from the peer» — это комплексная проблема. Начните диагностику с проверки использования ЗащищенноеСоединениеOpenSSL и замены метода на Получить. Если это не помогло — имитируйте User-Agent браузера. В 90% случаев одно из этих решений исправляет ситуацию и позволяет 1С стабильно обмениваться данными с веб-ресурсами.