В практике автоматизации торговых предприятий часто возникает задача массовой загрузки данных из прайс-листов поставщиков. Одной из самых трудоемких операций является подгрузка изображений товаров. Если в файле Excel вместо самих картинок содержатся прямые ссылки на них (URL), это значительно упрощает задачу, так как позволяет автоматизировать процесс скачивания и привязки фото к карточкам Номенклатура. Рассмотрим подробно, как реализовать этот алгоритм в системе 1С:Предприятие 8.3.
Для реализации полноценного механизма нам необходимо последовательно решить несколько подзадач:
HTTPСоединение с сервером, где хранятся фотографии.НоменклатураПрисоединенныеФайлы).Разберем каждый этап по шагам, ориентируясь на использование современных конфигураций, построенных на базе Библиотеки стандартных подсистем (БСП).
Прежде всего, нам нужно прочитать файл. Мы можем использовать COMОбъект("Excel.Application") или чтение через ТабличныйДокумент. Предположим, что ссылка на картинку находится во второй колонке. Пройдемся циклом по строкам и для каждой строки инициируем процесс загрузки.
Для того чтобы получить файл, нам понадобится объект HTTPСоединение. Важно учитывать, что большинство современных ресурсов работают по защищенному протоколу HTTPS, поэтому нам обязательно потребуется использовать объект ЗащищенноеСоединениеOpenSSL. Проанализируем пример кода для скачивания файла:
Функция СкачатьФайлПоСсылке(URL)
// Разбираем URL на части: сервер и путь к файлу
// Например: https://mysite.com/images/photo1.jpg
СтруктураURL = НСтр(URL, "://", Ложь); // Упрощенно выделим сервер
Сервер = "mysite.com";
ПутьНаСервере = "/images/photo1.jpg";
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Попытка
Соединение = Новый HTTPСоединение(Сервер, , , , , 10, ЗащищенноеСоединение);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("jpg");
Запрос = Новый HTTPЗапрос(ПутьНаСервере);
Результат = Соединение.Получить(Запрос, ИмяВременногоФайла);
Если Результат.КодСостояния = 200 Тогда
Возврат ИмяВременногоФайла;
Иначе
Возврат Неопределено;
КонецЕсли;
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункции
В этом блоке мы создаем соединение, выполняем метод Получить и сохраняем результат в файл, расширение которого мы определили заранее. Если код состояния равен 200, значит, файл успешно скачан.
Современные конфигурации (УТ 11, ERP, КА 2, УНФ) не хранят картинки прямо в реквизите номенклатуры. Для этого используются подчиненные справочники. Чтобы правильно зарегистрировать файл в системе, рекомендуется использовать программный интерфейс БСП, в частности общий модуль РаботаСФайлами. Это гарантирует, что все вспомогательные реквизиты (автор, дата, размер) будут заполнены корректно.
Рассмотрим пример создания карточки файла:
Процедура ПривязатьКартинкуКНоменклатуре(СсылкаНоменклатура, ПутьКФайлу)
Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
Возврат;
КонецЕсли;
// Подготавливаем двоичные данные
ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ВладелецФайла", СсылкаНоменклатура);
ПараметрыФайла.Вставить("ИмяБезРасширения", "Фото_" + СсылкаНоменклатура.Артикул);
ПараметрыФайла.Вставить("Расширение", "jpg");
// Используем стандартный метод БСП для добавления файла
СсылкаНаПрисоединенныйФайл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, ДанныеФайла);
// Устанавливаем основное изображение
Если ЗначениеЗаполнено(СсылкаНаПрисоединенныйФайл) Тогда
ОбъектНом = СсылкаНоменклатура.ПолучитьОбъект();
// Реквизит может называться ФайлКартинки или ОсновноеИзображение
ОбъектНом.ФайлКартинки = СсылкаНаПрисоединенныйФайл;
ОбъектНом.Записать();
КонецЕсли;
КонецПроцедуры
Важно понимать: метод РаботаСФайлами.ДобавитьФайл автоматически определит, где хранить файл — в базе данных (реквизит типа ХранилищеЗначения) или в томах на диске, в зависимости от настроек вашей системы.
При массовой загрузке (тысячи позиций) проанализируем возможные узкие места:
Картинка для масштабирования или сжатия.ДвоичныеДанные был создан и передан в систему, обязательно удаляйте временный файл с диска методом УдалитьФайлы().Выясним причину возможных сбоев: если ссылка в Excel ведет на протокол HTTP, а сайт принудительно перенаправляет на HTTPS, объект HTTPСоединение может вернуть ошибку 301 или 302. В таких случаях в коде необходимо предусмотреть обработку перенаправлений или сразу использовать защищенное соединение.
Таким образом, мы разобрали комплексный подход к загрузке изображений. Использование штатных средств БСП и объектов платформы для работы с интернет-протоколами позволяет сделать этот процесс надежным и совместимым с будущими обновлениями конфигурации.