Как программно загрузить картинку в номенклатуру из интернета по прямой ссылке?

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

В процессе автоматизации наполнения каталога товаров в 1С:Управление торговлей 11 часто возникает задача массовой загрузки изображений. Если у вас есть таблица с артикулами и прямыми ссылками на фотографии, загружать их вручную — крайне неэффективно. В рамках данной статьи мы разберем, как программно скачать файл из сети и правильно привязать его к карточке Номенклатура, учитывая архитектурные особенности современных конфигураций на базе БСП (Библиотеки стандартных подсистем).

Разберем архитектуру хранения изображений в УТ 11

Прежде чем приступать к написанию кода, важно понять, что в современных версиях «1С:Управление торговлей» изображение не хранится непосредственно в самом справочнике Номенклатура. Для работы с файлами используется механизм присоединенных файлов. Процесс состоит из трех основных этапов:

  1. Получение двоичных данных картинки из интернета.
  2. Создание записи в подчиненном справочнике НоменклатураПрисоединенныеФайлы.
  3. Привязка созданного файла к основному реквизиту ФайлКартинки в карточке товара.

Метод 1: Использование HTTP-соединения для скачивания данных

Рассмотрим наиболее гибкий и надежный способ получения картинки — использование объекта HTTPСоединение. Этот метод позволяет нам не только получить файл, но и проанализировать заголовки ответа сервера, чтобы убедиться, что по ссылке действительно находится изображение, а не ошибка доступа.

Проанализируем пример кода для получения двоичных данных:


// Функция получает двоичные данные по URL
Функция ПолучитьДвоичныеДанныеКартинки(Знач СсылкаНаКартинку) Экспорт
    
    // Разберем URL на части для создания соединения
    СтруктураURL = НСтр(СсылкаНаКартинку); // В реальном коде используем парсинг URL
    Сервер = "example.com"; 
    Ресурс = "/images/item123.jpg";
    
    Попытка
        HTTPСоединение = Новый HTTPСоединение(Сервер, 443, , , , 10, Новый ЗащищенноеСоединениеOpenSSL());
        HTTPЗапрос = Новый HTTPЗапрос(Ресурс);
        HTTPЗапрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
        
        Результат = HTTPСоединение.Получить(HTTPЗапрос);
        
        Если Результат.КодСостояния = 200 Тогда
            Возврат Результат.ПолучитьТелоКакДвоичныеДанные();
        КонецЕсли;
    Исключение
        ЗаписьЖурналаРегистрации("ЗагрузкаКартинок", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
    
    Возврат Неопределено;
КонецФункции

Обратите внимание: использование заголовка User-Agent критически важно. Многие сайты блокируют запросы, если они не похожи на действия обычного браузера. Это помогает обойти ограничения, о которых часто упоминают разработчики при попытке автоматического парсинга.

Метод 2: Использование механизмов БСП (самый современный подход)

В современных типовых решениях (УТ 11, ERP 2, КА 2) реализован программный интерфейс для работы с интернет-ресурсами. Разберем работу с общим модулем ПолучениеФайловИзИнтернета. Этот метод предпочтительнее, так как он автоматически учитывает настройки прокси-сервера, заданные в системе.


ПараметрыПолучения = ПолучениеФайловИзИнтернета.ПараметрыПолученияФайла();
РезультатЗагрузки = ПолучениеФайловИзИнтернета.СкачатьФайлВоВременноеХранилище(АдресКартинки, ПараметрыПолучения);

Если РезультатЗагрузки.Статус Тогда
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(РезультатЗагрузки.Адрес);
    // Далее работаем с полученными данными
КонецЕсли;

Создание присоединенного файла в справочнике

Теперь, когда у нас есть ДвоичныеДанные, нам нужно поместить их в базу данных 1С. Выясним причину, по которой нельзя просто записать их в реквизит. В УТ 11 используется механизм ПрисоединенныеФайлы, который позволяет хранить файлы либо в томах на диске, либо в базе, обеспечивая при этом версионность и единый интерфейс доступа.

Рассмотрим пошагово алгоритм добавления файла к номенклатуре:


Процедура ПривязатьКартинкуКНоменклатуре(НоменклатураСсылка, ДвоичныеДанные, ИмяФайла)
    
    // 1. Создаем структуру параметров для нового файла
    ПараметрыФайла = Новый Структура;
    ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
    ПараметрыФайла.Вставить("ВладелецФайла", НоменклатураСсылка);
    ПараметрыФайла.Вставить("ИмяБезРасширения", "Изображение_" + НоменклатураСсылка.Артикул);
    ПараметрыФайла.Вставить("Расширение", "jpg");
    
    // 2. Используем программный интерфейс БСП для создания файла
    СсылкаНаФайл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, ПоместитьВоВременноеХранилище(ДвоичныеДанные), , , );
    
    // 3. Устанавливаем основное изображение для номенклатуры
    ОбъектНоменклатура = НоменклатураСсылка.ПолучитьОбъект();
    ОбъектНоменклатура.ФайлКартинки = СсылкаНаФайл;
    
    Попытка
        ОбъектНоменклатура.Записать();
    Исключение
        Сообщить("Ошибка при сохранении карточки: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Оптимизация массовой загрузки (Работа с фоновыми заданиями)

Если нам нужно загрузить тысячи картинок, выполнение этого процесса в основном потоке приведет к зависанию интерфейса пользователя. Выясним, как сделать загрузку «быстрой», как того хотел автор темы.

Рассмотрим использование механизма ФоновыеЗадания. Мы можем разбить список ссылок на пакеты (например, по 50-100 штук) и запускать для каждого пакета отдельный поток. Это позволит использовать всю мощность сервера и значительно ускорить процесс.

Важные рекомендации при массовой обработке:

Заключение

Мы проанализировали ситуацию и выяснили, что задача загрузки картинки из интернета в 1С требует комплексного подхода. Простая команда КопироватьФайл() может не сработать из-за ограничений веб-серверов или настроек безопасности. Использование HTTPСоединение в сочетании с механизмами РаботаСФайлами БСП является наиболее надежным и "правильным" способом с точки зрения архитектуры 1С:Предприятие 8.3.

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

← На главную