Как получить файл по протоколу HTTPS в 1С:Предприятие 8.2 и 8.3

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

При работе с внешними сервисами, такими как Яндекс.Маркет, PriceLabs или современными API банков, разработчики часто сталкиваются с необходимостью загрузки данных по защищенному протоколу HTTPS. Если в актуальных версиях платформы 8.3 эта задача решается достаточно просто, то в среде 1С 8.2 возникают серьезные технические сложности, связанные с устареванием встроенных библиотек шифрования. Разберем подробно, почему возникает ошибка SSL connect error и как ее преодолеть различными способами.

Причина проблемы: Протоколы безопасности TLS

Проанализируем ситуацию, когда стандартный код создания HTTPСоединение с использованием ЗащищенноеСоединениеOpenSSL выдает ошибку. Основная причина кроется в том, что платформа 1С 8.2 была разработана в эпоху, когда стандартом являлись протоколы SSL 3.0 и TLS 1.0. На сегодняшний день эти протоколы признаны небезопасными и отключены на большинстве современных серверов.

Современные веб-серверы требуют использования протоколов TLS 1.2 или TLS 1.3. Встроенный механизм OpenSSL в платформе 8.2 зачастую не умеет инициировать соединение по этим протоколам, что и приводит к мгновенному обрыву связи с диагностикой "Ошибка работы с Интернет".

Способ 1. Использование штатных средств платформы 8.3

Рассмотрим наиболее правильный и современный подход, если есть возможность использовать компоненты платформы 8.3. Начиная с версии 8.3.х, механизмы работы с защищенными соединениями были значительно доработаны. Если в вашей конфигурации присутствует БСП (Библиотека стандартных подсистем), мы можем воспользоваться готовыми методами.

Посмотрим на пример кода, который позволяет скачать файл, используя возможности актуальной платформы:


ПараметрыПолучения = ПолучениеФайловИзИнтернета.ПараметрыПолученияФайла();
ПараметрыПолучения.Вставить("Логин", "user");
ПараметрыПолучения.Вставить("Пароль", "password");

Результат = ПолучениеФайловИзИнтернета.СкачатьФайлИзИнтернета(АдресСсылки, "C:\temp\prices.csv", ПараметрыПолучения);

Если Результат.Статус Тогда
    Сообщить("Файл успешно скачан!");
Иначе
    Сообщить("Ошибка: " + Результат.СообщениеОбОшибке);
КонецЕсли;

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

Способ 2. Решение для 1С 8.2 через COM-объект WinHTTP

Выясним, что делать, если переход на 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);
КонецЕсли;

Способ 3. Использование PowerShell в качестве внешней утилиты

Проанализируем еще один способ, который часто называют "спасательным кругом" для старых систем. Мы можем делегировать задачу скачивания файла командной оболочке 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С.

Важные замечания по авторизации и сертификатам

Разберем дополнительные нюансы, которые могут повлиять на результат:

  1. Авторизация в URL: Передача логина и пароля в формате https://user:pass@domain.ru является устаревшей. Старайтесь всегда использовать заголовки (Headers) или специализированные методы объектов (SetCredentials), так как многие современные серверы блокируют URL-авторизацию в целях безопасности.
  2. Файл сертификатов (cacert.pem): Если вы все же используете платформу 8.3 и сталкиваетесь с ошибками проверки сертификатов, убедитесь, что в папке bin вашей платформы файл cacert.pem содержит актуальные корневые сертификаты. Иногда требуется вручную добавить туда сертификат удостоверяющего центра вашего контрагента.
  3. Обновления Windows: Если вы используете COM-объекты или PowerShell на старых ОС (Windows 7 или Server 2008 R2), убедитесь, что установлено обновление KB3140245, иначе поддержка TLS 1.2 в системе будет отсутствовать на уровне ядра.

Подводя итог, можно сказать: если ваша задача — стабильная работа в 1С 8.2 с современным вебом, используйте WinHTTP. Если есть возможность использовать 8.3 — применяйте штатные HTTPСоединение с правильно настроенным ЗащищенноеСоединениеOpenSSL. Это обеспечит максимальную производительность и надежность вашего решения.

← На главную