Как программно вывести изображение номенклатуры в прайс-лист в 1С:Бухгалтерия 3.0

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

При формировании прайс-листов или коммерческих предложений в 1С:Бухгалтерия 3.0 часто возникает необходимость наглядной демонстрации товара. Вывод текстовой информации (наименование, цена, остаток) обычно не вызывает затруднений, однако работа с графическими объектами в табличном документе имеет свои нюансы. Разберем подробно, как правильно извлечь изображение из базы данных и поместить его в область макета.

Анализ проблемы: почему возникает ошибка пути к файлу

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

Проанализируем цепочку преобразований, которую необходимо выполнить:

  1. Извлечь содержимое из объекта ХранилищеЗначения.
  2. Убедиться, что полученные данные являются типом ДвоичныеДанные.
  3. Создать объект Картинка на основе этих данных.
  4. Поместить объект в графический контейнер (рисунок) внутри области макета.

Шаг 1: Подготовка макета табличного документа

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

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

Шаг 2: Программное получение данных изображения

Выясним, как правильно извлечь данные. Предположим, у нас есть выборка или строка таблицы значений мТекСтрока, где в поле ДанныеКартинки лежит ХранилищеЗначения. Рассмотрим правильный алгоритм получения данных:


// 1. Получаем данные из хранилища
ДанныеИзХранилища = мТекСтрока.ДанныеКартинки.Получить();

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

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

Шаг 3: Вывод картинки в область макета

Теперь разберем, как соединить полученную картинку с макетом. Посмотрим на правильную последовательность вывода области:


// Получаем область макета
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТовара");

// Заполняем текстовые параметры
ОбластьМакета.Параметры.Номенклатура = мТекСтрока.Номенклатура;
ОбластьМакета.Параметры.Цена = мТекСтрока.Цена;

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

// Выводим заполненную область в итоговый табличный документ
ТабДокумент.Вывести(ОбластьМакета);

Особенности работы в современных версиях 1С:Предприятие

При разработке под управляемые формы (версия 8.3) необходимо учитывать контекст выполнения кода. Посмотрим на важные моменты:

  1. Серверный контекст: Извлечение данных из базы и формирование ТабличногоДокумента должно происходить на стороне сервера. Конструктор Новый Картинка(ДвоичныеДанные) отлично работает на сервере.
  2. Оптимизация: Если прайс-лист содержит сотни позиций, постоянное создание объектов Картинка может нагружать память. Рекомендуется перед началом цикла проверить наличие данных и не выполнять лишних операций для пустых значений.
  3. Тип привязки: В свойствах рисунка в макете убедитесь, что установлен тип привязки Привязывать к ячейке. Это гарантирует, что при сохранении прайса в формат Excel картинки «не поплывут» и останутся строго напротив своих строк.

Работа с временным хранилищем

Если данные картинки были предварительно помещены во временное хранилище (например, при загрузке из внешней формы), то вместо метода Получить() для ХранилищаЗначения, мы используем ПолучитьИзВременногоХранилища(). Проанализируем пример:


// АдресКартинки - это строка (навигационная ссылка на временное хранилище)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресКартинки);
Если ДвоичныеДанные <> Неопределено Тогда
    ОбластьМакета.Рисунки.Изображение.Картинка = Новый Картинка(ДвоичныеДанные);
КонецЕсли;

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

← На главную