При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда отправка POST-запроса через объект HTTPСоединение приводит к аварийному завершению работы платформы, зависанию на методе ОтправитьДляОбработки или ошибке вида «Ошибка работы с Интернет: Удаленный узел не прошел проверку». Разберем по шагам причины возникновения этих сбоев и рассмотрим правильные варианты отправки HTTP-запросов.
Проанализируем базовые ошибки, которые чаще всего приводят к сбоям при формировании HTTP-запроса:
HTTPСоединение передается только доменное имя или IP-адрес сервера (без указания протокола https://). Относительный путь к скрипту или эндпоинту указывается в объекте HTTPЗапрос.HTTPСоединение необходимо передавать специальный объект ЗащищенноеСоединениеOpenSSL. Передача булевых значений (Истина) на позицию защищенного соединения в современных версиях платформы недопустима.Content-Length приводит к тому, что сервер ожидает продолжения потока данных и разрывает соединение по таймауту. Платформа 1С при установке тела запроса из файла или строки способна вычислять длину автоматически.Chsrset вместо charset).Рассмотрим правильный пример кода для отправки POST-запроса средствами платформы «1С:Предприятие 8.3» с автоматической валидацией TLS через системные хранилища сертификатов.
// 1. Задаем адрес сервера и относительный путь к ресурсу
Сервер = "test.rb-ei.com";
Ресурс = "/cpuEnquiry.asp";
ИмяФайлаТела = "D:\Запрос.txt";
// 2. Инициализируем защищенное соединение
// Пустой конструктор ЗащищенноеСоединениеOpenSSL использует доверенные сертификаты операционной системы
Защита = Новый ЗащищенноеСоединениеOpenSSL();
HTTP = Новый HTTPСоединение(Сервер, 443,,,, 30, Защита);
// 3. Формируем тело и заголовки запроса
HTTPЗапрос = Новый HTTPЗапрос(Ресурс);
HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаТела);
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded; charset=windows-1251");
Заголовки.Вставить("Connection", "Close");
HTTPЗапрос.Заголовки = Заголовки;
// 4. Отправляем запрос и анализируем ответ сервера
Попытка
ФайлРезультат = ПолучитьИмяВременногоФайла();
HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос, ФайлРезультат);
Если HTTPОтвет.КодСостояния = 200 Тогда
ТекстовыйФайл = Новый ТекстовыйДокумент();
ТекстовыйФайл.Прочитать(ФайлРезультат, КодировкаТекста.UTF8);
СтрокаОтвета = ТекстовыйФайл.ПолучитьТекст();
Сообщить("Запрос успешно выполнен.");
Иначе
Сообщить("Сервер вернул код состояния: " + Строка(HTTPОтвет.КодСостояния));
КонецЕсли;
Исключение
Сообщить("Ошибка при отправке HTTP-запроса: " + ОписаниеОшибки());
КонецПопытки;
Выясним причину ошибки «Удаленный узел не прошел проверку» (unsupported algorithm). В платформу 1С встроен стандартный движок OpenSSL. Если целевой сервер (например, шлюз БКИ, госорганов или банков) требует авторизации по российским стандартам криптографии ГОСТ (алгоритмы ГОСТ Р 34.11 / 34.10), стандартный ЗащищенноеСоединениеOpenSSL не сможет выполнить TLS-рукопожатие, даже если сертификат установлен в Windows через «КриптоПро CSP».
Для решения этой проблемы рассмотрим альтернативные варианты интеграции:
Системный компонент Windows WinHTTP тесно интегрирован с криптопровайдерами CryptoPro CSP и Schannel. Посмотрим на реализацию запроса через COM-объект:
Попытка
HTTP = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
HTTP.Open("POST", "https://test.rb-ei.com/cpuEnquiry.asp", Ложь);
// При необходимости передачи клиентского сертификата ГОСТ:
// HTTP.SetClientCertificate("CURRENT_USER\MY\ОтпечатокИлиИмяСертификата");
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=windows-1251");
HTTP.SetRequestHeader("Connection", "Close");
// Читаем файл запроса в строку или двоичные данные
ТекстДокумент = Новый ТекстовыйДокумент();
ТекстДокумент.Прочитать("D:\Запрос.txt", КодировкаТекста.ANSI);
ТелоЗапроса = ТекстДокумент.ПолучитьТекст();
HTTP.Send(ТелоЗапроса);
КодСостояния = HTTP.Status;
ТекстОтвета = HTTP.ResponseText;
Если КодСостояния = 200 Тогда
Сообщить("Ответ успешно получен через WinHTTP");
Иначе
Сообщить("Ошибка HTTP. Код: " + Строка(КодСостояния));
КонецЕсли;
Исключение
Сообщить("Сбой WinHTTP: " + ОписаниеОшибки());
КонецПопытки;
Если код должен выполняться в кроссплатформенной среде (на серверах Linux) или требуется сохранить штатные механизмы HTTPСоединение, развернем локальный прокси-сервер (например, stunnel или nginx с поддержкой ГОСТ-движка). В этом случае 1С отправляет запрос по обычному протоколу HTTP на локальный порт localhost, а прокси-сервер выполняет шифрование и отправляет защищенный трафик на удаленный сервер.
usr1cv8 не имеет доступа к личным хранилищам сертификатов обычных пользователей. Сертификаты и закрытые ключи необходимо устанавливать в хранилище «Локальный компьютер» (Local Machine) и предоставлять учетной записи службы права на чтение закрытого ключа.