К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как вывести изображение в 1С

Практические способы вывести изображение в 1С: на форму, в табличный документ, в отчёт СКД и на печать. Примеры кода, ограничения и типичные ошибки.

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

Источником изображения может быть файл на диске, двоичные данные в хранилище значения, адрес во временном хранилище или картинка из библиотеки картинок конфигурации. Каждый вариант имеет свои ограничения по производительности, безопасности и совместимости с тонким и веб-клиентом.

Ниже разобраны основные способы вывода с примерами кода, условиями выбора и типичными ошибками. Материал ориентирован на платформу 1С:Предприятие 8.3 с управляемыми формами, но отдельные приёмы работают и в обычном приложении.

Откуда брать изображение: источники данных

Прежде чем выводить картинку, нужно определиться, где она хранится. Самый распространённый вариант в типовых конфигурациях — присоединённые файлы или реквизит с типом «ХранилищеЗначения», внутри которого лежат двоичные данные файла. Это надёжный способ: данные хранятся в базе, доступны всем пользователям и попадают в резервную копию.

Второй вариант — файл на диске или сетевом ресурсе. Он подходит для временных задач (например, предпросмотр загружаемого фото), но хранить путь к файлу в базе как постоянную ссылку на изображение не стоит: при переносе базы или смене прав доступа картинки «потеряются».

Третий источник — библиотека картинок конфигурации или встроенные картинки платформы (БиблиотекаКартинок). Это стандартный способ для пиктограмм, иконок команд и служебных изображений интерфейса.

Сравнение источников изображений

Хранилище значения в базе

Надёжно, работает у всех пользователей, попадает в бэкап. Минус — увеличивает размер базы при больших фото.

Файл на диске

Подходит для временного предпросмотра. Не годится как постоянное хранилище: путь может стать недоступен.

Библиотека картинок

Для иконок и служебных изображений. Не предназначена для пользовательских фото.

Как вывести изображение на форму объекта

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

Пример кода в модуле формы для загрузки фото из хранилища значения:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ДвоичныеДанные = Объект.Фото.Получить(); // реквизит типа ХранилищеЗначения

Если ДвоичныеДанные <> Неопределено Тогда

АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);

КонецЕсли;

КонецПроцедуры

Здесь «АдресКартинки» — строковый реквизит формы, привязанный к полю картинки. Передача уникального идентификатора формы вторым параметром важна: она привязывает хранилище к времени жизни формы, и данные не будут удалены до её закрытия.

Порядок вывода картинки на форму
  1. 1
    Добавьте реквизит формы с типом «Строка» для адреса картинки
  2. 2
    Добавьте на форму элемент «Поле формы» с видом «Поле картинки» и свяжите его с реквизитом
  3. 3
    В коде получите двоичные данные из хранилища значения или файла
  4. 4
    Поместите данные во временное хранилище с привязкой к УникальныйИдентификаторФормы
  5. 5
    Запишите полученный адрес в реквизит формы и проверьте отображение

Загрузка картинки из файла по выбору пользователя

Если пользователь должен сам выбрать изображение, используется асинхронный метод НачатьПомещениеФайла. В тонком и веб-клиенте синхронные вызовы работы с файлами недоступны, поэтому код строится на описании оповещения:

&НаКлиенте

Процедура ВыбратьФайл(Команда)

НачатьПомещениеФайла(

Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект),

, , Истина, УникальныйИдентификаторФормы);

КонецПроцедуры

&НаКлиенте

Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт

Если Результат Тогда

АдресКартинки = Адрес;

КонецЕсли;

КонецПроцедуры

После этого адрес уже можно присвоить полю картинки, а при записи объекта — извлечь двоичные данные из временного хранилища методом ПолучитьИзВременногоХранилища и сохранить в хранилище значения.

Вывод изображения в табличный документ и печатную форму

Для печатных форм изображение вставляется через макет табличного документа. В макете добавляется рисунок (меню «Таблица — Рисунки — Вставить рисунок» или аналогичная команда в конфигураторе), которому присваивается имя. Затем в коде рисунку подставляется нужная картинка:

ТабДок = Новый ТабличныйДокумент;

Макет = ПолучитьМакет("МакетПечати");

Область = Макет.ПолучитьОбласть("Шапка");

Рисунок = Область.Рисунки.Найти("Логотип");

Если Рисунок <> Неопределено Тогда

ДвоичныеДанные = ЛоготипХранилище.Получить();

Рисунок.Картинка = Новый Картинка(ДвоичныеДанные);

КонецЕсли;

ТабДок.Вывести(Область);

Альтернатива — добавить рисунок программно без макета: ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка), после чего задать область размещения и свойство Картинка. Этот способ удобен, когда позиция изображения вычисляется динамически.

Учтите, что объект «Картинка» можно создать из двоичных данных, из файла или получить из библиотеки картинок. Формат должен поддерживаться платформой — стандартно работают PNG, JPEG, BMP, GIF. Экзотические форматы могут не отобразиться.

Вывод изображения в отчёт на СКД

В системе компоновки данных изображение выводится двумя путями. Первый — поле с типом «Картинка» в наборе данных: если запрос возвращает двоичные данные или значение типа «Картинка», СКД умеет отобразить его в ячейке. Для этого в настройках поля устанавливается оформление, а в макете поля указывается, что значение является картинкой.

Второй путь — макет оформления СКД, где в макет табличного документа вставляется рисунок (например, логотип в шапке отчёта). Это делается через конструктор макетов: «Схема компоновки данных — Макеты — Создать макет оформления».

На практике чаще всего фото товаров в отчётах выводят именно через поле-картинку, получая двоичные данные из присоединённых файлов в запросе или вычисляемом поле. Производительность при этом зависит от количества строк: отчёт с сотнями фото формируется заметно дольше.

Вывод картинки в динамический список и таблицу формы

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

Механизм такой: у элемента формы задаётся свойство «КартинкаЗначений» (общая картинка с набором пиктограмм), а значение в ячейке — число, индекс картинки внутри этого набора. Это стандартный способ, который используется в типовых конфигурациях для отображения состояний документов.

Выводить в список полноразмерные фото таким способом не получится — механизм рассчитан на маленькие пиктограммы. Для полноценного фото в списке применяют обходные решения: отдельную форму просмотра или поле картинки в панели навигации, обновляемое при активизации строки.

Типичные ошибки
01
Помещение данных во временное хранилище без УникальныйИдентификаторФормы — хранилище очищается, и картинка пропадает после обновления формы
02
Попытка присвоить полю картинки сам объект «Картинка» вместо адреса хранилища — в управляемой форме реквизит должен содержать строку-адрес
03
Использование синхронных файловых методов в тонком клиенте — код падает с ошибкой или требует расширения работы с файлами
04
Хранение пути к файлу на диске вместо двоичных данных — после переноса базы изображения недоступны
05
Вставка фото в полном разрешении в печатные формы — медленное формирование и огромные файлы

Проверка результата и ограничения

После внедрения проверьте вывод во всех клиентах, которые используются в организации: толстый, тонкий и веб-клиент могут вести себя по-разному, особенно при работе с файлами. Убедитесь, что картинка не пропадает после перезаписи объекта и переоткрытия формы — это признак проблем с временным хранилищем.

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

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

Контрольные точки

Как проверить результат

Отображение на форме
Норма

Картинка видна сразу после открытия и не исчезает после обновления

Тревожный признак

Пустое поле или пропадание после перезаписи — проблема с адресом хранилища

Печатная форма
Норма

Изображение на месте, пропорции сохранены, документ формируется быстро

Тревожный признак

Растянутая картинка или долгое формирование — слишком большой исходник

Работа в тонком клиенте
Норма

Загрузка файла работает через асинхронный диалог

Тревожный признак

Ошибка вызова методов работы с файлами — использованы синхронные методы

Частые вопросы

Почему картинка отображается в толстом клиенте, но не в тонком?

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

Можно ли вывести картинку прямо из реквизита без временного хранилища?

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

Как вывести фото товара в списке номенклатуры?

Штатно динамический список показывает только пиктограммы. Практичное решение — добавить на форму списка отдельное поле картинки и обновлять его в обработчике «ПриАктивизацииСтроки», загружая фото текущего товара во временное хранилище.

Какие форматы изображений поддерживает 1С?

Платформа стабильно работает с распространёнными форматами: PNG, JPEG, BMP, GIF и некоторыми другими. Перед использованием нестандартного формата проверьте отображение на тестовом примере — при необходимости конвертируйте файл заранее.

Как уменьшить изображение перед сохранением в базу?

Штатных средств ресайза в платформе нет. Используют внешние компоненты, COM-объекты обработки изображений на сервере Windows или предварительную обработку файлов до загрузки. Это снижает размер базы и ускоряет формирование печатных форм.

Итог

Что важно запомнить

На форму картинку выводят через строковый реквизит с адресом временного хранилища и поле картинки, в печатную форму — через рисунок макета табличного документа, в отчёт СКД — через поле-картинку или макет оформления. Всегда привязывайте хранилище к идентификатору формы, используйте асинхронные файловые методы и уменьшайте большие изображения перед сохранением.