При разработке печатных форм в конфигурации 1С:Управление нашей фирмой (УНФ) 1.6 часто возникает задача визуализации товаров. Вывод изображения номенклатуры позволяет сделать прайс-листы, счета на оплату или заказы покупателей более информативными. Однако начинающие разработчики часто сталкиваются с тем, что простое обращение к реквизиту ФайлКартинки не возвращает само изображение. Рассмотрим подробно, как правильно извлечь данные картинки и отобразить их в макете.
Прежде чем приступать к написанию кода, проанализируем, как 1С хранит изображения. В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем), к которым относится и УНФ, файлы хранятся не напрямую в справочнике Номенклатура. Справочник содержит лишь ссылку на элемент другого справочника — НоменклатураПрисоединенныеФайлы.
Более того, сами двоичные данные могут находиться либо в базе данных (в реквизите ФайлХранилище), либо в томах на диске. Именно поэтому попытка получить картинку через Номенклатура.ФайлКартинки.ФайлХранилище.Получить() часто возвращает Неопределено. Мы должны использовать универсальные механизмы платформы и программного интерфейса УНФ для работы с хранилищем файлов.
Если нам нужно вывести «основную» картинку, которая выбрана в карточке номенклатуры, мы можем воспользоваться встроенными функциями общего модуля. Разберем алгоритм получения данных через временное хранилище. Синхронизация данных при работе с внешними площадками выполняется через интеграцию 1С:УНФ с маркетплейсами Ozon, Wildberries и Яндекс.Маркет.
Рассмотрим пример кода, который подготавливает изображение для вывода в область макета:
// СсылкаНаНоменклатуру - ссылка на справочник Номенклатура
// ОбластьСтрока - полученная область макета
Если ЗначениеЗаполнено(СсылкаНаНоменклатуру.ФайлКартинки) Тогда
// Получаем адрес двоичных данных во временном хранилище
// В УНФ для этого часто используется функция СсылкаНаДвоичныеДанныеФайла
АдресКартинки = УправлениеНебольшойФирмойСервер.СсылкаНаДвоичныеДанныеФайла(СсылкаНаНоменклатуру.ФайлКартинки);
Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда
// Извлекаем двоичные данные из хранилища
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресКартинки);
// Создаем объект Картинка
КартинкаОбъект = Новый Картинка(ДвоичныеДанные);
// Помещаем картинку в рисунок на макете
// "Изображение" - это имя объекта типа Рисунок в макете
ОбластьСтрока.Рисунки.Изображение.Картинка = КартинкаОбъект;
КонецЕсли;
КонецЕсли;
Обратите внимание на критически важный момент: функция СсылкаНаДвоичныеДанныеФайла возвращает не саму картинку, а строку-навигационную ссылку на данные в памяти сервера. Чтобы превратить эту ссылку в объект, который понимает табличный документ, обязательно используем ПолучитьИзВременногоХранилища.
Иногда бизнес-логика требует вывода не основной картинки, а конкретного изображения, помеченного определенным образом (например, файл с наименованием «Для прайса»). В этом случае нам поможет запрос к справочнику присоединенных файлов. Проанализируем этот подход:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Файлы.Ссылка КАК Ссылка
|ИЗ
| Справочник.НоменклатураПрисоединенныеФайлы КАК Файлы
|ГДЕ
| Файлы.ВладелецФайла = &Номенклатура
| И Файлы.Наименование ПОДОБНО ""%Для прайса%""
| И Файлы.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("Номенклатура", ТекущаяНоменклатура);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Адрес = УправлениеНебольшойФирмойСервер.СсылкаНаДвоичныеДанныеФайла(Выборка.Ссылка);
КартинкаДок = Новый Картинка(ПолучитьИзВременногоХранилища(Адрес));
// Работаем с областью табличного документа
ОблКартинка = ТабДок.Область(НомерСтроки, НомерКолонки);
// Настраиваем вывод
ОбластьСтрока.Рисунки.ИмяРисункаВМакете.Картинка = КартинкаДок;
КонецЕсли;
Использование запроса позволяет гибко управлять логикой выбора фото, если у одной номенклатуры прикреплено несколько десятков файлов. Для регулярной рассылки готовых прайс-листов партнерам применяется автоматизированный сбор и выгрузка файлов через электронную почту или FTP.
Выясним, как правильно подготовить сам табличный документ (макет) в конфигураторе, чтобы код сработал успешно. Существует два основных подхода:
Изображение). Именно к этому имени мы обращаемся через коллекцию Область.Рисунки.Картинка. Однако программное управление через коллекцию Рисунки считается более гибким и надежным.Рассмотрим важные параметры отображения, которые можно задать программно:
Размер картинки: Чтобы фото не искажалось и сохраняло свои пропорции внутри рамки, используйте свойство РазмерКартинки:
ОбластьСтрока.Рисунки.Изображение.РазмерКартинки = РазмерКартинки.Пропорционально;
Основные режимы:
Пропорционально — сохраняет аспекты изображения, вписывая его в границы.Растянуть — заполняет всю область рисунка (может привести к «растягиванию» лиц или предметов).АвтоРазмер — изменяет размер рамки под реальный размер файла.Выясним причину, по которой формирование печатной формы может замедляться. Если в документе 100 строк с номенклатурой, и для каждой мы выполняем запрос и получаем двоичные данные, это создает нагрузку на сервер и дисковую подсистему. Проанализируем способы ускорения:
Пакетное получение данных: Вместо получения картинки в цикле вывода каждой строки, рекомендуется заранее собрать все ссылки на ФайлКартинки для всего списка номенклатуры и получить их данные одним запросом или с использованием кэширования.
Проверка на пустое значение: Перед вызовом тяжелых функций всегда проверяйте заполненность реквизита. Это избавит систему от лишних обращений к временному хранилищу:
Если НЕ ЗначениеЗаполнено(Стр.Номенклатура.ФайлКартинки) Тогда
// Можно вывести заглушку "Нет фото" или просто пропустить блок
Продолжить;
КонецЕсли;
Проанализируем ситуацию, когда код написан верно, но картинка не появляется:
Новый Картинка(АдресВХранилище) без вызова функции ПолучитьИзВременногоХранилища(). Платформа ожидает либо путь к файлу на диске, либо двоичные данные. Адрес в хранилище — это просто строка.НоменклатураПрисоединенныеФайлы.Используя приведенные выше методы и учитывая особенности работы с временным хранилищем в УНФ 1.6, мы сможем создать профессиональные и визуально привлекательные печатные формы для бизнеса. Сохранность данных при внесении изменений в код обеспечивает автоматическое обслуживание и архивирование баз 1С.