Разберем ситуацию, с которой часто сталкиваются разработчики, поддерживающие конфигурации на платформе 1С:Предприятие 7.7. Стандартная компонента V7HttpReader, которая долгие годы служила верой и правдой для загрузки данных из интернета, ограничена поддержкой только протокола HTTP. В современных реалиях, когда практически все веб-ресурсы перешли на защищенное соединение HTTPS, использование этой компоненты становится невозможным.
Проблема заключается в том, что 1С 7.7 была создана до массового внедрения современных стандартов шифрования (TLS 1.2/1.3). Однако это не означает, что задача не имеет решения. Рассмотрим подробнее несколько проверенных способов реализации загрузки файлов по HTTPS, начиная от использования системных объектов Windows и заканчивая внешними консольными утилитами.
Этот метод является наиболее предпочтительным, так как он не требует установки стороннего программного обеспечения и работает через стандартные библиотеки 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: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если ваша учетная система работает на ОС 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 считается более универсальным для разных версий окружения.
Если работа ведется на устаревших серверах (например, Windows Server 2003) или если требуется специфическая обработка сертификатов, отличным решением станет использование консольных утилит wget или curl.
Выясним причину, почему это иногда удобнее: эти утилиты имеют встроенные флаги для игнорирования ошибок SSL-сертификатов (например, если сертификат самоподписанный или просрочен). Для wget это флаг --no-check-certificate, а для curl — флаг -k.
Посмотрим на пример реализации с wget:
wget для Windows и поместите исполняемый файл в каталог базы или системную папку.
Процедура ЗагрузитьЧерезWget(СсылкаФайл, ПутьНаДиске)
// Путь к исполняемому файлу wget.exe
ПутьКWget = КаталогИБ() + "ExtForms\wget.exe";
// Формируем параметры запуска
// -P задает каталог сохранения, --no-check-certificate отключает проверку SSL
ПараметрыЗапуска = " -P " + ПутьНаДиске + " " + СсылкаФайл + " --no-check-certificate";
КомандаСистемы(ПутьКWget + ПараметрыЗапуска);
КонецПроцедуры
Рассмотрим подробнее нюансы, которые могут возникнуть при использовании любого из вышеперечисленных методов:
WinHttp может выдать ошибку соединения. В этом случае необходимо установить обновления системы (KB3140245 для Win7) или использовать актуальную версию curl.exe, которая носит свои библиотеки шифрования с собой.КомандаСистемы 1С запускает процесс от имени текущего пользователя. Убедитесь, что у этого пользователя есть права на запись в целевой каталог (например, S:\Temp). Если файл не появляется, попробуйте сначала выполнить команду вручную в командной строке (cmd), чтобы увидеть текст ошибки.Подводя итог, можно сказать, что наиболее стабильным и современным способом для программиста 1С 7.7 является связка WinHttp + ADODB.Stream. Она работает "тихо", быстро и не требует наличия сторонних файлов в папке с базой данных. Внешние же утилиты стоит применять в тех случаях, когда системные компоненты не справляются с шифрованием конкретного сайта.