Как выбрать картинки из файла Excel и присоединить их к номенклатуре в 1С 8.3

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

В процессе автоматизации загрузки данных из внешних источников часто возникает задача переноса не только текстовой информации (наименований, артикулов, цен), но и графических объектов. Файлы Excel часто содержат изображения товаров, которые не закреплены внутри ячеек, а "парят" над ними как объекты Shape. Разберем подробно, как можно программно и интерактивно извлечь эти изображения и связать их с карточками номенклатуры в 1С.

Метод 1: Использование буфера обмена (для интерактивного выбора)

Если перед пользователем стоит задача выборочного переноса картинок (например, когда в файле много лишних изображений), наиболее удобным способом будет использование возможностей платформы 1С 8.3 по работе с буфером обмена. Рассмотрим ситуацию, когда пользователь копирует картинку в Excel и нажимает кнопку "Вставить" в 1С.

Для реализации этого функционала в управляемых формах мы будем использовать метод ПолучитьКартинкуИзБуфераОбмена(). Это наиболее современный и стабильный подход, не требующий регистрации сторонних COM-компонент.

Проанализируем пример кода для обработки нажатия кнопки на форме:


&НаКлиенте
Процедура ВставитьКартинкуИзБуфера(Команда)
    
    КартинкаИзБуфера = ПолучитьКартинкуИзБуфераОбмена();
    
    Если КартинкаИзБуфера <> Неопределено Тогда
        // Помещаем картинку во временное хранилище для передачи на сервер
        АдресХранилища = ПоместитьВоВременноеХранилище(КартинкаИзБуфера, ЭтаФорма.УникальныйИдентификатор);
        
        // Вызываем серверную процедуру для привязки к номенклатуре
        ПрикрепитьКартинуКНоменклатуреНаСервере(АдресХранилища, Объект.Ссылка);
        
        Сообщить("Изображение успешно загружено!");
    Иначе
        Сообщить("Буфер обмена пуст или не содержит изображения.");
    КонецЕсли;
    
КонецПроцедуры

Этот метод исключает проблемы с повреждением файлов, о которых упоминалось в обсуждении на форуме, так как платформа самостоятельно обрабатывает формат DIB (Device Independent Bitmap) и преобразует его в объект 1С Картинка.

Метод 2: Программный экспорт через временную диаграмму (COM-соединение)

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

Рассмотрим алгоритм действий:

  1. Подключаемся к Excel.Application через COMОбъект.
  2. Перебираем коллекцию Shapes на листе.
  3. Для каждого объекта вызываем метод Copy().
  4. Создаем временный объект Chart.
  5. Вставляем содержимое буфера в диаграмму и вызываем Export().

Пример программной реализации:


// Создаем объект Excel
Excel = Новый COMОбъект("Excel.Application");
Workbook = Excel.Workbooks.Open(ПутьКФайлу);
Sheet = Workbook.Sheets(1);

Для Каждого Рисунок Из Sheet.Shapes Цикл
    
    // Получаем координаты, чтобы понять, к какой номенклатуре относится фото
    НомерСтроки = Рисунок.TopLeftCell.Row;
    Артикул = Sheet.Cells(НомерСтроки, 1).Value; // Предположим, артикул в первой колонке
    
    // Копируем рисунок
    Рисунок.Copy();
    
    // Создаем временную диаграмму для экспорта
    ВременнаяДиаграмма = Sheet.ChartObjects().Add(0, 0, Рисунок.Width, Рисунок.Height);
    ВременнаяДиаграмма.Activate();
    ВременнаяДиаграмма.Chart.Paste();
    
    ИмяФайла = ПолучитьИмяВременногоФайла("jpg");
    ВременнаяДиаграмма.Chart.Export(ИмяФайла, "JPG");
    
    // Удаляем временный объект
    ВременнаяДиаграмма.Delete();
    
    // Здесь код загрузки файла в 1С (ПрисоединенныеФайлы)
    ЗагрузитьФайлВНоменклатуру(ИмяФайла, Артикул);
    
КонецЦикла;

Excel.Quit();

Важный нюанс: Использование свойства TopLeftCell позволяет нам точно определить, над какой ячейкой находится верхний левый угол картинки. Это критически важно для сопоставления изображения с конкретной строкой номенклатуры в таблице.

Метод 3: Сохранение документа в формате HTML

Выясним причину, почему способ с сохранением в HTML часто оказывается самым быстрым для пакетной обработки. При сохранении книги Excel как веб-страницы, приложение автоматически создает папку, в которую извлекает все графические объекты в их исходном качестве.

Для реализации этого способа используем метод SaveAs с параметром формата 44 (xlHtml):

Excel.ActiveWorkbook.SaveAs("C:\TEMP\export.htm", 44);

После выполнения этой команды в каталоге C:\TEMP\ появится файл export.htm и папка export_files. В этой папке будут находиться изображения с именами типа image001.jpg, image002.png.

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

Метод 4: Работа с XLSX как с ZIP-архивом

Проанализируем ситуацию, когда на сервере не установлен Microsoft Excel. Файлы формата .xlsx по своей сути являются ZIP-архивами. Мы можем переименовать файл или открыть его программно с помощью средств 1С для работы с архивами.

Путь к изображениям внутри архива: xl/media/. Чтобы понять, к какой ячейке относится файл image1.png, необходимо проанализировать XML-описания в папке xl/drawings/.

Этот метод является наиболее сложным в реализации, но самым производительным и "чистым", так как не требует запуска тяжелых внешних приложений.

Реализация Drag-and-Drop для удобства пользователя

В современных интерфейсах 1С часто требуется возможность просто перетащить картинку в форму. Рассмотрим, как это настроить для управляемой формы:

  1. У элемента формы (например, ПолеКартинки или Декорация) установите свойство РазрешитьПеретаскивание в значение Истина.
  2. Создайте обработчик события ПроверкаПеретаскивания. В нем нужно установить ПараметрыПроверки.Действие = ДействиеПеретаскивания.Копирование.
  3. В обработчике события Перетаскивание проанализируйте параметр Значение. Если перетаскивается файл, это будет массив путей к файлам.

Обратите внимание: Напрямую перетащить графический объект "изнутри" открытого листа Excel в форму 1С стандартными средствами не получится. Пользователь должен либо сохранить картинку как файл и перетащить файл, либо использовать метод с буфером обмена (Copy-Paste), описанный в первом пункте.

Резюме и рекомендации

Выбор конкретного метода зависит от ваших задач:

1. Если нужна ручная работа пользователя с выбором конкретных фото — используйте ПолучитьКартинкуИзБуфераОбмена().

2. Если нужна полная автоматизация при наличии установленного Excel — используйте экспорт через временный Chart с привязкой по TopLeftCell.

3. Если важна скорость и независимость от стороннего ПО — используйте парсинг XLSX как ZIP-архива.

При реализации любого из методов всегда проверяйте типы файлов и их размер, чтобы не перегружать базу 1С слишком тяжелыми изображениями. Оптимально перед сохранением в справочник выполнять сжатие картинки средствами 1С (метод Обработать() объекта Картинка).

← На главную