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