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

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

В практике автоматизации торговых предприятий часто возникает задача массовой загрузки данных из прайс-листов поставщиков. Одной из самых трудоемких операций является подгрузка изображений товаров. Если в файле Excel вместо самих картинок содержатся прямые ссылки на них (URL), это значительно упрощает задачу, так как позволяет автоматизировать процесс скачивания и привязки фото к карточкам Номенклатура. Рассмотрим подробно, как реализовать этот алгоритм в системе 1С:Предприятие 8.3.

Постановка задачи и выбор архитектуры решения

Для реализации полноценного механизма нам необходимо последовательно решить несколько подзадач:

  1. Прочитать данные из файла Excel (получить соответствие артикула или кода товара и ссылки на изображение).
  2. Установить HTTPСоединение с сервером, где хранятся фотографии.
  3. Скачать файл во временное хранилище на локальном диске или сервере.
  4. Создать запись в справочнике присоединенных файлов (например, НоменклатураПрисоединенныеФайлы).
  5. Установить загруженную картинку в качестве основной для конкретной номенклатуры.

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

Шаг 1. Получение данных из Excel

Прежде всего, нам нужно прочитать файл. Мы можем использовать COMОбъект("Excel.Application") или чтение через ТабличныйДокумент. Предположим, что ссылка на картинку находится во второй колонке. Пройдемся циклом по строкам и для каждой строки инициируем процесс загрузки.

Шаг 2. Скачивание файла по HTTP-ссылке

Для того чтобы получить файл, нам понадобится объект 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, значит, файл успешно скачан.

Шаг 3. Создание присоединенного файла в БСП

Современные конфигурации (УТ 11, ERP, КА 2, УНФ) не хранят картинки прямо в реквизите номенклатуры. Для этого используются подчиненные справочники. Чтобы правильно зарегистрировать файл в системе, рекомендуется использовать программный интерфейс БСП, в частности общий модуль РаботаСФайлами. Это гарантирует, что все вспомогательные реквизиты (автор, дата, размер) будут заполнены корректно.

Рассмотрим пример создания карточки файла:


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

Важно понимать: метод РаботаСФайлами.ДобавитьФайл автоматически определит, где хранить файл — в базе данных (реквизит типа ХранилищеЗначения) или в томах на диске, в зависимости от настроек вашей системы.

Шаг 4. Оптимизация и обработка ошибок

При массовой загрузке (тысячи позиций) проанализируем возможные узкие места:

  1. Размер изображений: Фотографии высокого разрешения могут быстро переполнить базу данных. Перед сохранением рекомендуется использовать объект Картинка для масштабирования или сжатия.
  2. Дублирование: Перед загрузкой проверьте, не привязана ли уже картинка к данной номенклатуре. Это предотвратит создание лишних копий при повторном запуске обработки.
  3. Очистка временных файлов: После того как объект ДвоичныеДанные был создан и передан в систему, обязательно удаляйте временный файл с диска методом УдалитьФайлы().
  4. Фоновое выполнение: Загрузка по сети — операция длительная. Лучше всего запускать её в фоновом задании, чтобы интерфейс пользователя не "зависал" во время ожидания ответов от сервера.

Выясним причину возможных сбоев: если ссылка в Excel ведет на протокол HTTP, а сайт принудительно перенаправляет на HTTPS, объект HTTPСоединение может вернуть ошибку 301 или 302. В таких случаях в коде необходимо предусмотреть обработку перенаправлений или сразу использовать защищенное соединение.

Таким образом, мы разобрали комплексный подход к загрузке изображений. Использование штатных средств БСП и объектов платформы для работы с интернет-протоколами позволяет сделать этот процесс надежным и совместимым с будущими обновлениями конфигурации.

← На главную