Разработка и Конфигурация · 11 мин
Как вывести изображение в 1С
Практические способы вывести изображение в 1С: на форму, в табличный документ, в отчёт СКД и на печать. Примеры кода, ограничения и типичные ошибки.
Задача вывести изображение в 1С возникает в самых разных сценариях: показать фото товара на форме элемента справочника, вставить логотип в печатную форму, добавить картинку в отчёт на СКД или отобразить фото сотрудника. В зависимости от места вывода применяются разные механизмы платформы — поле формы с видом «Поле картинки», область рисунка в макете табличного документа или программная работа с объектом «Картинка».
Источником изображения может быть файл на диске, двоичные данные в хранилище значения, адрес во временном хранилище или картинка из библиотеки картинок конфигурации. Каждый вариант имеет свои ограничения по производительности, безопасности и совместимости с тонким и веб-клиентом.
Ниже разобраны основные способы вывода с примерами кода, условиями выбора и типичными ошибками. Материал ориентирован на платформу 1С:Предприятие 8.3 с управляемыми формами, но отдельные приёмы работают и в обычном приложении.
Откуда брать изображение: источники данных
Прежде чем выводить картинку, нужно определиться, где она хранится. Самый распространённый вариант в типовых конфигурациях — присоединённые файлы или реквизит с типом «ХранилищеЗначения», внутри которого лежат двоичные данные файла. Это надёжный способ: данные хранятся в базе, доступны всем пользователям и попадают в резервную копию.
Второй вариант — файл на диске или сетевом ресурсе. Он подходит для временных задач (например, предпросмотр загружаемого фото), но хранить путь к файлу в базе как постоянную ссылку на изображение не стоит: при переносе базы или смене прав доступа картинки «потеряются».
Третий источник — библиотека картинок конфигурации или встроенные картинки платформы (БиблиотекаКартинок). Это стандартный способ для пиктограмм, иконок команд и служебных изображений интерфейса.
Сравнение источников изображений
Надёжно, работает у всех пользователей, попадает в бэкап. Минус — увеличивает размер базы при больших фото.
Подходит для временного предпросмотра. Не годится как постоянное хранилище: путь может стать недоступен.
Для иконок и служебных изображений. Не предназначена для пользовательских фото.
Как вывести изображение на форму объекта
Классическая схема для управляемой формы выглядит так: в реквизиты формы добавляется реквизит типа «Строка» (неограниченная длина), в который помещается адрес двоичных данных во временном хранилище. На форму добавляется элемент с видом «Поле картинки», связанный с этим реквизитом. Платформа сама отображает картинку по адресу.
Пример кода в модуле формы для загрузки фото из хранилища значения:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДвоичныеДанные = Объект.Фото.Получить(); // реквизит типа ХранилищеЗначения
Если ДвоичныеДанные <> Неопределено Тогда
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);
КонецЕсли;
КонецПроцедуры
Здесь «АдресКартинки» — строковый реквизит формы, привязанный к полю картинки. Передача уникального идентификатора формы вторым параметром важна: она привязывает хранилище к времени жизни формы, и данные не будут удалены до её закрытия.
- 1Добавьте реквизит формы с типом «Строка» для адреса картинки
- 2Добавьте на форму элемент «Поле формы» с видом «Поле картинки» и свяжите его с реквизитом
- 3В коде получите двоичные данные из хранилища значения или файла
- 4Поместите данные во временное хранилище с привязкой к УникальныйИдентификаторФормы
- 5Запишите полученный адрес в реквизит формы и проверьте отображение
Загрузка картинки из файла по выбору пользователя
Если пользователь должен сам выбрать изображение, используется асинхронный метод НачатьПомещениеФайла. В тонком и веб-клиенте синхронные вызовы работы с файлами недоступны, поэтому код строится на описании оповещения:
&НаКлиенте
Процедура ВыбратьФайл(Команда)
НачатьПомещениеФайла(
Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект),
, , Истина, УникальныйИдентификаторФормы);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт
Если Результат Тогда
АдресКартинки = Адрес;
КонецЕсли;
КонецПроцедуры
После этого адрес уже можно присвоить полю картинки, а при записи объекта — извлечь двоичные данные из временного хранилища методом ПолучитьИзВременногоХранилища и сохранить в хранилище значения.
Вывод изображения в табличный документ и печатную форму
Для печатных форм изображение вставляется через макет табличного документа. В макете добавляется рисунок (меню «Таблица — Рисунки — Вставить рисунок» или аналогичная команда в конфигураторе), которому присваивается имя. Затем в коде рисунку подставляется нужная картинка:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетПечати");
Область = Макет.ПолучитьОбласть("Шапка");
Рисунок = Область.Рисунки.Найти("Логотип");
Если Рисунок <> Неопределено Тогда
ДвоичныеДанные = ЛоготипХранилище.Получить();
Рисунок.Картинка = Новый Картинка(ДвоичныеДанные);
КонецЕсли;
ТабДок.Вывести(Область);
Альтернатива — добавить рисунок программно без макета: ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка), после чего задать область размещения и свойство Картинка. Этот способ удобен, когда позиция изображения вычисляется динамически.
Учтите, что объект «Картинка» можно создать из двоичных данных, из файла или получить из библиотеки картинок. Формат должен поддерживаться платформой — стандартно работают PNG, JPEG, BMP, GIF. Экзотические форматы могут не отобразиться.
Вывод изображения в отчёт на СКД
В системе компоновки данных изображение выводится двумя путями. Первый — поле с типом «Картинка» в наборе данных: если запрос возвращает двоичные данные или значение типа «Картинка», СКД умеет отобразить его в ячейке. Для этого в настройках поля устанавливается оформление, а в макете поля указывается, что значение является картинкой.
Второй путь — макет оформления СКД, где в макет табличного документа вставляется рисунок (например, логотип в шапке отчёта). Это делается через конструктор макетов: «Схема компоновки данных — Макеты — Создать макет оформления».
На практике чаще всего фото товаров в отчётах выводят именно через поле-картинку, получая двоичные данные из присоединённых файлов в запросе или вычисляемом поле. Производительность при этом зависит от количества строк: отчёт с сотнями фото формируется заметно дольше.
Вывод картинки в динамический список и таблицу формы
В динамических списках и таблицах формы изображение обычно выводится как пиктограмма состояния — например, индикатор наличия фото или статуса. Для этого у таблицы формы добавляется колонка с видом «Поле картинки», а в запросе списка вычисляется числовое поле-индекс, которое сопоставляется с коллекцией «КартинкиСтрок».
Механизм такой: у элемента формы задаётся свойство «КартинкаЗначений» (общая картинка с набором пиктограмм), а значение в ячейке — число, индекс картинки внутри этого набора. Это стандартный способ, который используется в типовых конфигурациях для отображения состояний документов.
Выводить в список полноразмерные фото таким способом не получится — механизм рассчитан на маленькие пиктограммы. Для полноценного фото в списке применяют обходные решения: отдельную форму просмотра или поле картинки в панели навигации, обновляемое при активизации строки.
Проверка результата и ограничения
После внедрения проверьте вывод во всех клиентах, которые используются в организации: толстый, тонкий и веб-клиент могут вести себя по-разному, особенно при работе с файлами. Убедитесь, что картинка не пропадает после перезаписи объекта и переоткрытия формы — это признак проблем с временным хранилищем.
Отдельно проверьте поведение при отсутствии изображения: поле картинки с пустым адресом отображает пустое место, что не всегда удобно. В таких случаях полезно подставлять картинку-заглушку из библиотеки картинок или скрывать элемент формы через свойство «Видимость».
Из ограничений стоит помнить: временное хранилище живёт ограниченное время, большие массивы изображений нагружают память сервера, а в файловой базе хранение тысяч фото в хранилищах значений может заметно замедлить работу. Для объёмных медиаданных рассмотрите тома хранения файлов — механизм, доступный в типовых конфигурациях на БСП.
Как проверить результат
Картинка видна сразу после открытия и не исчезает после обновления
Пустое поле или пропадание после перезаписи — проблема с адресом хранилища
Изображение на месте, пропорции сохранены, документ формируется быстро
Растянутая картинка или долгое формирование — слишком большой исходник
Загрузка файла работает через асинхронный диалог
Ошибка вызова методов работы с файлами — использованы синхронные методы
Частые вопросы
Почему картинка отображается в толстом клиенте, но не в тонком?
Чаще всего причина в синхронных методах работы с файлами или в том, что двоичные данные формируются на клиенте, где нет доступа к нужному ресурсу. Перенесите получение данных на сервер и используйте асинхронное помещение файла с описанием оповещения.
Можно ли вывести картинку прямо из реквизита без временного хранилища?
В управляемой форме поле картинки работает с адресом временного хранилища, поэтому промежуточный шаг обязателен. В обычных формах элемент «Поле картинки» мог принимать сам объект «Картинка», но для управляемого интерфейса этот путь недоступен.
Как вывести фото товара в списке номенклатуры?
Штатно динамический список показывает только пиктограммы. Практичное решение — добавить на форму списка отдельное поле картинки и обновлять его в обработчике «ПриАктивизацииСтроки», загружая фото текущего товара во временное хранилище.
Какие форматы изображений поддерживает 1С?
Платформа стабильно работает с распространёнными форматами: PNG, JPEG, BMP, GIF и некоторыми другими. Перед использованием нестандартного формата проверьте отображение на тестовом примере — при необходимости конвертируйте файл заранее.
Как уменьшить изображение перед сохранением в базу?
Штатных средств ресайза в платформе нет. Используют внешние компоненты, COM-объекты обработки изображений на сервере Windows или предварительную обработку файлов до загрузки. Это снижает размер базы и ускоряет формирование печатных форм.
Что важно запомнить
На форму картинку выводят через строковый реквизит с адресом временного хранилища и поле картинки, в печатную форму — через рисунок макета табличного документа, в отчёт СКД — через поле-картинку или макет оформления. Всегда привязывайте хранилище к идентификатору формы, используйте асинхронные файловые методы и уменьшайте большие изображения перед сохранением.