Как извлечь изображения из файла Excel и сохранить их для 1С 7.7

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При автоматизации загрузки прайс-листов поставщиков часто возникает задача импорта не только цен и наименований, но и прикрепленных изображений товаров. В платформе 1С:Предприятие 7.7 при решении этой задачи разработчики сталкиваются с рядом технических ограничений: встроенный объект Картинка и функция ЗагрузитьФайлКартинки() не поддерживают формат PNG (поддерживаются только BMP, JPEG, ICO, WMF, EMF), а прямое обращение к графическим объектам листа Excel через OLE возвращает COM-объекты Shape или Picture, которые не являются интерфейсом IPictureDisp.

Разберем подробно, почему возникает ошибка при попытке передать объект из Excel напрямую в 1С, и рассмотрим несколько надежных способов извлечения и конвертации изображений.

Почему возникает ошибка «Объект не представляет собой Картинку!»

Рассмотрим попытку прямой передачи объекта из листа Excel в элемент формы 1С 7.7:


// Попытка прямого присвоения объекта Shape
Фото.УстановитьКартинку(Страница.Shapes("Picture1"));

Метод УстановитьКартинку() в 1С 7.7 принимает либо внутренний объект Картинка встроенного языка, либо OLE-объект системного интерфейса IPicture (IPictureDisp). Ссылка Excel.ActiveSheet.Shapes(...) возвращает интерфейс прикладного объекта Excel, который платформа 1С распознать не может. Поэтому для загрузки картинок в информационную базу необходимо предварительно сохранить графические файлы на диск в поддерживаемом формате (например, .jpg) и затем загружать их по пути к файлу.

Способ 1. Программный экспорт картинок из Excel в JPG с привязкой к строкам номенклатуры

Выясним, как автоматизировать процесс выгрузки без ручных операций, сохранив точную привязку изображения к конкретной строке с товаром. Для этого воспользуемся возможностями Excel по экспорту содержимого графических элементов через временный объект диаграммы (Chart).

Каждый объект Shape на листе содержит свойство TopLeftCell, которое указывает на ячейку, где находится левый верхний угол изображения. Зная номер строки ячейки Shape.TopLeftCell.Row, мы можем сопоставить картинку с артикулом или кодом товара в этой же строке прайс-листа.

Разберем пошаговый алгоритм на встроенном языке 1С 7.7:


// Инициализация COM-соединения с Excel
Эксель = СоздатьОбъект("Excel.Application");
Книга = Эксель.Workbooks.Open("C:\Price\SupplierPrice.xlsx");
Лист = Книга.ActiveSheet;

ПутьКПапке = "C:\Images\";

// Обходим все графические объекты на листе
Для НомерШейпа = 1 По Лист.Shapes.Count Цикл
    Шейп = Лист.Shapes.Item(НомерШейпа);
    
    // Проверяем тип объекта (msoPicture = 13 или msoLinkedPicture = 11)
    Если (Шейп.Type = 13) Или (Шейп.Type = 11) Тогда
        // Получаем номер строки, к которой привязана картинка
        НомерСтроки = Шейп.TopLeftCell.Row;
        
        // Считываем артикул товара из колонки A
        АртикулТовара = СокрЛП(Строка(Лист.Cells(НомерСтроки, 1).Value));
        
        Если ПустаяСтрока(АртикулТовара) = 0 Тогда
            ИмяФайла = ПутьКПапке + АртикулТовара + ".jpg";
            
            // Копируем изображение в буфер обмена
            Шейп.CopyPicture();
            
            // Создаем временную диаграмму под размер картинки
            ВремДиаграмма = Лист.ChartObjects().Add(0, 0, Шейп.Width, Шейп.Height);
            
            // Вставляем скопированное изображение и экспортируем в файл JPG
            ВремДиаграмма.Chart.Paste();
            ВремДиаграмма.Chart.Export(ИмяФайла, "JPG");
            
            // Удаляем временный объект диаграммы
            ВремДиаграмма.Delete();
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Книга.Close(0);
Эксель.Quit();

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

Способ 2. Извлечение файлов через ZIP-структуру XLSX с последующей конвертацией

Современные файлы Excel с расширением .xlsx представляют собой упакованные ZIP-архивы. Все внедренные медиафайлы хранятся в них в исходном виде в каталоге xl/media/.

Проанализируем порядок действий при таком подходе:

  1. Изменяем расширение файла с .xlsx на .zip.
  2. Распаковываем архив во временный каталог.
  3. Переходим в подпапку xl/media/, где расположены все извлеченные картинки.

Поскольку изображения извлекаются преимущественно в формате .png, для их использования в 1С 7.7 требуется преобразование в .jpg. Выполнить пакетную конвертацию без установки тяжелого ПО можно средствами Windows через библиотеку WIA (Windows Image Acquisition).

Посмотрим на пример функции конвертации файла в 1С 7.7 через системный OLE-объект WIA.ImageProcess:


// Функция конвертации PNG в JPG средствами Windows Image Acquisition
Функция КонвертироватьPNGвJPG(ПутьPNG, ПутьJPG)
    Попытка
        Изображение = СоздатьОбъект("WIA.ImageFile");
        Процессор = СоздатьОбъект("WIA.ImageProcess");
        
        // Загружаем исходный файл
        Изображение.LoadFile(ПутьPNG);
        
        // Настраиваем фильтр конвертации формата в JPEG
        Процессор.Filters.Add(Процессор.FilterInfos.Item("Convert").FilterID);
        Процессор.Filters.Item(1).Properties.Item("FormatID").Value = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
        Процессор.Filters.Item(1).Properties.Item("Quality").Value = 90;
        
        // Применяем фильтр и сохраняем результат
        Изображение = Процессор.Apply(Изображение);
        Изображение.SaveFile(ПутьJPG);
        Возврат 1;
    Исключение
        Сообщить("Ошибка конвертации: " + ОписаниеОшибки(), "!");
        Возврат 0;
    КонецПопытки;
КонецФункции

Способ 3. Использование надстроек Excel и сторонних утилит пакетной обработки

Если задача носит разовый характер или программная обработка через COM работает слишком медленно на больших прайс-листах (более нескольких тысяч позиций), целесообразно использовать готовые инструменты:

  1. Специализированные надстройки VBA для Excel: надстройки типа ExportPictures.xla добавляют в меню Excel команду для пакетного экспорта всех картинок листа в заданную папку с возможностью выбора формата JPEG и правила именования (по значению соседних ячеек).
  2. Консольные утилиты пакетной обработки: такие программы, как ImageMagick или IrfanView, позволяют преобразовать всю папку с извлеченными файлами PNG в JPG одной системной командой через WScript.Shell:
    
    Шелл = СоздатьОбъект("WScript.Shell");
    Шелл.Run("i_view32.exe C:\TempImages\*.png /convert=C:\TargetImages\*.jpg", 0, 1);
    

Таким образом, для интеграции прайс-листов с картинками в 1С 7.7 оптимальным решением является программная выгрузка через временную диаграмму Excel (для автоматических регламентных заданий) либо распаковка архива XLSX с последующей конвертацией через WIA или утилиты пакетной обработки.

← На главную