Как вывести картинку номенклатуры из ХранилищаЗначений в отчет или прайс-лист?

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

При разработке прайс-листов, каталогов товаров или специализированных складских отчетов часто возникает задача визуализировать данные — вывести рядом с наименованием номенклатуры её фото. Однако начинающие разработчики нередко сталкиваются с ситуацией, когда вместо фотографии в печатную форму выводятся шестнадцатеричные строки двоичных данных или текстовое слово Картинка. Разберем по шагам, почему это происходит и как правильно извлечь изображение из базы данных и отобразить его в табличном документе.

Анализ структуры хранения и типичные ошибки

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

Разберем основные ошибки при попытке вывести такое изображение:

  1. Попытка выбрать ХранилищеЗначений в запросе напрямую: поля с типом ХранилищеЗначений нельзя выбирать в тексте запроса 1С. Получение данных происходит через программный вызов метода Получить() у соответствующего реквизита объекта.
  2. Передача двоичных данных напрямую в параметр ячейки: если передать результат метода Получить() напрямую в обычный параметр макета (Строка.Параметры.Картинка = ДвоичныеДанные), платформа 1С преобразует двоичные данные в текстовое представление (hex-последовательность вида 89 50 4E 47...).
  3. Передача объекта типа Картинка в текстовый параметр: если создать объект Новый Картинка(ДвоичныеДанные) и присвоить его параметру ячейки с типом заполнения Параметр, табличный документ преобразует объект в строковое представление и напечатает слово Картинка.

Способ 1. Использование свойства ячейки «ПараметрКартинки» (базовый вариант)

Выясним, как настроить макет и написать программный код для отображения фотографии непосредственно внутри ячейки таблицы.

Шаг 1. Настройка макета табличного документа:

  1. Откроем макет нашего отчета.
  2. Выделим ячейку в секции строки, где должно отображаться фото товара.
  3. Откроем палитру свойств ячейки.
  4. Найдем свойство ПараметрКартинки и укажем в нем понятное имя параметра, например, КартинкаТовара.
  5. Обратите внимание: свойство Заполнение у этой ячейки не должно конфликтовать со значением картинки (оставьте его пустым или установите Текст, если текстовое содержимое не выводится).

Шаг 2. Программный код вывода:

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


&НаСервереБезКонтекста
Процедура СформироватьОтчет(ТабДок, ДатаОтчета)
    
    Макет = Отчеты.ОстаткиТоваров.ПолучитьМакет("Макет");
    Шапка = Макет.ПолучитьОбласть("Шапка");
    Строка = Макет.ПолучитьОбласть("Строка");
    
    ТабДок.Очистить();
    
    Шапка.Параметры.ДатаОтчета = ДатаОтчета;
    ТабДок.Вывести(Шапка);
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Остатки.Номенклатура КАК Номенклатура,
        |   Остатки.КоличествоОстаток КАК КоличествоОстаток
        |ИЗ
        |   РегистрНакопления.ОстаткиТовара.Остатки(&ДатаОтчета, ) КАК Остатки";
        
    Запрос.УстановитьПараметр("ДатаОтчета", ДатаОтчета);
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        Строка.Параметры.Номенклатура = Выборка.Номенклатура;
        Строка.Параметры.Количество = Выборка.КоличествоОстаток;
        
        // Получаем двоичные данные из хранилища значений
        // В зависимости от структуры конфигурации обращение может быть:
        // Выборка.Номенклатура.Картинка.Получить() или через реквизит связанного справочника:
        ДвоичныеДанные = Выборка.Номенклатура.Картинка.Файл.Получить();
        
        Если ДвоичныеДанные <> Неопределено Тогда
            Строка.Параметры.КартинкаТовара = Новый Картинка(ДвоичныеДанные);
        Иначе
            Строка.Параметры.КартинкаТовара = Новый Картинка;
        КонецЕсли;
        
        ТабДок.Вывести(Строка);
        
    КонецЦикла;
    
КонецПроцедуры

Способ 2. Использование графических объектов (коллекция «Рисунки»)

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

Вариант с предопределенным рисунком на макете:

  1. В макете отчета вставим графический объект (пустой рисунок) в область строки и назовем его, например, ФотоТовара.
  2. В палитре свойств рисунка выберем режим изменения размера: Пропорционально (чтобы изображение вписывалось в границы без искажения пропорций).
  3. В коде вывода заполняем свойство картинки у графического объекта области:

Пока Выборка.Следующий() Цикл
    
    Строка.Параметры.Номенклатура = Выборка.Номенклатура;
    Строка.Параметры.Количество = Выборка.КоличествоОстаток;
    
    ДвоичныеДанные = Выборка.Номенклатура.Картинка.Файл.Получить();
    Если ДвоичныеДанные <> Неопределено Тогда
        Строка.Рисунки.ФотоТовара.Картинка = Новый Картинка(ДвоичныеДанные);
    Иначе
        Строка.Рисунки.ФотоТовара.Картинка = Новый Картинка;
    КонецЕсли;
    
    ТабДок.Вывести(Строка);
    
КонецЦикла;

Особенности производительности и рекомендации

При выводе изображений в прайс-листы и печатные формы важно учитывать следующие технические ограничения платформы 1С:

  1. Обработка пустых значений: если в реквизите нет сохраненного файла, метод Получить() возвращает Неопределено. Передача Неопределено в конструктор Новый Картинка() приведет к ошибке во время выполнения. Всегда проверяйте результат на заполненность.
  2. Объем памяти и размер макета: загрузка оригинальных фотографий высокого разрешения в объемный прайс-лист на сотни позиций может вызвать ошибку нехватки оперативной памяти на сервере или клиенте. Рекомендуется при загрузке файлов в систему автоматически создавать и сохранять уменьшенные миниатюры (превью) и использовать в отчетах именно их.
  3. Оптимизация обращений: обращение через точку к реквизитам связанных объектов (Выборка.Номенклатура.Картинка.Файл) внутри цикла вызывает дополнительные неявные запросы к СУБД. При формировании больших прайс-листов оптимально предварительно выгружать ссылки на файлы в массив и считывать их пакетом.
← На главную