При работе с внешними сервисами, такими как Яндекс.Маркет, PriceLabs или современными API банков, разработчики часто сталкиваются с необходимостью загрузки данных по защищенному протоколу HTTPS. Если в актуальных версиях платформы 8.3 эта задача решается достаточно просто, то в среде 1С 8.2 возникают серьезные технические сложности, связанные с устареванием встроенных библиотек шифрования. Разберем подробно, почему возникает ошибка SSL connect error и как ее преодолеть различными способами.
Проанализируем ситуацию, когда стандартный код создания HTTPСоединение с использованием ЗащищенноеСоединениеOpenSSL выдает ошибку. Основная причина кроется в том, что платформа 1С 8.2 была разработана в эпоху, когда стандартом являлись протоколы SSL 3.0 и TLS 1.0. На сегодняшний день эти протоколы признаны небезопасными и отключены на большинстве современных серверов.
Современные веб-серверы требуют использования протоколов TLS 1.2 или TLS 1.3. Встроенный механизм OpenSSL в платформе 8.2 зачастую не умеет инициировать соединение по этим протоколам, что и приводит к мгновенному обрыву связи с диагностикой "Ошибка работы с Интернет".
Рассмотрим наиболее правильный и современный подход, если есть возможность использовать компоненты платформы 8.3. Начиная с версии 8.3.х, механизмы работы с защищенными соединениями были значительно доработаны. Если в вашей конфигурации присутствует БСП (Библиотека стандартных подсистем), мы можем воспользоваться готовыми методами.
Посмотрим на пример кода, который позволяет скачать файл, используя возможности актуальной платформы:
ПараметрыПолучения = ПолучениеФайловИзИнтернета.ПараметрыПолученияФайла();
ПараметрыПолучения.Вставить("Логин", "user");
ПараметрыПолучения.Вставить("Пароль", "password");
Результат = ПолучениеФайловИзИнтернета.СкачатьФайлИзИнтернета(АдресСсылки, "C:\temp\prices.csv", ПараметрыПолучения);
Если Результат.Статус Тогда
Сообщить("Файл успешно скачан!");
Иначе
Сообщить("Ошибка: " + Результат.СообщениеОбОшибке);
КонецЕсли;
Этот метод хорош тем, что он автоматически обрабатывает нюансы авторизации и настройки защищенного соединения, опираясь на актуальные библиотеки платформы.
Выясним, что делать, если переход на 8.3 невозможен. В этом случае мы рекомендуем отказаться от использования объекта HTTPСоединение и обратиться к системным компонентам Windows. Наиболее стабильным вариантом является использование объекта WinHttp.WinHttpRequest.5.1.
Главное преимущество этого метода — использование системных библиотек ОС, которые поддерживают TLS 1.2 (при условии, что операционная система обновлена). Разберем по шагам реализацию запроса:
// Создаем объект запроса
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
// Устанавливаем принудительное использование протокола TLS 1.2
// Значение 2048 соответствует SecureProtocols_Tls12
WinHttp.Option(9, 2048);
// Открываем соединение (GET запрос)
WinHttp.Open("GET", "https://pricelabs.yandex.ru/export/prices.csv", Ложь);
// Если требуется авторизация, передаем ее в заголовке Authorization
// Либо используем метод SetCredentials
WinHttp.SetCredentials("user", "password", 0);
// Отправляем запрос
WinHttp.Send();
// Проверяем статус
Если WinHttp.Status = 200 Тогда
// Сохраняем результат в файл
// Для работы с бинарными данными в 8.2 лучше использовать ADODB.Stream
Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 1; // Binary
Поток.Open();
Поток.Write(WinHttp.ResponseBody);
Поток.SaveToFile("C:\temp\prices.csv", 2); // 2 - перезаписать
Поток.Close();
Сообщить("Файл успешно получен через WinHTTP");
Иначе
Сообщить("Ошибка запроса: " + WinHttp.Status + " " + WinHttp.StatusText);
КонецЕсли;
Проанализируем еще один способ, который часто называют "спасательным кругом" для старых систем. Мы можем делегировать задачу скачивания файла командной оболочке PowerShell, которая имеет прямой доступ к сетевому стеку Windows.
Для корректной работы с TLS 1.2 в PowerShell необходимо предварительно указать тип протокола в сессии. Рассмотрим пример формирования команды для вызова из 1С:
КомандаPS = "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; " +
"$webClient = New-Object System.Net.WebClient; " +
"$webClient.Credentials = New-Object System.Net.NetworkCredential('user', 'password'); " +
"$webClient.DownloadFile('https://server.com/file.csv', 'C:\temp\file.csv')";
ЗапуститьПриложение("powershell -ExecutionPolicy Bypass -WindowStyle Hidden -Command """ + КомандаPS + """", , Истина);
Здесь мы используем ЗапуститьПриложение с параметром ожидания завершения (Истина), чтобы программа дождалась окончания загрузки файла перед тем, как продолжить выполнение кода 1С.
Разберем дополнительные нюансы, которые могут повлиять на результат:
https://user:pass@domain.ru является устаревшей. Старайтесь всегда использовать заголовки (Headers) или специализированные методы объектов (SetCredentials), так как многие современные серверы блокируют URL-авторизацию в целях безопасности.bin вашей платформы файл cacert.pem содержит актуальные корневые сертификаты. Иногда требуется вручную добавить туда сертификат удостоверяющего центра вашего контрагента.Подводя итог, можно сказать: если ваша задача — стабильная работа в 1С 8.2 с современным вебом, используйте WinHTTP. Если есть возможность использовать 8.3 — применяйте штатные HTTPСоединение с правильно настроенным ЗащищенноеСоединениеOpenSSL. Это обеспечит максимальную производительность и надежность вашего решения.