Как загрузить изображения из Excel в справочник Номенклатура в 1С

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

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

Особенности хранения изображений в УТ 10.3

Прежде чем приступать к загрузке, нам необходимо разобраться, как 1С хранит графическую информацию. В конфигурации «Управление торговлей 10.3» (на обычных формах) изображения не записываются напрямую в справочник Номенклатура. Вместо этого используется вспомогательный справочник ХранилищеДополнительнойИнформации.

Разберем структуру этой связи:

  1. Основной справочник Номенклатура имеет реквизит ОсновноеИзображение, в котором хранится ссылка на элемент справочника ХранилищеДополнительнойИнформации.
  2. В справочнике ХранилищеДополнительнойИнформации поле Объект ссылается на владельца (номенклатуру).
  3. Само изображение хранится в реквизите Хранилище, который имеет тип ХранилищеЗначения.

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

Способ 1: Использование Excel как HTML-фильтра

Рассмотрим самый простой «полуавтоматический» способ получения файлов картинок, если они внедрены в таблицу Excel. Этот метод полезен, когда у вас нет прямого доступа к папке с исходными фотографиями.

Проанализируем шаги:

  1. Откройте ваш файл Excel с картинками.
  2. Выберите пункт меню «Сохранить как».
  3. В типе файла выберите «Веб-страница (*.htm; *.html)».
  4. После сохранения рядом с файлом появится папка с названием вида «имя_файла_files».

В этой папке будут находиться все изображения из таблицы в исходном качестве. Теперь, когда у нас есть файлы на диске, мы можем использовать стандартные обработки загрузки данных (например, «Загрузка данных из табличного документа»), настроив загрузку из папки по имени файла, которое должно соответствовать артикулу или коду товара.

Способ 2: Программная загрузка через COM-объект

Теперь разберем более продвинутый метод — прямое чтение картинок из 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, как было описано выше, но выполняемое программно.

Способ 3: Создание элемента в «Хранилище дополнительной информации»

Проанализируем ситуацию, когда у нас уже есть путь к файлу на диске или двоичные данные картинки. Нам нужно правильно создать связь с номенклатурой. Рассмотрим пример кода, который создает изображение и назначает его основным:


Функция ЗагрузитьИзображениеВНоменклатуру(ТоварСсылка, ПутьКФайлу)
    
    // 1. Создаем объект в справочнике ХранилищеДополнительнойИнформации
    НовоеХранилище = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
    НовоеХранилище.Объект = ТоварСсылка;
    НовоеХранилище.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение;
    НовоеХранилище.Наименование = "Основное изображение для " + ТоварСсылка.Наименование;
    
    // 2. Читаем файл и помещаем в ХранилищеЗначения
    Картинка = Новый Картинка(ПутьКФайлу);
    НовоеХранилище.Хранилище = Новый ХранилищеЗначения(Картинка, Новый СжатиеДанных(9));
    
    Попытка
        НовоеХранилище.Записать();
        
        // 3. Устанавливаем это изображение основным в карточке товара
        ОбъектНоменклатура = ТоварСсылка.ПолучитьОбъект();
        ОбъектНоменклатура.ОсновноеИзображение = НовоеХранилище.Ссылка;
        ОбъектНоменклатура.Записать();
        
        Возврат Истина;
    Исключение
        Сообщить("Ошибка при записи изображения: " + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;
    
КонецФункции

В данном примере мы использовали объект СжатиеДанных(9) внутри ХранилищеЗначения. Это критически важный момент, так как без сжатия база данных 1С начнет стремительно расти в объеме, что приведет к замедлению работы системы и проблемам с бэкапами.

Оптимизация процесса загрузки

При массовой загрузке (от 1000 позиций и выше) следует учитывать несколько факторов, которые мы сейчас разберем подробнее:

  1. Форматы изображений: Рекомендуется использовать .jpg или .png. Избегайте формата .bmp, так как он занимает в разы больше места. Если исходные картинки в Excel очень тяжелые, желательно программно изменить их размер перед загрузкой в 1С (например, до 800x800 пикселей).
  2. Проверка на дубли: Перед созданием нового элемента ХранилищеДополнительнойИнформации проверьте, не загружена ли уже эта картинка. Это можно сделать, сопоставив имена файлов или проверив наличие записей в справочнике по полю Объект.
  3. Транзакции: При циклической загрузке большого количества данных старайтесь не использовать одну общую транзакцию на всю загрузку. Если произойдет ошибка на 999-м товаре из 1000, откатятся все изменения. Лучше фиксировать транзакцию для каждого товара отдельно.
  4. Очистка временных файлов: Если вы используете метод сохранения Excel в HTML для извлечения картинок, не забывайте удалять временную папку после завершения работы обработки, чтобы не засорять серверное пространство.

Использование готовых решений

Если разработка собственного кода кажется слишком трудоемкой, можно воспользоваться готовыми инструментами. На профильных ресурсах для разработчиков существуют модифицированные версии обработки «ЗагрузкаДанныхИзТабличногоДокумента.epf», которые дополнены функционалом работы с картинками. Эти обработки умеют:

Подведем итог: Загрузка изображений из Excel в 1С — задача вполне решаемая. Для разовых операций проще всего использовать метод с сохранением в HTML, а для регулярных обновлений каталога лучше один раз написать программный обработчик через COM-объект или использовать XLSX как архив. Это обеспечит высокую точность сопоставления данных и сэкономит массу времени пользователям системы.

← На главную