Как программно вытянуть картинки из Excel в 1С и привязать их к строкам?

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

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

Способ 1. Использование Табличного документа 1С

Самый простой и «нативный» подход — попытаться прочитать файл Excel встроенными средствами платформы. Рассмотрим подробнее этот метод.

Для этого мы можем загрузить файл в объект ТабличныйДокумент, а затем обойти его коллекцию рисунков. Логика работы следующая:

  1. Создаем новый ТабличныйДокумент.
  2. Вызываем метод Прочитать, указав путь к нашему файлу Excel.
  3. В цикле обходим коллекцию ТабличныйДокумент.Рисунки.
  4. Для каждого рисунка получаем его Картинка и определяем координаты (строку и колонку), используя свойства расположения рисунка.

Ограничения метода: На практике мы часто сталкиваемся с тем, что этот способ срабатывает не всегда. Во-первых, старые форматы .xls читаются платформой с ошибками (иногда пропадает не только графика, но и текст). Во-вторых, картинки в Excel часто вставляются «поверх ячеек» в виде плавающих элементов (floating shapes), которые могут игнорироваться механизмом чтения 1С.

Способ 2. Работа через COM-объект (Excel.Application)

Если штатный табличный документ не справляется, посмотрим на пример использования технологии COM. Этот вариант позволяет взаимодействовать с файлом через сам Excel.

В объектной модели Excel картинки хранятся как объекты типа Shape. У них нет прямого метода сохранения на диск, поэтому мы применим программную хитрость. Разберем по шагам алгоритм извлечения:

  1. Устанавливаем COM-соединение и открываем лист Excel.
  2. Перебираем коллекцию Shapes (или Pictures) на активном листе.
  3. Для каждой картинки вызываем метод CopyPicture(), который помещает ее в буфер обмена Windows.
  4. Программно создаем на листе пустую диаграмму (объект Chart).
  5. Вставляем нашу картинку из буфера обмена в эту диаграмму.
  6. Вызываем метод диаграммы Export(), который сохраняет ее содержимое на диск (например, в формате JPG).
  7. Читаем полученный файл в 1С и помещаем его в ХранилищеЗначения.

Ограничения метода: Работа через COM требует обязательного наличия установленного пакета MS Office на том компьютере или сервере, где выполняется код. Если ваш сервер 1С развернут на базе ОС Linux, этот метод окажется нерабочим.

Способ 3. Распаковка архива OpenXML (формат XLSX)

Теперь проанализируем самое надежное, быстрое и современное решение. Современные файлы с расширением .xlsx представляют собой стандартизированный пакет OpenXML. По сути, это обычный ZIP-архив с XML-файлами и медиаданными внутри.

Рассмотрим подробнее, как мы можем программно извлечь из него нужные данные без использования COM:

  1. Копируем исходный файл .xlsx и программно меняем его расширение на .zip.
  2. Средствами 1С (через объект ЧтениеZipФайла) распаковываем архив во временную директорию.
  3. Поиск картинок: Внутри распакованного каталога находим папку xl/media. Именно там лежат все оригинальные графические файлы (jpeg, png) без потери качества.
  4. Привязка к строкам: Переходим в папку xl/drawings и находим файлы вида drawing1.xml. Это карта расположения объектов на листе.

Выясним причину, почему именно этот XML-файл так важен. Прочитав drawing1.xml средствами 1С (используя ЧтениеXML или ПостроительDOM), мы обнаружим специальные теги-якоря. Обычно они называются xdr:twoCellAnchor или xdr:oneCellAnchor.

Внутри этих тегов хранятся координаты привязки xdr:from (левый верхний угол) и xdr:to (правый нижний угол). В них четко прописаны индексы:

Сопоставив идентификатор картинки из этого XML-узла с физическим файлом в папке xl/media, мы абсолютно точно определим, в какой строке прайс-листа находится то или иное изображение. После этого останется лишь сопоставить данные с нашей табличной частью в 1С.

Способ 4. Использование внешних компонент (Native API)

Если задача стоит на потоке, и самостоятельное написание парсера XML кажется избыточным, рассмотрим альтернативу. Многие разработчики используют готовые внешние компоненты, написанные на C++, C# или Python.

Такие компоненты подключаются к 1С и умеют напрямую читать структуру .xlsx прямо в памяти сервера. Они самостоятельно извлекают двоичные данные картинок вместе с их координатами (строка, колонка) и возвращают их в 1С уже в виде удобных структур или таблиц значений. Этот метод объединяет скорость чтения OpenXML и отсутствие необходимости устанавливать MS Excel, значительно экономя ресурсы сервера.

Используя любой из описанных выше методов (с упором на парсинг OpenXML для современных конфигураций), вы сможете надежно и корректно загружать прайс-листы с визуальным контентом в свою информационную базу.

← На главную