В процессе автоматизации наполнения каталога товаров в 1С:Управление торговлей 11 часто возникает задача массовой загрузки изображений. Если у вас есть таблица с артикулами и прямыми ссылками на фотографии, загружать их вручную — крайне неэффективно. В рамках данной статьи мы разберем, как программно скачать файл из сети и правильно привязать его к карточке Номенклатура, учитывая архитектурные особенности современных конфигураций на базе БСП (Библиотеки стандартных подсистем).
Прежде чем приступать к написанию кода, важно понять, что в современных версиях «1С:Управление торговлей» изображение не хранится непосредственно в самом справочнике Номенклатура. Для работы с файлами используется механизм присоединенных файлов. Процесс состоит из трех основных этапов:
НоменклатураПрисоединенныеФайлы.ФайлКартинки в карточке товара.Рассмотрим наиболее гибкий и надежный способ получения картинки — использование объекта 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 критически важно. Многие сайты блокируют запросы, если они не похожи на действия обычного браузера. Это помогает обойти ограничения, о которых часто упоминают разработчики при попытке автоматического парсинга.
В современных типовых решениях (УТ 11, ERP 2, КА 2) реализован программный интерфейс для работы с интернет-ресурсами. Разберем работу с общим модулем ПолучениеФайловИзИнтернета. Этот метод предпочтительнее, так как он автоматически учитывает настройки прокси-сервера, заданные в системе.
ПараметрыПолучения = ПолучениеФайловИзИнтернета.ПараметрыПолученияФайла();
РезультатЗагрузки = ПолучениеФайловИзИнтернета.СкачатьФайлВоВременноеХранилище(АдресКартинки, ПараметрыПолучения);
Если РезультатЗагрузки.Статус Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(РезультатЗагрузки.Адрес);
// Далее работаем с полученными данными
КонецЕсли;
Теперь, когда у нас есть ДвоичныеДанные, нам нужно поместить их в базу данных 1С. Выясним причину, по которой нельзя просто записать их в реквизит. В УТ 11 используется механизм ПрисоединенныеФайлы, который позволяет хранить файлы либо в томах на диске, либо в базе, обеспечивая при этом версионность и единый интерфейс доступа.
Рассмотрим пошагово алгоритм добавления файла к номенклатуре:
Процедура ПривязатьКартинкуКНоменклатуре(НоменклатураСсылка, ДвоичныеДанные, ИмяФайла)
// 1. Создаем структуру параметров для нового файла
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ВладелецФайла", НоменклатураСсылка);
ПараметрыФайла.Вставить("ИмяБезРасширения", "Изображение_" + НоменклатураСсылка.Артикул);
ПараметрыФайла.Вставить("Расширение", "jpg");
// 2. Используем программный интерфейс БСП для создания файла
СсылкаНаФайл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, ПоместитьВоВременноеХранилище(ДвоичныеДанные), , , );
// 3. Устанавливаем основное изображение для номенклатуры
ОбъектНоменклатура = НоменклатураСсылка.ПолучитьОбъект();
ОбъектНоменклатура.ФайлКартинки = СсылкаНаФайл;
Попытка
ОбъектНоменклатура.Записать();
Исключение
Сообщить("Ошибка при сохранении карточки: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если нам нужно загрузить тысячи картинок, выполнение этого процесса в основном потоке приведет к зависанию интерфейса пользователя. Выясним, как сделать загрузку «быстрой», как того хотел автор темы.
Рассмотрим использование механизма ФоновыеЗадания. Мы можем разбить список ссылок на пакеты (например, по 50-100 штук) и запускать для каждого пакета отдельный поток. Это позволит использовать всю мощность сервера и значительно ускорить процесс.
Важные рекомендации при массовой обработке:
ПолучитьИмяВременногоФайла(), если сохраняете данные на диск перед импортом, чтобы избежать конфликтов доступа между потоками.Content-Type в HTTP-ответе. Это позволит вам программно определить расширение (jpeg, png, webp), если оно не указано в самой ссылке.Мы проанализировали ситуацию и выяснили, что задача загрузки картинки из интернета в 1С требует комплексного подхода. Простая команда КопироватьФайл() может не сработать из-за ограничений веб-серверов или настроек безопасности. Использование HTTPСоединение в сочетании с механизмами РаботаСФайлами БСП является наиболее надежным и "правильным" способом с точки зрения архитектуры 1С:Предприятие 8.3.
Применяя данные инструкции, вы сможете создать надежный инструмент для автоматического наполнения базы данных качественным графическим контентом, экономя время сотрудников и минимизируя человеческий фактор.