При ведении больших каталогов товаров в 1С:Управление торговлей 10.3 часто возникает необходимость массово загрузить изображения из прайс-листа Excel. Ручное добавление каждой фотографии в карточку номенклатуры занимает огромное количество времени. В данной статье мы разберем основные методы автоматизации этого процесса, проанализируем техническую составляющую хранения картинок и рассмотрим программные способы извлечения графических данных напрямую из ячеек Excel.
Прежде чем приступать к загрузке, нам необходимо разобраться, как 1С хранит графическую информацию. В конфигурации «Управление торговлей 10.3» (на обычных формах) изображения не записываются напрямую в справочник Номенклатура. Вместо этого используется вспомогательный справочник ХранилищеДополнительнойИнформации.
Разберем структуру этой связи:
Номенклатура имеет реквизит ОсновноеИзображение, в котором хранится ссылка на элемент справочника ХранилищеДополнительнойИнформации.ХранилищеДополнительнойИнформации поле Объект ссылается на владельца (номенклатуру).Хранилище, который имеет тип ХранилищеЗначения.Следовательно, наш алгоритм загрузки должен не просто обновлять карточку товара, а создавать новые записи в подчиненном справочнике.
Рассмотрим самый простой «полуавтоматический» способ получения файлов картинок, если они внедрены в таблицу Excel. Этот метод полезен, когда у вас нет прямого доступа к папке с исходными фотографиями.
Проанализируем шаги:
В этой папке будут находиться все изображения из таблицы в исходном качестве. Теперь, когда у нас есть файлы на диске, мы можем использовать стандартные обработки загрузки данных (например, «Загрузка данных из табличного документа»), настроив загрузку из папки по имени файла, которое должно соответствовать артикулу или коду товара.
Теперь разберем более продвинутый метод — прямое чтение картинок из Excel через программный интерфейс. Этот способ позволяет точно сопоставить картинку с конкретной строкой (товаром), используя координаты расположения объекта в таблице.
Выясним, как это реализовать на встроенном языке 1С. Для начала нам нужно создать объект приложения Excel и открыть файл:
// Создаем подключение к Excel
ExcelПриложение = Новый COMОбъект("Excel.Application");
Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Sheets(1);
// Перебираем все фигуры (Shapes) на листе
Для Каждого Рисунок Из Лист.Shapes Цикл
// Определяем строку, в которой находится левый верхний угол картинки
НомерСтроки = Рисунок.TopLeftCell.Row;
// Получаем артикул или код товара из этой же строки (например, в колонке 1)
АртикулТовара = Лист.Cells(НомерСтроки, 1).Value;
// Ищем номенклатуру в базе по артикулу
СсылкаНоменклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", АртикулТовара);
Если Не СсылкаНоменклатура.Пустая() Тогда
// Процесс сохранения картинки во временный файл и загрузка в 1С
// (см. далее детальный разбор создания элемента хранилища)
КонецЕсли;
КонецЦикла;
Важный нюанс: объект Shape в Excel не всегда просто сохранить в файл напрямую через COM. Часто разработчики используют метод копирования объекта в буфер обмена с последующим сохранением через скрипты или внешние компоненты. Однако наиболее стабильным методом является извлечение через временное сохранение листа как HTML, как было описано выше, но выполняемое программно.
Проанализируем ситуацию, когда у нас уже есть путь к файлу на диске или двоичные данные картинки. Нам нужно правильно создать связь с номенклатурой. Рассмотрим пример кода, который создает изображение и назначает его основным:
Функция ЗагрузитьИзображениеВНоменклатуру(ТоварСсылка, ПутьКФайлу)
// 1. Создаем объект в справочнике ХранилищеДополнительнойИнформации
НовоеХранилище = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
НовоеХранилище.Объект = ТоварСсылка;
НовоеХранилище.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение;
НовоеХранилище.Наименование = "Основное изображение для " + ТоварСсылка.Наименование;
// 2. Читаем файл и помещаем в ХранилищеЗначения
Картинка = Новый Картинка(ПутьКФайлу);
НовоеХранилище.Хранилище = Новый ХранилищеЗначения(Картинка, Новый СжатиеДанных(9));
Попытка
НовоеХранилище.Записать();
// 3. Устанавливаем это изображение основным в карточке товара
ОбъектНоменклатура = ТоварСсылка.ПолучитьОбъект();
ОбъектНоменклатура.ОсновноеИзображение = НовоеХранилище.Ссылка;
ОбъектНоменклатура.Записать();
Возврат Истина;
Исключение
Сообщить("Ошибка при записи изображения: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
В данном примере мы использовали объект СжатиеДанных(9) внутри ХранилищеЗначения. Это критически важный момент, так как без сжатия база данных 1С начнет стремительно расти в объеме, что приведет к замедлению работы системы и проблемам с бэкапами.
При массовой загрузке (от 1000 позиций и выше) следует учитывать несколько факторов, которые мы сейчас разберем подробнее:
.jpg или .png. Избегайте формата .bmp, так как он занимает в разы больше места. Если исходные картинки в Excel очень тяжелые, желательно программно изменить их размер перед загрузкой в 1С (например, до 800x800 пикселей).ХранилищеДополнительнойИнформации проверьте, не загружена ли уже эта картинка. Это можно сделать, сопоставив имена файлов или проверив наличие записей в справочнике по полю Объект.Если разработка собственного кода кажется слишком трудоемкой, можно воспользоваться готовыми инструментами. На профильных ресурсах для разработчиков существуют модифицированные версии обработки «ЗагрузкаДанныхИзТабличногоДокумента.epf», которые дополнены функционалом работы с картинками. Эти обработки умеют:
Подведем итог: Загрузка изображений из Excel в 1С — задача вполне решаемая. Для разовых операций проще всего использовать метод с сохранением в HTML, а для регулярных обновлений каталога лучше один раз написать программный обработчик через COM-объект или использовать XLSX как архив. Это обеспечит высокую точность сопоставления данных и сэкономит массу времени пользователям системы.