Как вывести основное изображение номенклатуры при печати накладной в 1С?

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

При формировании печатных форм в 1С часто возникает задача визуализации товара. Простое текстовое описание не всегда удобно для сотрудников склада или покупателей, поэтому вывод основного изображения номенклатуры прямо в накладной является востребованной доработкой. Рассмотрим подробно, как реализовать этот функционал в конфигурациях на обычных формах (например, УПП 1.3, КА 1.1 или УТ 10.3), где изображения хранятся в справочнике ХранилищеДополнительнойИнформации.

Разберем причину проблемы

Типичная ошибка начинающего разработчика заключается в попытке вывести изображение в обычную ячейку табличного документа, просто указав параметр в макете. В результате в печатной форме вместо фотографии отображается либо пустота, либо текстовое представление объекта (например, "Картинка" или имя файла). Это происходит потому, что ячейка предназначена для текста или чисел, а для графических данных в 1С используется специальный объект — Рисунок (Drawings).

Шаг 1. Подготовка макета печатной формы

Первым делом нам необходимо подготовить область макета, где будет располагаться фото. Выполним следующие действия:

  1. Откроем макет нашей накладной (в примере автора это НакладнаяСФото).
  2. В области строки (например, Строка) выделим место под колонку "Изображение".
  3. Важный момент: не используйте обычный параметр ячейки. Вместо этого перейдите в меню Таблица — Рисунки — Вставить картинку.
  4. Выберите любую временную картинку (она будет заменена программно).
  5. Нажмите правой кнопкой мыши на вставленный рисунок и откройте его Свойства:
    • В поле Имя укажите понятный идентификатор, например, РисФото.
    • В свойстве Тип картинки выберите значение Параметр.
    • В свойстве Размер установите Пропорционально. Это позволит изображению корректно вписываться в границы, не растягиваясь и не искажая пропорции товара.

Шаг 2. Корректировка запроса для получения данных

Чтобы вывести изображение, его нужно сначала извлечь из базы данных. В конфигурациях, использующих справочник ХранилищеДополнительнойИнформации, путь к данным лежит через реквизит ОсновноеИзображение. Проанализируем, как должен выглядеть фрагмент запроса:


// Фрагмент запроса для получения ссылки на хранилище
"ВЫБРАТЬ
|   РеализацияТоваровУслуг.Номенклатура КАК Номенклатура,
|   РеализацияТоваровУслуг.Номенклатура.ОсновноеИзображение.Хранилище КАК ФотоДанные,
|   ...другие поля..."

Обратите внимание: мы обращаемся к полю Хранилище. Тип этого поля в системе — ХранилищеЗначения. Напрямую вывести его в макет нельзя, из него нужно будет извлечь бинарные данные в цикле обхода выборки.

Шаг 3. Реализация программного вывода в цикле

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

Проанализируем пример кода для вывода строки с фотографией:


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

Разберем нюансы работы с объектом Рисунок

Многие разработчики совершают ошибку, пытаясь обратиться к ТабДокумент.Рисунки. Выясним причину, почему это не совсем верно в данном контексте. Когда мы используем ОбластьМакета.ПолучитьОбласть(), мы создаем локальную копию части макета. Именно в этой локальной копии (переменная ОбластьСтрока в нашем примере) нужно менять картинку до того, как метод Вывести() добавит её в финальный документ.

Также важно учитывать следующие моменты:

Посмотрим на итоговую структуру функции печати

Основываясь на коде, предоставленном в обсуждении, проанализируем ситуацию с объединением областей. Если ваша печатная форма строится методом Присоединить(), логика работы с рисунками сохраняется, но вы должны обращаться к той области, которая содержит рисунок.


// Пример использования Присоединить()
ОбластьФото = Макет.ПолучитьОбласть("Строка|Изображение");

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

ТабДокумент.Присоединить(ОбластьФото);

Выясним причину возможных ошибок

Если код написан, но фото все равно не отображается, проверим следующие пункты:

  1. Тип реквизита: Убедитесь, что в запросе вы получаете именно Хранилище, а не ссылку на справочник НоменклатураПрисоединенныеФайлы (в более новых конфигурациях).
  2. Имя рисунка: Имя в коде (Область.Рисунки.Имя) должно строго совпадать с именем в свойствах объекта на макете.
  3. Проверка на пустое значение: Метод .Получить() у пустого хранилища вернет Неопределено, что может вызвать ошибку при создании Новый Картинка(). Всегда добавляйте проверку Если ЗначениеЗаполнено(...).

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

← На главную