В процессе разработки в среде 1С часто возникает задача автоматизации загрузки контента из интернета. Это может быть загрузка фотографий товаров для интернет-магазина, получение логотипов контрагентов по ИНН или сбор аналитических данных. В данной статье мы подробно разберем, как правильно реализовать скачивание изображения, зная только его URL-адрес, и как корректно передать эти данные во временное хранилище для дальнейшего использования в базе данных.
Прежде чем приступать к написанию кода, проанализируем структуру ссылки. Стандартная ссылка на изображение выглядит так: https://example.com/images/photo.jpg. Для работы объекта 1С HTTPСоединение нам необходимо разделить эту строку на две составляющие:
example.com./images/photo.jpg.Важно помнить, что 1С не требует указания протокола (http://) в параметре «Адрес сервера». Если мы попытаемся передать https://example.com в конструктор соединения, система выдаст ошибку Couldn't resolve host name.
Этот метод является наиболее правильным и гибким, так как позволяет управлять заголовками запроса, работать с защищенными соединениями (SSL) и контролировать процесс получения данных. Рассмотрим реализацию по шагам.
Для начала проанализируем ситуацию с протоколом HTTPS. Большинство современных сайтов работают через защищенное соединение. Чтобы 1С могла к ним подключиться, нам понадобится объект ЗащищенноеСоединениеOpenSSL. Если пропустить этот шаг, соединение с сайтами, использующими SSL, будет невозможно.
// Определим исходные данные
АдресСервера = "example.com";
ПутьККартинке = "/static/logo.png";
// Настраиваем безопасное соединение
// Используем неопределено для параметров сертификатов, чтобы использовать системные настройки
ssl = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
// Создаем HTTP-соединение
// Обратите внимание на 7-й параметр - туда передается объект ssl
Соединение = Новый HTTPСоединение(АдресСервера, , , , , , ssl);
// Формируем запрос
Запрос = Новый HTTPЗапрос(ПутьККартинке);
// В некоторых случаях серверы блокируют запросы без User-Agent
// Рекомендуется добавить имитацию браузера
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
Попытка
// Выполняем запрос
Ответ = Соединение.Получить(Запрос);
// Проверяем код состояния (200 - успех)
Если Ответ.КодСостояния = 200 Тогда
// Получаем двоичные данные картинки
ДвоичныеДанныеКартинки = Ответ.ПолучитьТелоКакДвоичныеДанные();
// Помещаем во временное хранилище
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки);
Сообщить("Файл успешно загружен и помещен в хранилище: " + АдресВоВременномХранилище);
Иначе
Сообщить("Ошибка при скачивании. Код состояния: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
КонецПопытки;
Важный нюанс: Если вы получаете ошибку «Каталог не обнаружен» при сохранении, убедитесь, что вы работаете в правильном контексте (НаКлиенте или НаСервере). Если вы скачиваете файл во временную папку на сервере, а потом пытаетесь обратиться к ней с клиента, файл не будет найден.
Иногда удобнее сначала сохранить картинку на диск, а уже потом считать её в 1С. Это полезно, если файл большой или если вы хотите проверить его целостность перед записью в базу. Разберем, как использовать метод ВызватьHTTPМетод с указанием имени файла.
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("jpg");
ssl = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Соединение = Новый HTTPСоединение("www.site.ru",,,,,,, ssl);
Запрос = Новый HTTPЗапрос("/images/item123.jpg");
// Указываем третий параметр - имя файла, куда будет сохранен ответ
Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос, ИмяВременногоФайла);
Если Ответ.КодСостояния = 200 Тогда
// Создаем двоичные данные из сохраненного файла
КартинкаДД = Новый ДвоичныеДанные(ИмяВременногоФайла);
АдресХранилища = ПоместитьВоВременноеХранилище(КартинкаДД);
// Не забываем удалять временные файлы после использования!
УдалитьФайлы(ИмяВременногоФайла);
КонецЕсли;
Выясним причину, по которой этот метод часто выбирают новички. Он максимально прост и не требует ручного разбора URL на сервер и путь. Система самостоятельно обрабатывает строку адреса. Однако у этого метода есть ограничения: он плохо подходит для сложных авторизаций и не позволяет гибко настраивать заголовки запроса.
Посмотрим на пример реализации:
// Полная ссылка на изображение
ПутьКФайлу = "https://images.primer.com/photo.jpg";
// Создаем имя для временного локального файла
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("jpg");
Попытка
// Метод КопироватьФайл умеет работать с URL напрямую
КопироватьФайл(ПутьКФайлу, ИмяВременногоФайла);
// Читаем данные и помещаем в хранилище
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
// Очистка временного файла
УдалитьФайлы(ИмяВременногоФайла);
Исключение
Сообщить("Ошибка копирования файла: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем основные моменты, которые могут привести к неудаче при загрузке изображений:
Content-Type (он должен начинаться с image/).Получить() в 1С автоматически не переходит по таким ссылкам. Вам придется программно извлечь адрес из заголовка Location и отправить повторный запрос.HTTPСоединение, чтобы сеанс пользователя не завис в ожидании ответа.Подводя итог, можно сказать следующее: для простых задач на Windows-серверах вполне подходит метод КопироватьФайл. Однако для профессиональной разработки, кроссплатформенности (Linux) и надежной работы с различными веб-серверами следует использовать HTTPСоединение с обязательной настройкой ЗащищенноеСоединениеOpenSSL.