К статье
Практический материал

Справочники и Данные · 11 мин

Как получить картинку номенклатуры в 1С

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

Картинка номенклатуры в 1С используется в карточке товара, в подборе, в печатных каталогах и при выгрузке на сайт. В зависимости от конфигурации и роли пользователя «получить картинку» может означать разное: посмотреть изображение в карточке, извлечь файл из базы, вывести его в печатную форму или получить программно через встроенный язык.

В типовых конфигурациях (Управление торговлей 11, ERP, Комплексная автоматизация, УНФ) изображения хранятся как присоединённые файлы, а ссылка на основную картинку обычно находится в реквизите «Файл картинки» элемента справочника «Номенклатура». В старых конфигурациях (например, УТ 10.3) картинка хранилась в реквизите типа «Хранилище значения» прямо в карточке товара.

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

Где 1С хранит картинки номенклатуры

В конфигурациях на Библиотеке стандартных подсистем (БСП) — УТ 11, КА 2, ERP 2, УНФ — изображения хранятся в справочнике присоединённых файлов «НоменклатураПрисоединенныеФайлы». Сами двоичные данные в зависимости от настроек программы лежат либо в информационной базе (в хранилище значений), либо в томах на диске. В карточке товара при этом заполнен реквизит «Файл картинки» — это ссылка на основной файл изображения.

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

Понять, какая схема используется в вашей базе, просто: откройте карточку товара. Если картинка отображается сразу и есть кнопка выбора из файла — скорее всего, это старая схема с хранилищем значения. Если рядом с изображением есть ссылка «Ещё файлы» или список присоединённых файлов — работает механизм БСП.

Как посмотреть и извлечь картинку через интерфейс

Самый простой сценарий — пользователю нужно просто увидеть или сохранить изображение товара. В карточке номенклатуры (УТ 11, ERP, КА) картинка отображается в левой части формы. Если её нет, проверьте, заполнен ли реквизит «Файл картинки»: кликните по области изображения или откройте список присоединённых файлов.

Чтобы сохранить картинку на диск, откройте список присоединённых файлов (команда «Присоединённые файлы» в карточке товара или одноимённый пункт в меню «Ещё»), выделите нужный файл и выполните «Сохранить как…». Файл будет выгружен в исходном формате (JPG, PNG и т.д.) с исходным именем.

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

Как сохранить картинку товара на диск
  1. 1
    Откройте карточку номенклатуры
  2. 2
    Перейдите в список присоединённых файлов (команда «Присоединённые файлы» или меню «Ещё»)
  3. 3
    Выделите файл изображения в списке
  4. 4
    Нажмите «Сохранить как…» и укажите каталог
  5. 5
    Проверьте, что файл открылся в просмотрщике изображений

Программное получение картинки в конфигурациях на БСП

Для конфигураций на БСП (УТ 11, КА 2, ERP 2, УНФ) двоичные данные присоединённого файла получают через общий модуль «РаботаСФайлами». Типовой код выглядит так: сначала берём ссылку из реквизита «ФайлКартинки», затем получаем двоичные данные и преобразуем их в объект «Картинка».

ФайлКартинки = НоменклатураСсылка.ФайлКартинки;

Если ЗначениеЗаполнено(ФайлКартинки) Тогда

ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(ФайлКартинки);

Картинка = Новый Картинка(ДвоичныеДанные);

КонецЕсли;

Если в базе несколько изображений на один товар, а основной файл не задан, можно найти все присоединённые файлы владельца через «РаботаСФайлами.ПрисоединенныеФайлыКОбъекту» или запросом к справочнику присоединённых файлов с отбором по владельцу и расширению (jpg, jpeg, png, gif, bmp).

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

Программное получение картинки в УТ 10.3 и старых конфигурациях

В конфигурациях на обычных формах (УТ 10.3, УПП 1.3) изображение хранится в реквизите «Изображение» типа «ХранилищеЗначения». Код получения заметно короче: достаточно вызвать метод Получить() и привести результат к типу «Картинка».

ХранимоеЗначение = НоменклатураСсылка.Изображение.Получить();

Если ТипЗнч(ХранимоеЗначение) = Тип("Картинка") Тогда

Картинка = ХранимоеЗначение;

ИначеЕсли ТипЗнч(ХранимоеЗначение) = Тип("ДвоичныеДанные") Тогда

Картинка = Новый Картинка(ХранимоеЗначение);

КонецЕсли;

Обратите внимание на проверку типа: в хранилище значения может лежать как объект «Картинка», так и «ДвоичныеДанные», а иногда — Неопределено, если реквизит пуст. Вызов метода Получить() без проверки на пустой реквизит безопасен (вернёт Неопределено), но попытка создать «Картинка» из Неопределено вызовет ошибку.

Для сохранения на диск в этих конфигурациях используется метод Картинка.Записать(ИмяФайла), тип файла определяется по расширению. Если в хранилище лежат двоичные данные, сохраняйте их напрямую через ДвоичныеДанные.Записать().

1c
ХранимоеЗначение = НоменклатураСсылка.Изображение.Получить();
Если ХранимоеЗначение <> Неопределено Тогда
    Картинка = Новый Картинка(ХранимоеЗначение);
    Картинка.Записать("C:\Images\tovar.jpg");
КонецЕсли;

Вывод картинки в печатную форму и на сайт

Чтобы вывести изображение товара в печатную форму (например, в прайс-лист или каталог), в макете табличного документа добавьте область с типом «Картинка» (рисунок табличного документа). Затем программно присвойте этому рисунку полученный объект «Картинка» через свойство «Картинка» коллекции «Рисунки» области.

При выгрузке на сайт (типовой обмен с Битрикс и подобными) картинки передаются автоматически в составе пакета CommerceML — из присоединённых файлов формируются элементы «Картинка» для каждого товара. Если картинки не выгружаются, чаще всего причина в том, что не заполнен реквизит «Файл картинки» у товара или в настройках обмена отключена выгрузка файлов изображений.

Для отчётов на СКД картинку выводят через функцию общего модуля, возвращающую объект «Картинка», с последующим выводом в макет отчёта. Это требует доработки макета и ресурсных полей, поэтому для разовой задачи проще построить табличный документ программно.

Способы получить картинку

Интерфейс (присоединённые файлы)

Подходит для разового просмотра и сохранения; неудобен для массового извлечения

Программно через РаботаСФайлами

Для конфигураций на БСП; подходит для массовой выгрузки, печатных форм и обменов

Хранилище значения (УТ 10.3)

Для старых конфигураций; простой код, но нет поддержки нескольких изображений на товар

Типовой обмен с сайтом

Для передачи картинок в интернет-магазин; требует заполненного реквизита «Файл картинки»

Частые ошибки и проверка результата

Самая частая проблема — картинка «есть», но не отображается. Причины: реквизит «Файл картинки» не заполнен (файл присоединён, но не назначен основным), файл физически отсутствует в томе хранения (при хранении на диске), у пользователя нет прав на чтение присоединённых файлов. Проверка проста: откройте список присоединённых файлов товара и попробуйте открыть файл двойным щелчком.

Вторая типичная ошибка в коде — обращение к реквизиту «ФайлКартинки» через точку от ссылки в цикле по тысячам товаров. Это порождает запрос к базе на каждой итерации и резко замедляет работу. Правильный подход — получить ссылки на файлы одним запросом с соединением к таблице номенклатуры.

Третья ошибка — попытка получить двоичные данные файла, который хранится в томе на диске, с клиентского компьютера без доступа к тому. В этом случае РаботаСФайлами вернёт ошибку или пустые данные. Решение — выполнять получение данных на сервере и передавать результат клиенту через временное хранилище.

Типичные ошибки
01
Файл присоединён, но не назначен основным — картинка не выводится в карточке и не выгружается на сайт
02
Обращение к реквизиту через точку в цикле — сотни лишних запросов и падение производительности
03
Получение файла с клиента при хранении в томах на сервере — ошибка доступа или пустые данные
04
Создание объекта Картинка из Неопределено без проверки — исключение и остановка обработки
05
Игнорирование прав доступа — картинка видна администратору, но не видна менеджерам

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

Контрольные точки

Как проверить результат

Отображение в карточке товара
Норма

Картинка видна сразу при открытии

Тревожный признак

Пустая область или значок отсутствующего файла

Программное получение
Норма

ДвоичныеДанные не пустые, объект Картинка создан

Тревожный признак

Ошибка при вызове или Неопределено

Выгрузка на сайт
Норма

В пакете обмена есть элемент «Картинка» с именем файла

Тревожный признак

Товар выгружается без изображений

Права пользователей
Норма

Картинка видна всем ролям, которым она нужна

Тревожный признак

Видна только администратору

FAQ

Картинка присоединена к товару, но в карточке не отображается. Что делать?

Откройте список присоединённых файлов товара и проверьте, какой файл назначен основным. В карточке отображается только файл, указанный в реквизите «Файл картинки». Назначьте нужное изображение основным — обычно это делается командой в списке файлов или выбором в самой карточке.

Как массово выгрузить все картинки номенклатуры в папку?

Напишите простую обработку: запросом выберите товары с заполненным «ФайлКартинки», для каждого получите двоичные данные через РаботаСФайлами.ДвоичныеДанныеФайла() и сохраните методом Записать() с именем, например, из артикула. Выполняйте получение данных на сервере, если файлы хранятся в томах.

Можно ли хранить несколько картинок для одного товара?

Да, в конфигурациях на БСП к товару можно присоединить любое количество файлов изображений. Основной (отображаемый в карточке и выгружаемый на сайт первым) — только один, он задаётся реквизитом «Файл картинки». Остальные доступны в списке присоединённых файлов и могут выгружаться как дополнительные изображения.

Почему код РаботаСФайлами.ДвоичныеДанныеФайла() возвращает ошибку?

Чаще всего файл хранится в томе на диске, а код выполняется на клиенте без доступа к этому тому, либо том недоступен серверу. Перенесите вызов в серверный контекст (директива &НаСервере) и проверьте настройки томов хранения файлов в администрировании программы.

Как вывести картинку товара в печатную форму прайс-листа?

В макете табличного документа добавьте рисунок (область с типом «Картинка»), при формировании отчёта получите объект «Картинка» из присоединённого файла товара и присвойте его рисунку через коллекцию Рисунки области. Для товаров без изображения оставляйте рисунок пустым или подставляйте картинку-заглушку.

Картинки не выгружаются на сайт при типовом обмене. В чём причина?

Проверьте три момента: заполнен ли реквизит «Файл картинки» у товаров, включена ли выгрузка изображений в настройках узла обмена, и доступны ли файлы (если они в томах на диске — доступен ли том серверу). Также убедитесь, что расширения файлов входят в список разрешённых для выгрузки.

Итог

Что важно запомнить

Картинка номенклатуры в типовых 1С — присоединённый файл, основной задаётся реквизитом «Файл картинки». В интерфейсе её сохраняют через список присоединённых файлов, программно — через РаботаСФайлами (БСП) или ХранилищеЗначения (старые конфигурации). Большинство проблем сводится к незаполненному основному файлу, правам доступа и выполнению кода не в том контексте.