В процессе автоматизации загрузки данных из внешних источников часто возникает задача переноса не только текстовой информации (наименований, артикулов, цен), но и графических объектов. Файлы Excel часто содержат изображения товаров, которые не закреплены внутри ячеек, а "парят" над ними как объекты Shape. Разберем подробно, как можно программно и интерактивно извлечь эти изображения и связать их с карточками номенклатуры в 1С.
Если перед пользователем стоит задача выборочного переноса картинок (например, когда в файле много лишних изображений), наиболее удобным способом будет использование возможностей платформы 1С 8.3 по работе с буфером обмена. Рассмотрим ситуацию, когда пользователь копирует картинку в Excel и нажимает кнопку "Вставить" в 1С.
Для реализации этого функционала в управляемых формах мы будем использовать метод ПолучитьКартинкуИзБуфераОбмена(). Это наиболее современный и стабильный подход, не требующий регистрации сторонних COM-компонент.
Проанализируем пример кода для обработки нажатия кнопки на форме:
&НаКлиенте
Процедура ВставитьКартинкуИзБуфера(Команда)
КартинкаИзБуфера = ПолучитьКартинкуИзБуфераОбмена();
Если КартинкаИзБуфера <> Неопределено Тогда
// Помещаем картинку во временное хранилище для передачи на сервер
АдресХранилища = ПоместитьВоВременноеХранилище(КартинкаИзБуфера, ЭтаФорма.УникальныйИдентификатор);
// Вызываем серверную процедуру для привязки к номенклатуре
ПрикрепитьКартинуКНоменклатуреНаСервере(АдресХранилища, Объект.Ссылка);
Сообщить("Изображение успешно загружено!");
Иначе
Сообщить("Буфер обмена пуст или не содержит изображения.");
КонецЕсли;
КонецПроцедуры
Этот метод исключает проблемы с повреждением файлов, о которых упоминалось в обсуждении на форуме, так как платформа самостоятельно обрабатывает формат DIB (Device Independent Bitmap) и преобразует его в объект 1С Картинка.
Если необходимо автоматизировать процесс и выгрузить все картинки без участия пользователя, проанализируем метод использования объекта Chart (Диаграмма) в Excel. Суть метода заключается в том, что картинку нельзя сохранить напрямую в файл через команду Save, но её можно скопировать внутрь пустой диаграммы, а диаграмму уже экспортировать как JPG или PNG.
Рассмотрим алгоритм действий:
Excel.Application через COMОбъект.Shapes на листе.Copy().Chart.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 позволяет нам точно определить, над какой ячейкой находится верхний левый угол картинки. Это критически важно для сопоставления изображения с конкретной строкой номенклатуры в таблице.
Выясним причину, почему способ с сохранением в HTML часто оказывается самым быстрым для пакетной обработки. При сохранении книги Excel как веб-страницы, приложение автоматически создает папку, в которую извлекает все графические объекты в их исходном качестве.
Для реализации этого способа используем метод SaveAs с параметром формата 44 (xlHtml):
Excel.ActiveWorkbook.SaveAs("C:\TEMP\export.htm", 44);
После выполнения этой команды в каталоге C:\TEMP\ появится файл export.htm и папка export_files. В этой папке будут находиться изображения с именами типа image001.jpg, image002.png.
Однако у этого метода есть существенный минус: теряется программная связь между файлом изображения и ячейкой, в которой оно находилось. Этот способ лучше всего подходит, когда в файле Excel изображения идут строго по порядку и их количество совпадает с количеством строк номенклатуры.
Проанализируем ситуацию, когда на сервере не установлен Microsoft Excel. Файлы формата .xlsx по своей сути являются ZIP-архивами. Мы можем переименовать файл или открыть его программно с помощью средств 1С для работы с архивами.
Путь к изображениям внутри архива: xl/media/. Чтобы понять, к какой ячейке относится файл image1.png, необходимо проанализировать XML-описания в папке xl/drawings/.
drawing1.xml содержит теги <xdr:from> и <xdr:to>, где указаны индексы строк и колонок (<xdr:row>).media прописана в файле _rels/drawing1.xml.rels через идентификаторы rId.Этот метод является наиболее сложным в реализации, но самым производительным и "чистым", так как не требует запуска тяжелых внешних приложений.
В современных интерфейсах 1С часто требуется возможность просто перетащить картинку в форму. Рассмотрим, как это настроить для управляемой формы:
Истина.ПроверкаПеретаскивания. В нем нужно установить ПараметрыПроверки.Действие = ДействиеПеретаскивания.Копирование.Перетаскивание проанализируйте параметр Значение. Если перетаскивается файл, это будет массив путей к файлам.Обратите внимание: Напрямую перетащить графический объект "изнутри" открытого листа Excel в форму 1С стандартными средствами не получится. Пользователь должен либо сохранить картинку как файл и перетащить файл, либо использовать метод с буфером обмена (Copy-Paste), описанный в первом пункте.
Выбор конкретного метода зависит от ваших задач:
1. Если нужна ручная работа пользователя с выбором конкретных фото — используйте ПолучитьКартинкуИзБуфераОбмена().
2. Если нужна полная автоматизация при наличии установленного Excel — используйте экспорт через временный Chart с привязкой по TopLeftCell.
3. Если важна скорость и независимость от стороннего ПО — используйте парсинг XLSX как ZIP-архива.
При реализации любого из методов всегда проверяйте типы файлов и их размер, чтобы не перегружать базу 1С слишком тяжелыми изображениями. Оптимально перед сохранением в справочник выполнять сжатие картинки средствами 1С (метод Обработать() объекта Картинка).