Разработка интеграций с внешними сервисами — одна из самых частых задач в современной практике программиста 1С. Очень часто мы сталкиваемся с ситуацией, когда написанный и протестированный в интерактивном режиме код работает безупречно. Мы пишем обработку, запускаем её на клиенте, получаем нужные данные по API, радуемся результату. Но стоит нам перенести этот же код в общий модуль с флагами Сервер и Вызов сервера или настроить регламентное задание, как система тут же выдает неприятную ошибку: "Ошибка работы с Интернет: Интернет-соединение не установлено".
Давайте подробно разберем, почему возникает эта проблема, чем отличается выполнение кода на клиенте и сервере, и по шагам пройдем весь путь диагностики и устранения данной ошибки.
Для того чтобы понять корень проблемы, нам нужно проанализировать контекст выполнения кода в системе 1С:Предприятие. Когда код выполняется под директивой компиляции &НаКлиенте, он запускается на локальном компьютере пользователя. В этот момент платформа использует окружение текущей учетной записи операционной системы Windows или Linux:
Когда же выполнение кода переходит в общий модуль на сервер (директива &НаСервере или выполнение регламентного задания), ситуация кардинально меняется. Код выполняется внутри рабочего процесса сервера 1С — rphost.exe. И выполняется он от имени специальной системной учетной записи службы 1С:Предприятия (по умолчанию в Windows это USR1CV8). У этой учетной записи совершенно другое окружение:
Именно поэтому простая попытка вызвать метод HTTPСоединение.Получить() на сервере натыкается на глухую стену сетевых блокировок. Выясним основные причины и рассмотрим пошаговые методы решения этой проблемы.
Первое, что необходимо проверить — имеет ли вообще операционная система и локальная сеть право выпускать процесс rphost.exe наружу. Очень часто системные администраторы блокируют исходящий трафик для всех сервисных учетных записей в целях безопасности.
Рассмотрим порядок диагностики прав:
services.msc) на сервере, где установлен сервер приложений 1С..\USR1CV8.C:\Program Files\1cv8\<ВерсияПлатформы>\bin\rphost.exe должны быть разрешены исходящие соединения по портам 80 (HTTP) и 443 (HTTPS).Для быстрой проверки прав доступа можно временно запустить службу 1С под учетной записью Администратора сервера. Если после этого HTTP-запрос отработал успешно — проблема со всей очевидностью кроется в ограничениях прав пользователя USR1CV8.
Если на вашем предприятии доступ в интернет осуществляется через прокси-сервер, клиентский компьютер знает об этом благодаря системным настройкам. Но сервер приложений 1С под своей учетной записью прокси-сервер "не видит".
Существует два пути решения этой проблемы: на уровне платформы и непосредственно в коде 1С.
Вариант А. Настройка через файл inetcfg.xml
Для того чтобы сервер 1С глобально знал о существовании прокси-сервера, мы можем создать конфигурационный файл inetcfg.xml в каталоге конфигов платформы. Рассмотрим этот процесс:
C:\Program Files\1cv8\conf\ (для 64-битной Windows-платформы).inetcfg.xml.
<?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()
);
При работе с защищенными протоколами 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-сертификатов и успешно продолжать работу.
Если все предыдущие шаги выполнены, но сервер по-прежнему блокирует запросы, велика вероятность, что для вашей информационной базы включены Профили безопасности в консоли кластера 1С.
Профили безопасности — это мощный инструмент защиты, который позволяет администраторам жестко ограничить код конфигурации в правах. Если профиль включен, по умолчанию запрещается любое обращение к внешним интернет-ресурсам.
Проанализируем эту ситуацию:
api.service.com или * для неограниченного доступа).Иногда банальная рассинхронизация сетевых настроек клиента и сервера приводит к ошибке. Например, на вашем компьютере прописан публичный DNS-сервер, который успешно разрешает имя api.service.com в IP-адрес. На сервере же приложений 1С может быть настроен только локальный контроллер домена, у которого нет пересылки внешних DNS-запросов.
Как быстро локализовать проблему с DNS:
ping api.service.com или nslookup api.service.com.8.8.8.8) в настройках сетевого адаптера сервера.Сведем все полученные знания в единый надежный шаблон кода, который минимизирует вероятность ошибок при переносе логики выполнения на сервер. Мы задействуем безопасный вызов, обработку возможных прокси и защищенное соединение:
&НаСервере
Функция Выполнить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С по расписанию поверх существующих планов обмена применяется программа для автоматизации регулярного обмена данными.