Как скачать изображение по ссылке и поместить его во временное хранилище 1С

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

В процессе разработки в среде 1С часто возникает задача автоматизации загрузки контента из интернета. Это может быть загрузка фотографий товаров для интернет-магазина, получение логотипов контрагентов по ИНН или сбор аналитических данных. В данной статье мы подробно разберем, как правильно реализовать скачивание изображения, зная только его URL-адрес, и как корректно передать эти данные во временное хранилище для дальнейшего использования в базе данных.

Разбор структуры URL-адреса

Прежде чем приступать к написанию кода, проанализируем структуру ссылки. Стандартная ссылка на изображение выглядит так: https://example.com/images/photo.jpg. Для работы объекта 1С HTTPСоединение нам необходимо разделить эту строку на две составляющие:

  1. Адрес сервера: Это доменное имя (хост), например, example.com.
  2. Путь к ресурсу: Это путь внутри сайта, начиная от корня, например, /images/photo.jpg.

Важно помнить, что 1С не требует указания протокола (http://) в параметре «Адрес сервера». Если мы попытаемся передать https://example.com в конструктор соединения, система выдаст ошибку Couldn't resolve host name.

Способ 1: Использование HTTPСоединение (Универсальный метод)

Этот метод является наиболее правильным и гибким, так как позволяет управлять заголовками запроса, работать с защищенными соединениями (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 Тогда
        // Получаем двоичные данные картинки
        ДвоичныеДанныеКартинки = Ответ.ПолучитьТелоКакДвоичныеДанные();
        
        // Помещаем во временное хранилище
        АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки);
        
        Сообщить("Файл успешно загружен и помещен в хранилище: " + АдресВоВременномХранилище);
    Иначе
        Сообщить("Ошибка при скачивании. Код состояния: " + Ответ.КодСостояния);
    КонецЕсли;
Исключение
    Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
КонецПопытки;

Важный нюанс: Если вы получаете ошибку «Каталог не обнаружен» при сохранении, убедитесь, что вы работаете в правильном контексте (НаКлиенте или НаСервере). Если вы скачиваете файл во временную папку на сервере, а потом пытаетесь обратиться к ней с клиента, файл не будет найден.

Способ 2: Загрузка через временный файл

Иногда удобнее сначала сохранить картинку на диск, а уже потом считать её в 1С. Это полезно, если файл большой или если вы хотите проверить его целостность перед записью в базу. Разберем, как использовать метод ВызватьHTTPМетод с указанием имени файла.


ИмяВременногоФайла = ПолучитьИмяВременногоФайла("jpg");
ssl = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Соединение = Новый HTTPСоединение("www.site.ru",,,,,,, ssl);
Запрос = Новый HTTPЗапрос("/images/item123.jpg");

// Указываем третий параметр - имя файла, куда будет сохранен ответ
Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос, ИмяВременногоФайла);

Если Ответ.КодСостояния = 200 Тогда
    // Создаем двоичные данные из сохраненного файла
    КартинкаДД = Новый ДвоичныеДанные(ИмяВременногоФайла);
    АдресХранилища = ПоместитьВоВременноеХранилище(КартинкаДД);
    
    // Не забываем удалять временные файлы после использования!
    УдалитьФайлы(ИмяВременногоФайла);
КонецЕсли;

Способ 3: Метод КопироватьФайл (Упрощенный)

Выясним причину, по которой этот метод часто выбирают новички. Он максимально прост и не требует ручного разбора URL на сервер и путь. Система самостоятельно обрабатывает строку адреса. Однако у этого метода есть ограничения: он плохо подходит для сложных авторизаций и не позволяет гибко настраивать заголовки запроса.

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


// Полная ссылка на изображение
ПутьКФайлу = "https://images.primer.com/photo.jpg";

// Создаем имя для временного локального файла
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("jpg");

Попытка
    // Метод КопироватьФайл умеет работать с URL напрямую
    КопироватьФайл(ПутьКФайлу, ИмяВременногоФайла);
    
    // Читаем данные и помещаем в хранилище
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
    АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
    
    // Очистка временного файла
    УдалитьФайлы(ИмяВременногоФайла);
Исключение
    Сообщить("Ошибка копирования файла: " + ОписаниеОшибки());
КонецПопытки;

Рекомендации и типичные ошибки

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

  1. Проверка MIME-типа: Перед помещением данных в базу данных полезно убедиться, что сервер вернул именно картинку, а не текст ошибки. Проверить это можно через заголовок ответа Content-Type (он должен начинаться с image/).
  2. Обработка редиректов: Если сервер возвращает код 301 или 302, это означает, что файл перемещен. Метод Получить() в 1С автоматически не переходит по таким ссылкам. Вам придется программно извлечь адрес из заголовка Location и отправить повторный запрос.
  3. Таймауты: При работе с медленными сайтами обязательно устанавливайте таймаут в HTTPСоединение, чтобы сеанс пользователя не завис в ожидании ответа.
  4. Права доступа: Если код выполняется на стороне сервера 1С (в фоновом задании или серверном модуле), убедитесь, что у учетной записи, под которой запущен агент сервера 1С, есть права на доступ в интернет и запись в папку временных файлов.

Подводя итог, можно сказать следующее: для простых задач на Windows-серверах вполне подходит метод КопироватьФайл. Однако для профессиональной разработки, кроссплатформенности (Linux) и надежной работы с различными веб-серверами следует использовать HTTPСоединение с обязательной настройкой ЗащищенноеСоединениеOpenSSL.

← На главную