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