Работа с внешними API и веб-сервисами — неотъемлемая часть современной разработки на платформе 1С. Однако в корпоративных сетях выход в интернет часто ограничен прокси-сервером. Настройка объекта ИнтернетПрокси кажется тривиальной задачей, но на практике разработчики сталкиваются с неочевидными ошибками, такими как «Не могу установить соединение» или «Proxy Authentication Required». В этой статье мы подробно разберем, как правильно инициализировать прокси-сервер, настроить защищенное соединение и избежать типичных ошибок при типизации данных.
Рассмотрим ситуацию, с которой часто сталкиваются программисты. При попытке установить соединение через прокси код падает в блок Исключение. Разберем типичный фрагмент кода, содержащий ошибки:
ПроксиСервер = Новый ИнтернетПрокси;
ПроксиСервер.Пользователь = "login";
ПроксиСервер.Пароль = "password";
ПроксиСервер.Установить("https", "185.221.100.10", "8080");
В данном примере кроются две критические проблемы. Во-первых, порт прокси-сервера передается как строка "8080", хотя метод Установить ожидает тип Число. Во-вторых, жесткое указание протокола "https" может привести к тому, что для других протоколов (например, обычного http) настройки прокси просто не применятся. Выясним, как сделать этот код надежным.
Первым делом проанализируем синтаксис метода Установить. Для того чтобы прокси-сервер работал универсально для всех видов трафика (HTTP, HTTPS, FTP), рекомендуется не указывать конкретный протокол в первом параметре, а передать Неопределено. Также крайне важно следить за типами данных.
Рассмотрим исправленный и дополненный вариант настройки:
ПроксиСервер = Новый ИнтернетПрокси;
// Определяем параметры подключения
АдресПрокси = "185.221.100.10";
ПортПрокси = 8080; // Обязательно число!
Логин = "admin";
Пароль = "P@ssw0rd";
// Устанавливаем настройки для всех протоколов разом
// Синтаксис: Установить(<Протокол>, <Адрес>, <Порт>, <Пользователь>, <Пароль>, <НеИспользоватьДляЛокальных>)
ПроксиСервер.Установить(Неопределено, АдресПрокси, ПортПрокси, Логин, Пароль, Ложь);
Важный нюанс: если вы используете метод Установить, параметры Пользователь и Пароль внутри него имеют приоритет над свойствами объекта ПроксиСервер.Пользователь. Поэтому лучше указывать всё внутри одного метода для чистоты кода.
Если ваша задача — подключиться к ресурсу по протоколу HTTPS (например, к API Telegram или государственным сервисам), одного объекта ИнтернетПрокси недостаточно. Нам необходимо правильно настроить ЗащищенноеСоединениеOpenSSL.
Часто разработчики перегружают конструктор лишними параметрами (сертификатами Windows), что в некоторых серверных окружениях может вызвать конфликт. Рассмотрим оптимальный способ создания HTTPСоединение с использованием прокси:
// 1. Создаем защищенное соединение с параметрами по умолчанию
Защита = Новый ЗащищенноеСоединениеOpenSSL();
// 2. Инициализируем прокси
Прокси = Новый ИнтернетПрокси;
Прокси.Установить(Неопределено, "185.221.100.10", 9790, "user", "pass");
// 3. Создаем соединение, передавая объект прокси в соответствующий параметр
Попытка
Соединение = Новый HTTPСоединение("api.example.org", 443, , , Прокси, 30, Защита);
Запрос = Новый HTTPЗапрос("/v1/data");
Ответ = Соединение.Получить(Запрос);
Сообщить("Код состояния: " + Ответ.КодСостояния);
Исключение
Сообщить("Ошибка соединения: " + ОписаниеОшибки());
КонецПопытки;
Бывают ситуации, когда прокси-сервер должен использоваться всеми сеансами 1С по умолчанию, и прописывать его в коде каждого модуля неудобно. В этом случае мы можем воспользоваться файлом конфигурации inetcfg.xml. Этот файл располагается в каталоге conf установленной платформы (например, C:\Program Files\1cv8\conf\).
В этом файле можно жестко задать параметры прокси:
<?xml version="1.0" encoding="UTF-8"?>
<InternetProxy
proxyName="185.221.100.10"
proxyPort="8080"
proxyUser="admin"
proxyPassword="password"
bypassOnLocal="true"
/>
После внесения изменений в этот файл (на всех серверах кластера) 1С будет автоматически использовать данные настройки, если в коде явно не указан иной объект ИнтернетПрокси.
Если ваш сервер 1С работает под управлением Linux, следует помнить, что объект ИнтернетПрокси может игнорировать настройки, заданные в коде. В Linux-среде платформа часто ориентируется на переменные окружения операционной системы. Разберем, какие переменные должны быть определены для пользователя, под которым запущена служба rasd или rphost:
Важно: в Linux регистр имен переменных имеет значение (используйте нижний регистр).
Проанализируем ситуацию, когда внешние запросы должны идти через прокси, а запросы к внутренним веб-сервисам компании — напрямую. Если попытаться достучаться до локального сервера через внешний прокси, мы получим ошибку. Для решения этой задачи у объекта ИнтернетПрокси есть коллекция НеИспользоватьПроксиДляАдресов.
Посмотрим, как правильно добавить исключения:
Прокси = Новый ИнтернетПрокси;
Прокси.Установить(Неопределено, "185.221.100.10", 8080);
// Добавляем локальные адреса в исключения
Прокси.НеИспользоватьПроксиДляАдресов.Добавить("localhost");
Прокси.НеИспользоватьПроксиДляАдресов.Добавить("127.0.0.1");
Прокси.НеИспользоватьПроксиДляАдресов.Добавить("192.168.*");
Прокси.НеИспользоватьПроксиДляАдресов.Добавить("*.localdomain");
Если ваш прокси-сервер требует доменной авторизации (NTLM), 1С может выдавать ошибку 407 Proxy Authentication Required. Выясним причину: встроенный механизм 1С не всегда корректно проходит многоэтапную авторизацию NTLM. В таких случаях можно попробовать следующие подходы:
CNTLM, которые создают локальный HTTP-прокси без авторизации, выступая «прослойкой» между 1С и корпоративным прокси-сервером.Если соединение все равно не устанавливается, пройдемся по следующим пунктам:
Число, а не как Строка.Неопределено.rphost.exe.ИнтернетПрокси не поддерживается.Применяя эти правила и подходы, мы сможем построить надежную систему взаимодействия 1С с внешними ресурсами даже в условиях сложной сетевой инфраструктуры.