Как загрузить файлы по протоколу HTTPS в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Разберем ситуацию, с которой часто сталкиваются разработчики, поддерживающие конфигурации на платформе 1С:Предприятие 7.7. Стандартная компонента V7HttpReader, которая долгие годы служила верой и правдой для загрузки данных из интернета, ограничена поддержкой только протокола HTTP. В современных реалиях, когда практически все веб-ресурсы перешли на защищенное соединение HTTPS, использование этой компоненты становится невозможным.

Проблема заключается в том, что 1С 7.7 была создана до массового внедрения современных стандартов шифрования (TLS 1.2/1.3). Однако это не означает, что задача не имеет решения. Рассмотрим подробнее несколько проверенных способов реализации загрузки файлов по HTTPS, начиная от использования системных объектов Windows и заканчивая внешними консольными утилитами.

Способ 1: Использование объекта WinHttp.WinHttpRequest

Этот метод является наиболее предпочтительным, так как он не требует установки стороннего программного обеспечения и работает через стандартные библиотеки Windows. Мы будем использовать объект WinHttp.WinHttpRequest.5.1 для выполнения запроса и ADODB.Stream для сохранения полученных бинарных данных (картинки) на диск.

Проанализируем, почему нельзя просто получить текст ответа. Картинка — это бинарный файл. Платформа 1С 7.7 некорректно обрабатывает строки, содержащие символ с кодом 0 (null-терминатор), который часто встречается в изображениях. Поэтому мы используем ADODB.Stream, который умеет работать с потоками байтов напрямую.

Рассмотрим пример кода:


Процедура ЗагрузитьФайлЧерезWinHttp(УрлИсточника, ПутьСохранения)
    Попытка
        // Создаем объект HTTP-запроса
        HttpЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
        HttpЗапрос.Open("GET", УрлИсточника, 0);
        
        // В некоторых случаях требуется принудительно включить TLS 1.2
        // HttpЗапрос.Option(9) = 2048; 
        
        HttpЗапрос.Send();
        
        Если HttpЗапрос.Status = 200 Тогда
            // Используем ADODB.Stream для сохранения бинарных данных
            Поток = СоздатьОбъект("ADODB.Stream");
            Поток.Type = 1; // Тип бинарный
            Поток.Open();
            Поток.Write(HttpЗапрос.ResponseBody);
            Поток.SaveToFile(ПутьСохранения, 2); // 2 - перезаписать файл, если существует
            Поток.Close();
            Сообщить("Файл успешно загружен: " + ПутьСохранения);
        Иначе
            Сообщить("Ошибка при загрузке: " + HttpЗапрос.Status + " " + HttpЗапрос.StatusText);
        КонецЕсли;
    Исключение
        Сообщить("Ошибка при инициализации объектов Windows: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Способ 2: Использование системной утилиты PowerShell

Если ваша учетная система работает на ОС Windows 7 и выше, вам доступен мощный инструмент — PowerShell. Он позволяет выполнить загрузку одной командой, которую можно вызвать из 1С через КомандаСистемы или ЗапуститьПриложение. Это избавляет от необходимости регистрировать дополнительные компоненты.

Разберем по шагам, как сформировать такую команду. Мы используем метод DownloadFile объекта Net.WebClient. Проанализируем синтаксис команды:


Процедура ЗагрузитьЧерезPowerShell(УрлФайла, ИмяФайлаПриемник)
    // Формируем текст команды для PowerShell
    ТекстКоманды = "powershell -Command ""(New-Object Net.WebClient).DownloadFile('" + УрлФайла + "', '" + ИмяФайлаПриемник + "')""";
    
    // Запускаем выполнение
    КомандаСистемы(ТекстКоманды);
    
    // Проверяем наличие файла после выполнения
    Если ФС.СуществуетФайл(ИмяФайлаПриемник) = 1 Тогда
        Сообщить("Загрузка завершена успешно.");
    Иначе
        Сообщить("Файл не был загружен. Проверьте права доступа и наличие интернета.");
    КонецЕсли;
КонецПроцедуры

Важное примечание: в современных версиях Windows (10/11) PowerShell поддерживает псевдонимы curl и wget, что позволяет сократить команду, но использование Net.WebClient считается более универсальным для разных версий окружения.

Способ 3: Внешние утилиты wget и curl

Если работа ведется на устаревших серверах (например, Windows Server 2003) или если требуется специфическая обработка сертификатов, отличным решением станет использование консольных утилит wget или curl.

Выясним причину, почему это иногда удобнее: эти утилиты имеют встроенные флаги для игнорирования ошибок SSL-сертификатов (например, если сертификат самоподписанный или просрочен). Для wget это флаг --no-check-certificate, а для curl — флаг -k.

Посмотрим на пример реализации с wget:

  1. Скачайте версию wget для Windows и поместите исполняемый файл в каталог базы или системную папку.
  2. Вызовите команду из кода 1С.

Процедура ЗагрузитьЧерезWget(СсылкаФайл, ПутьНаДиске)
    // Путь к исполняемому файлу wget.exe
    ПутьКWget = КаталогИБ() + "ExtForms\wget.exe";
    
    // Формируем параметры запуска
    // -P задает каталог сохранения, --no-check-certificate отключает проверку SSL
    ПараметрыЗапуска = " -P " + ПутьНаДиске + " " + СсылкаФайл + " --no-check-certificate";
    
    КомандаСистемы(ПутьКWget + ПараметрыЗапуска);
КонецПроцедуры

Возможные проблемы и пути их решения

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

  1. Протокол TLS 1.2: Если сервер, с которого вы качаете фото, требует протокол TLS 1.2, а вы используете Windows XP или старую сборку Windows 7, WinHttp может выдать ошибку соединения. В этом случае необходимо установить обновления системы (KB3140245 для Win7) или использовать актуальную версию curl.exe, которая носит свои библиотеки шифрования с собой.
  2. Права доступа: При использовании КомандаСистемы 1С запускает процесс от имени текущего пользователя. Убедитесь, что у этого пользователя есть права на запись в целевой каталог (например, S:\Temp). Если файл не появляется, попробуйте сначала выполнить команду вручную в командной строке (cmd), чтобы увидеть текст ошибки.
  3. Кириллица в путях: Платформа 1С 7.7 работает с кодировкой ANSI. Если в URL-адресе или путях к файлам есть русские буквы, их необходимо предварительно закодировать в формат URL-encode, иначе внешние утилиты их не распознают.

Подводя итог, можно сказать, что наиболее стабильным и современным способом для программиста 1С 7.7 является связка WinHttp + ADODB.Stream. Она работает "тихо", быстро и не требует наличия сторонних файлов в папке с базой данных. Внешние же утилиты стоит применять в тех случаях, когда системные компоненты не справляются с шифрованием конкретного сайта.

← На главную