Как устранить ошибку Failure when receiving data from the peer при отладке веб-сервисов 1С?

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

При пошаговой отладке веб-сервисов в 1С разработчики часто сталкиваются с ситуацией, когда после остановки на точке останова соединение мгновенно разрывается, а вызывающая сторона возвращает ошибку Failure when receiving data from the peer (код ошибки cURL 56). Выясним причину такого поведения и разберем по шагам варианты решения проблемы.

Причины возникновения ошибки

Проанализируем ситуацию: когда выполнение программного кода останавливается в точке останова внутри метода веб-сервиса, сервер перестает передавать данные вызывающему приложению до тех пор, пока программист не продолжит выполнение. В этот момент срабатывают защитные механизмы сетевого взаимодействия:

  1. Таймаут вызывающего клиента 1С. Если при инициализации подключения к веб-сервису не задано время ожидания ответа, используется значение по умолчанию. Как только время истекает, клиент 1С сам закрывает TCP-сокет.
  2. Таймаут веб-сервера Apache. Веб-сервер отслеживает время обработки HTTP-запроса. Если процесс удерживается отладчиком дольше лимита директивы Timeout, сервер разрывает соединение, считая дочерний рабочий поток зависшим.
  3. Особенности модуля wsap24.dll на Windows x64. В некоторых версиях платформы 1С при работе в 64-разрядном окружении Apache модуль расширения веб-сервера может аварийно завершать дочерний процесс при приостановке потока отладчиком.

Способ 1. Увеличение таймаута на стороне вызывающей базы 1С

Рассмотрим код подключения к веб-сервису в вызывающей базе. При создании прокси-объекта необходимо явно передать параметр таймаута в секундах, чтобы клиент не обрывал связь во время анализа переменных в конфигураторе.

Если подключение выполняется динамически через WSОпределения, передадим таймаут в конструктор WSПрокси:


Определения = Новый WSОпределения(URL_WSDL, Пользователь, Пароль);
ТаймаутВСекундах = 3600; // 1 час на отладку

WSПрокси = Новый WSПрокси(
    Определения, 
    URIПространстваИмен, 
    ИмяСервиса, 
    ИмяПорта, 
    , 
    , 
    ТаймаутВСекундах
);
Ответ = WSПрокси.ВыполнитьОперацию(ВходныеДанные);

Если используется статическая ссылка из дерева метаданных (ветка WS-ссылки), укажем таймаут в методе получения прокси:


ТаймаутВСекундах = 3600;
WSПрокси = WSСсылки.ИмяСервиса.ПолучитьWSПрокси(ИмяСервиса, ИмяПорта, ТаймаутВСекундах);
Ответ = WSПрокси.ВыполнитьОперацию(ВходныеДанные);

Способ 2. Настройка конфигурационного файла Apache (httpd.conf)

Разберем параметры веб-сервера Apache, которые управляют временем удержания соединений. Откроем файл httpd.conf и скорректируем директивы времени ожидания:


Timeout 3600
KeepAliveTimeout 300

Для предотвращения сбоев сетевых сокетов на операционных системах Windows при работе с модулем 1С рекомендуется добавить следующую директиву в конфигурацию Apache:

Win32DisableAcceptEx

После внесения изменений обязательно перезапустим службу веб-сервера Apache.

Способ 3. Отладка логики через внешнюю обработку (без веб-сервера)

Посмотрим на наиболее надежный архитектурный прием, исключающий влияние сетевых таймаутов и веб-сервера на процесс разработки. Для этого разделим точку входа веб-сервиса и его прикладную логику:

  1. Вынесем весь алгоритм обработки данных из модуля веб-сервиса в серверный общий модуль (например, ИнтеграцияСервер).
  2. В самом веб-сервисе оставим только вызов этого общего модуля.
  3. Создадим внешнюю обработку, которая формирует структуру входных параметров и напрямую вызывает процедуру из общего модуля ИнтеграцияСервер в режиме обычного или управляемого приложения.

При таком подходе отладка выполняется в штатном режиме толстого или тонкого клиента 1С без риска разрыва соединения сторонними веб-серверами.

← На главную