Одной из частых задач при доработке конфигураций 1С является визуализация товаров в печатных формах, таких как «Счет на оплату», «Заказ покупателя» или «Накладная». Наличие фотографии товара помогает клиенту быстрее идентифицировать позиции и снижает вероятность ошибок при сборке заказов. В этой статье мы подробно разберем, как реализовать механизм вывода картинок, основываясь на практическом опыте разработчиков.
Для того чтобы картинка появилась в печатном документе, нам необходимо выполнить два основных условия: подготовить специальную область в Макете и написать программный код в Модуле объекта (или менеджера), который свяжет данные из базы с этой областью. Процесс вывода изображения принципиально отличается от вывода текста, так как изображение является объектом коллекции Рисунки табличного документа.
Рассмотрим по шагам, как это реализовать.
Прежде всего, откроем макет нашей печатной формы в конфигураторе. Нам нужно создать область, где будет располагаться изображение. Обычно это колонка в строке табличной части. Проанализируем важный нюанс: часто бывает удобно создать две разные строки в макете — одну с картинкой (например, СтрокаСКартинкой), а другую без нее (СтрокаБезКартинки). Это позволит динамически менять высоту строки в зависимости от наличия изображения.
В выбранной области макета выполним следующие действия:
Изображение. Именно по этому имени мы будем обращаться к нему из кода.Пропорционально. Это гарантирует, что фотография не будет искажена, если ее пропорции отличаются от размеров рамки в макете.Теперь перейдем к написанию кода. В печатных формах на обычных формах (или в старых конфигурациях) изображение номенклатуры обычно хранится в реквизите ОсновноеИзображение, которое ссылается на справочник ХранилищеДополнительнойИнформации. Данные физически лежат в поле типа ХранилищеЗначения.
Разберем пример кода для получения двоичных данных картинки:
// Получаем изображение из реквизитов номенклатуры
ИзображениеОбъект = ВыборкаСтрокТовары.Номенклатура.ОсновноеИзображение.Хранилище.Получить();
Если ИзображениеОбъект = Неопределено Тогда
// Если картинки нет, выбираем обычную область макета
СтрокаМакета = "СтрокаБезКартинки";
Иначе
// Если картинка есть, выбираем область с объектом "Рисунок"
СтрокаМакета = "СтрокаСКартинкой";
КонецЕсли;
Обратите внимание, что метод Получить() извлекает данные из хранилища. Если результат равен Неопределено, значит, у товара не задано изображение.
После того как мы получили данные и определились с областью макета, нам нужно «вставить» картинку в конкретную ячейку формируемого документа. Выясним, как правильно обратиться к рисунку внутри области.
// Получаем нужную область из макета
ОбластьЭскиза = Макет.ПолучитьОбласть(СтрокаМакета + "|КолонкаЭскизов");
// Если изображение существует, присваиваем его объекту в макете
Если ИзображениеОбъект <> Неопределено Тогда
// Обращаемся к коллекции Рисунки по имени, которое мы дали в Шаге 1
ОбластьЭскиза.Рисунки["Изображение"].Картинка = Новый Картинка(ИзображениеОбъект);
КонецЕсли;
// Присоединяем подготовленную область к основному табличному документу
ТабДокумент.Присоединить(ОбластьЭскиза);
Использование метода Присоединить() позволяет нам добавлять колонку с картинкой справа от уже выведенных текстовых данных строки, что очень удобно при формировании сложных таблиц.
Проанализируем ситуацию, когда код кажется верным, но система выдает ошибку Поле объекта не обнаружено (Изображение). Это происходит в тех случаях, когда программа пытается обратиться к рисунку в той области макета, где его нет. Рассмотрим решение:
ПолучитьОбласть() именно для той строки, в которой физически размещен графический объект.Макет.ПолучитьОбласть("Строка|Колонка").Если Изображение = Неопределено помогает избежать логических ошибок.Если мы работаем в современных решениях (например, 1С:Управление нашей фирмой или 1С:ERP), механизм хранения файлов изменился. Рассмотрим подробнее, как работать с Библиотекой стандартных подсистем (БСП).
В таких конфигурациях файлы хранятся в отдельных справочниках (например, НоменклатураПрисоединенныеФайлы). Для получения данных следует использовать программный интерфейс БСП:
// Пример для конфигураций на управляемых формах (БСП)
ДанныеФайла = ПрисоединенныеФайлы.ДанныеФайла(СсылкаНаКартинку);
Если ДанныеФайла <> Неопределено Тогда
КартинкаДляВывода = Новый Картинка(ДанныеФайла.ДвоичныеДанные);
// Дальнейший вывод в Рисунки табличного документа
КонецЕсли;
Также стоит упомянуть возможность использования свойства ячейки КартинкаФона, появившееся в платформе 8.3.15. Этот метод позволяет не создавать плавающие объекты Рисунок, а устанавливать изображение непосредственно фоном ячейки. Это значительно упрощает верстку, так как изображение жестко привязано к сетке таблицы и не «съезжает» при изменении масштаба печати.
Посмотрим на ситуацию со стороны производительности. Если в вашем прайс-листе 500 товаров, и каждая фотография весит по 2-3 Мегабайта, итоговый документ станет неподъемным для оперативной памяти и почтовых серверов. Проанализируем решение этой проблемы:
Рекомендуется использовать объект ОбработкаКартинки для предварительного сжатия изображения перед выводом в макет. Мы можем программно уменьшить разрешение фотографии до необходимого для печати (например, 200x200 пикселей), что существенно сократит размер печатной формы без потери визуального качества на бумаге.
// Пример масштабирования картинки
Обработка = Новый ОбработкаКартинки;
Обработка.УстановитьКартинку(Новый Картинка(ИзображениеОбъект));
Обработка.ИзменитьРазмер(200, 200); // Размер в пикселях
КартинкаДляПечати = Обработка.ПолучитьКартинку();
ОбластьЭскиза.Рисунки["Изображение"].Картинка = КартинкаДляПечати;
Используя предложенные методики, вы сможете гибко настраивать печатные формы, обеспечивая пользователей наглядной и профессионально оформленной документацией.