Почему HTTP-соединение работает на клиенте, но выдает ошибку на сервере 1С, и как это исправить?

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

Разработка интеграций с внешними сервисами — одна из самых частых задач в современной практике программиста 1С. Очень часто мы сталкиваемся с ситуацией, когда написанный и протестированный в интерактивном режиме код работает безупречно. Мы пишем обработку, запускаем её на клиенте, получаем нужные данные по API, радуемся результату. Но стоит нам перенести этот же код в общий модуль с флагами Сервер и Вызов сервера или настроить регламентное задание, как система тут же выдает неприятную ошибку: "Ошибка работы с Интернет: Интернет-соединение не установлено".

Давайте подробно разберем, почему возникает эта проблема, чем отличается выполнение кода на клиенте и сервере, и по шагам пройдем весь путь диагностики и устранения данной ошибки.

В чем принципиальная разница между НаКлиенте и НаСервере?

Для того чтобы понять корень проблемы, нам нужно проанализировать контекст выполнения кода в системе 1С:Предприятие. Когда код выполняется под директивой компиляции &НаКлиенте, он запускается на локальном компьютере пользователя. В этот момент платформа использует окружение текущей учетной записи операционной системы Windows или Linux:

  1. Доступ в интернет предоставляется под правами вошедшего в систему пользователя.
  2. Автоматически подтягиваются системные настройки прокси-сервера (например, из настроек Internet Explorer).
  3. Доступны все импортированные пользователем сертификаты безопасности (включая личные и корпоративные SSL-сертификаты).
  4. Брандмауэр (Firewall) считает сетевую активность пользователя легитимной интерактивной сессией.

Когда же выполнение кода переходит в общий модуль на сервер (директива &НаСервере или выполнение регламентного задания), ситуация кардинально меняется. Код выполняется внутри рабочего процесса сервера 1С — rphost.exe. И выполняется он от имени специальной системной учетной записи службы 1С:Предприятия (по умолчанию в Windows это USR1CV8). У этой учетной записи совершенно другое окружение:

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

Шаг 1. Настройка сетевых прав для учетной записи службы 1С (USR1CV8)

Первое, что необходимо проверить — имеет ли вообще операционная система и локальная сеть право выпускать процесс rphost.exe наружу. Очень часто системные администраторы блокируют исходящий трафик для всех сервисных учетных записей в целях безопасности.

Рассмотрим порядок диагностики прав:

  1. Откройте оснастку Службы (services.msc) на сервере, где установлен сервер приложений 1С.
  2. Найдите службу "Агент сервера 1С:Предприятия" и посмотрите, от имени какого пользователя она запускается (колонка "Вход от имени"). Обычно это .\USR1CV8.
  3. Попросите системного администратора проверить правила брандмауэра (Windows Firewall или внешнего аппаратного сетевого экрана). Для исполняемого файла C:\Program Files\1cv8\<ВерсияПлатформы>\bin\rphost.exe должны быть разрешены исходящие соединения по портам 80 (HTTP) и 443 (HTTPS).

Для быстрой проверки прав доступа можно временно запустить службу 1С под учетной записью Администратора сервера. Если после этого HTTP-запрос отработал успешно — проблема со всей очевидностью кроется в ограничениях прав пользователя USR1CV8.

Шаг 2. Настройка прокси-сервера для сервера 1С

Если на вашем предприятии доступ в интернет осуществляется через прокси-сервер, клиентский компьютер знает об этом благодаря системным настройкам. Но сервер приложений 1С под своей учетной записью прокси-сервер "не видит".

Существует два пути решения этой проблемы: на уровне платформы и непосредственно в коде 1С.

Вариант А. Настройка через файл inetcfg.xml

Для того чтобы сервер 1С глобально знал о существовании прокси-сервера, мы можем создать конфигурационный файл inetcfg.xml в каталоге конфигов платформы. Рассмотрим этот процесс:

  1. Перейдите в каталог конфигурационных файлов сервера 1С. Обычно он находится по пути: C:\Program Files\1cv8\conf\ (для 64-битной Windows-платформы).
  2. Создайте (или отредактируйте) текстовый файл с именем inetcfg.xml.
  3. Поместите в него следующие настройки, указав параметры вашего прокси-сервера:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/8.1/data/internet/config">
    <proxy user="ИмяПользователяПрокси"
           password="ПарольПрокси"
           bypassOnLocal="true">
        <server protocol="http" address="192.168.1.100" port="3128"/>
        <server protocol="https" address="192.168.1.100" port="3128"/>
        <bypassAddress>127.0.0.1</bypassAddress>
        <bypassAddress>localhost</bypassAddress>
        <bypassAddress>*.localcompany.ru</bypassAddress>
    </proxy>
</config>

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

Вариант Б. Явное указание прокси в коде 1С

Если вы хотите сделать код более гибким и независимым от настроек конкретного сервера, мы можем использовать объект ИнтернетПрокси непосредственно при создании соединения. Посмотрим на пример кода:


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

// Указываем параметры прокси вручную
ПроксиСервер.УказатьНастройкиСервера("192.168.1.100", 3128);
ПроксиСервер.Пользователь = "ИмяПользователяПрокси";
ПроксиСервер.Пароль = "ПарольПрокси";

// Теперь передаем объект прокси в конструктор HTTPСоединения седьмым параметром
Соединение = Новый HTTPСоединение(
    "api.service.com",,,, 
    ПроксиСервер,, 
    Новый ЗащищенноеСоединениеOpenSSL()
);

Шаг 3. Установка и проверка SSL-сертификатов (ЗащищенноеСоединениеOpenSSL)

При работе с защищенными протоколами HTTPS (порт 443) платформа 1С использует объект ЗащищенноеСоединениеOpenSSL. Начиная с версии 8.3.8, платформа по умолчанию строго валидирует SSL-сертификаты удаленного сервера, проверяя их подлинность через цепочку доверия.

Если удаленный сайт использует современный отечественный сертификат (например, Минцифры) или самоподписанный SSL-сертификат внутри корпоративной сети, сервер 1С вернет ошибку установления соединения, так как в системном хранилище учетной записи USR1CV8 нет доверенного корневого сертификата.

Разберем способы решения:

Способ 1. Импорт корневых сертификатов в ОС сервера

Необходимо установить корневой сертификат удостоверяющего центра в хранилище сертификатов операционной системы сервера. В Windows это делается через запуск оснастки certlm.msc (сертификаты локального компьютера) и импорт файла сертификата в ветку "Доверенные корневые центры сертификации". В Linux (например, Ubuntu/Debian) необходимо скопировать сертификат в директорию /usr/local/share/ca-certificates/ с расширением .crt и выполнить команду sudo update-ca-certificates.

Способ 2. Отключение проверки сертификатов (подходит для тестирования или закрытых сетей)

Если безопасность канала гарантирована физически или вы проводите отладку интеграции, проверку цепочки сертификатов можно временно отключить. Для этого инициализируйте объект ЗащищенноеСоединениеOpenSSL без параметров:


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

Соединение = Новый HTTPСоединение(
    "api.service.com",,,,, 
    БезПроверкиСертификата
);

Использование пустого конструктора Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено) заставляет платформу игнорировать любые ошибки SSL-сертификатов и успешно продолжать работу.

Шаг 4. Проверка профилей безопасности в кластере 1С

Если все предыдущие шаги выполнены, но сервер по-прежнему блокирует запросы, велика вероятность, что для вашей информационной базы включены Профили безопасности в консоли кластера 1С.

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

Проанализируем эту ситуацию:

  1. Откройте утилиту администрирования кластера серверов 1С:Предприятия.
  2. Найдите вашу информационную базу и откройте её свойства.
  3. Обратите внимание на поле "Профиль безопасности". Если там выбран конкретный профиль, значит ограничения активны.
  4. Перейдите в ветку "Профили безопасности" вашего кластера, откройте нужный профиль и найдите раздел "Виртуальные ресурсы".
  5. Необходимо добавить разрешение на доступ к внешним интернет-ресурсам, указав протокол (HTTP/HTTPS) и маску адреса целевого сервера (например, api.service.com или * для неограниченного доступа).

Шаг 5. Диагностика DNS-имен на сервере приложений

Иногда банальная рассинхронизация сетевых настроек клиента и сервера приводит к ошибке. Например, на вашем компьютере прописан публичный DNS-сервер, который успешно разрешает имя api.service.com в IP-адрес. На сервере же приложений 1С может быть настроен только локальный контроллер домена, у которого нет пересылки внешних DNS-запросов.

Как быстро локализовать проблему с DNS:

  1. Зайдите по RDP на сервер приложений 1С.
  2. Откройте командную строку и выполните команду: ping api.service.com или nslookup api.service.com.
  3. Если система отвечает ошибкой "При проверке связи не удалось обнаружить узел...", проблема на уровне системного администрирования. Попросите администратора добавить нужные DNS-записи или прописать внешние DNS-серверы (например, 8.8.8.8) в настройках сетевого адаптера сервера.

Резюме: Правильный шаблон кода для серверных HTTP-запросов

Сведем все полученные знания в единый надежный шаблон кода, который минимизирует вероятность ошибок при переносе логики выполнения на сервер. Мы задействуем безопасный вызов, обработку возможных прокси и защищенное соединение:


&НаСервере
Функция ВыполнитьHTTPЗапросНаСервере(Знач URLРесурса, Знач ПутьКМетоду, Знач ПараметрыЗапроса) Экспорт

    // 1. Инициализируем защищенное соединение без строгой проверки сертификатов (при необходимости)
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
    
    // 2. Настраиваем прокси, если это требуется в вашей инфраструктуре
    Прокси = Новый ИнтернетProxy;
    Прокси.УстановитьИспользоватьСистемныеНастройки(Истина); // Пробуем взять системные
    
    // 3. Создаем HTTP-соединение с таймаутом (например, 30 секунд), чтобы процесс не зависал при сбоях сети
    Таймаут = 30;
    Попытка
        Соединение = Новый HTTPСоединение(
            URLРесурса, // Только доменное имя, например "api.service.com"
            ,,,, 
            Прокси, 
            Таймаут, 
            ЗащищенноеСоединение
        );
    Исключение
        ЗаписатьЛогОшибки("Не удалось установить соединение с сервером: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
        Возврат Неопределено;
    КонецПопытки;
    
    // 4. Подготавливаем HTTP-запрос
    Запрос = Новый HTTPЗапрос(ПутьКМетоду); // Например, "/v1/getData"
    Запрос.Заголовки.Вставить("Content-Type", "application/json");
    Запрос.УстановитьТелоИзСтроки(ПараметрыЗапроса, КодировкаТекста.UTF8);
    
    // 5. Выполняем запрос и обрабатываем результат
    Попытка
        Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
        Если Ответ.КодСостояния = 200 Тогда
            Возврат Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        Иначе
            ЗаписатьЛогОшибки("Сервер вернул код ошибки: " + Ответ.КодСостояния);
            Возврат Неопределено;
        КонецЕсли;
    Исключение
        ЗаписатьЛогОшибки("Ошибка отправки HTTP-запроса: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
        Возврат Неопределено;
    КонецПопытки;

КонецФункции

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

← На главную