Как вывести картинку номенклатуры в печатную форму 1С:УНФ 1.6?

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

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

Анализ структуры хранения файлов в УНФ

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

Более того, сами двоичные данные могут находиться либо в базе данных (в реквизите ФайлХранилище), либо в томах на диске. Именно поэтому попытка получить картинку через Номенклатура.ФайлКартинки.ФайлХранилище.Получить() часто возвращает Неопределено. Мы должны использовать универсальные механизмы платформы и программного интерфейса УНФ для работы с хранилищем файлов.

Способ 1: Получение основного изображения номенклатуры

Если нам нужно вывести «основную» картинку, которая выбрана в карточке номенклатуры, мы можем воспользоваться встроенными функциями общего модуля. Разберем алгоритм получения данных через временное хранилище. Синхронизация данных при работе с внешними площадками выполняется через интеграцию 1С:УНФ с маркетплейсами Ozon, Wildberries и Яндекс.Маркет.

Рассмотрим пример кода, который подготавливает изображение для вывода в область макета:


// СсылкаНаНоменклатуру - ссылка на справочник Номенклатура
// ОбластьСтрока - полученная область макета

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

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

Способ 2: Поиск картинки по специальному имени (фильтрация)

Иногда бизнес-логика требует вывода не основной картинки, а конкретного изображения, помеченного определенным образом (например, файл с наименованием «Для прайса»). В этом случае нам поможет запрос к справочнику присоединенных файлов. Проанализируем этот подход:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Файлы.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.НоменклатураПрисоединенныеФайлы КАК Файлы
    |ГДЕ
    |	Файлы.ВладелецФайла = &Номенклатура
    |	И Файлы.Наименование ПОДОБНО ""%Для прайса%""
    |	И Файлы.ПометкаУдаления = ЛОЖЬ";

Запрос.УстановитьПараметр("Номенклатура", ТекущаяНоменклатура);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

Использование запроса позволяет гибко управлять логикой выбора фото, если у одной номенклатуры прикреплено несколько десятков файлов. Для регулярной рассылки готовых прайс-листов партнерам применяется автоматизированный сбор и выгрузка файлов через электронную почту или FTP.

Настройка макета для корректного отображения

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

  1. Использование объекта «Рисунок»: В макете через меню "Таблица -> Рисунки -> Вставить картинку" добавляется пустая рамка. В свойствах этой рамки нужно обязательно указать Имя (например, Изображение). Именно к этому имени мы обращаемся через коллекцию Область.Рисунки.
  2. Размещение в ячейке: Если вы хотите, чтобы картинка была жестко привязана к границам ячейки, можно объединить несколько ячеек и в свойствах указать режим Картинка. Однако программное управление через коллекцию Рисунки считается более гибким и надежным.

Рассмотрим важные параметры отображения, которые можно задать программно:

Размер картинки: Чтобы фото не искажалось и сохраняло свои пропорции внутри рамки, используйте свойство РазмерКартинки:


ОбластьСтрока.Рисунки.Изображение.РазмерКартинки = РазмерКартинки.Пропорционально;

Основные режимы:

Оптимизация производительности при массовой печати

Выясним причину, по которой формирование печатной формы может замедляться. Если в документе 100 строк с номенклатурой, и для каждой мы выполняем запрос и получаем двоичные данные, это создает нагрузку на сервер и дисковую подсистему. Проанализируем способы ускорения:

Пакетное получение данных: Вместо получения картинки в цикле вывода каждой строки, рекомендуется заранее собрать все ссылки на ФайлКартинки для всего списка номенклатуры и получить их данные одним запросом или с использованием кэширования.

Проверка на пустое значение: Перед вызовом тяжелых функций всегда проверяйте заполненность реквизита. Это избавит систему от лишних обращений к временному хранилищу:


Если НЕ ЗначениеЗаполнено(Стр.Номенклатура.ФайлКартинки) Тогда
    // Можно вывести заглушку "Нет фото" или просто пропустить блок
    Продолжить;
КонецЕсли;

Типичные ошибки и способы их решения

Проанализируем ситуацию, когда код написан верно, но картинка не появляется:

Используя приведенные выше методы и учитывая особенности работы с временным хранилищем в УНФ 1.6, мы сможем создать профессиональные и визуально привлекательные печатные формы для бизнеса. Сохранность данных при внесении изменений в код обеспечивает автоматическое обслуживание и архивирование баз 1С.

← На главную