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

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

Как вывести картинку на управляемую форму 1С

Способы вывести картинку на управляемую форму 1С: реквизит типа Строка, ПолеКартинки, временное хранилище, картинки из справочника и двоичные данные.

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

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

Ниже разобраны все рабочие способы: от самого простого (картинка из библиотеки конфигурации) до полноценного хранения фото в справочнике с выводом в карточку и в динамический список.

Как устроен механизм вывода картинок в управляемых формах

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

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

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

Простейший способ: картинка из библиотеки конфигурации

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

Тот же результат программно:

&НаСервере

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

// Реквизит формы "АдресКартинки" типа Строка создан заранее

Картинка = БиблиотекаКартинок.Информация;

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

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

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

Вывод картинки из реквизита объекта (ХранилищеЗначения)

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

Порядок действий
  1. 1
    Добавьте в объект реквизит типа ХранилищеЗначения, например «ДанныеКартинки»
  2. 2
    На форме создайте реквизит «АдресКартинки» типа Строка (неограниченная длина)
  3. 3
    Перетащите реквизит на форму, в свойствах элемента установите Вид = Поле картинки
  4. 4
    В ПриСозданииНаСервере и ПриЧтенииНаСервере получите данные из хранилища значения и поместите их во временное хранилище
  5. 5
    Присвойте полученный адрес реквизиту АдресКартинки

Код чтения картинки из объекта:

&НаСервере

Процедура ПрочитатьКартинку()

ДанныеКартинки = Объект.ДанныеКартинки.Получить();

Если ДанныеКартинки = Неопределено Тогда

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

Возврат;

КонецЕсли;

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

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

Вызывать эту процедуру нужно в двух местах: ПриЧтенииНаСервере (срабатывает при открытии и повторном чтении объекта) и ПриСозданииНаСервере для новых объектов, если картинка может быть заполнена по умолчанию. Если выводить только в ПриСозданииНаСервере, после записи и перечитывания объекта картинка пропадёт.

Загрузка картинки из файла с клиента

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

&НаКлиенте

Процедура ЗагрузитьКартинку(Команда)

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

НачатьПомещениеФайла(ОписаниеОповещения, , , Истина, УникальныйИдентификатор);

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

&НаКлиенте

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

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

Возврат;

КонецЕсли;

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

Модифицированность = Истина;

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

При записи объекта данные нужно перенести из временного хранилища в реквизит объекта:

&НаСервере

Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда

ТекущийОбъект.ДанныеКартинки = Новый ХранилищеЗначения(

ПолучитьИзВременногоХранилища(АдресКартинки), Новый СжатиеДанных(9));

КонецЕсли;

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

Проверка ЭтоАдресВременногоХранилища обязательна: если пользователь не менял картинку, в реквизите останется старый адрес, и перезаписывать данные не нужно. Сжатие данных при хранении снижает объём базы, что важно при большом количестве изображений.

Картинка в динамическом списке и табличной части

Вывести картинку в списке сложнее: для каждой строки нужен свой адрес хранилища, а динамический список не позволяет произвольно обрабатывать строки на сервере. Рабочие варианты:

  • Картинка состояния через «КартинкаСтроки». Если нужны только стандартные пиктограммы (проведён, помечен, валюта), добавьте в запрос списка вычисляемое поле-индекс и настройте колонку как картинку с указанием «КартинкаЗначений».
  • Произвольные фото в списке. В обработчике ПриПолученииДанныхНаСервере динамического списка можно перебрать строки и для каждой поместить картинку в хранилище, подставив адрес в оформляемое поле. Это работает, но заметно нагружает сервер при больших списках — включайте только для небольших выборок.
  • Табличная часть формы. Добавьте в табличную часть или вспомогательную таблицу формы колонку «АдресКартинки» (строка) и заполняйте её при чтении данных.

Сравнение вариантов

Общая картинка конфигурации

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

Реквизит ХранилищеЗначения в объекте

Стандартный способ для фото товара и сканов; прост в реализации, но раздувает таблицу при больших файлах

Присоединённые файлы (БСП)

Подходит для множества файлов и больших объёмов; требует подключения подсистемы БСП

Адрес внешнего файла/URL

Допустим для веб-клиента через ПолеHTMLДокумента; хрупко и зависит от доступности внешнего ресурса

Типичные ошибки и как их исправить

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

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

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

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

Открытие формы с заполненной картинкой
Норма

Изображение отображается сразу

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

Пустое поле — проверить ПутьКДанным и заполнение адреса

Запись и повторное открытие объекта
Норма

Картинка сохраняется

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

Картинка пропала — нет переноса в ПередЗаписьюНаСервере или чтения в ПриЧтенииНаСервере

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

Картинка видна в обоих клиентах

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

Работает только в толстом — используются несовместимые вызовы

Производительность и ограничения

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

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

Итог

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

Картинка на управляемой форме = строковый реквизит с адресом во временном хранилище + элемент «Поле картинки». Данные помещаются через ПоместитьВоВременноеХранилище с привязкой к УникальныйИдентификатор формы, чтение выполняется в ПриЧтенииНаСервере, запись — в ПередЗаписьюНаСервере с проверкой ЭтоАдресВременногоХранилища.

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

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

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

Почему картинка отображается при открытии, но пропадает после записи?

Адрес в хранилище теряет актуальность, а чтение выполняется только в ПриСозданииНаСервере. Добавьте заполнение реквизита в обработчик ПриЧтенииНаСервере — он вызывается при каждом перечитывании объекта, включая запись.

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

Поле картинки корректно отображает распространённые растровые форматы — PNG, JPEG, GIF, BMP. Для надёжной работы в веб-клиенте предпочтительны PNG и JPEG. Экзотические форматы лучше конвертировать заранее.

Как показать картинку по ссылке из интернета?

Штатное поле картинки не загружает изображения по HTTP-адресу. Нужно либо скачать файл на сервере через HTTPСоединение и поместить во временное хранилище, либо использовать ПолеHTMLДокумента с тегом img — но второй вариант зависит от настроек безопасности клиента.

Как ограничить размер загружаемых пользователем фото?

После помещения файла получите двоичные данные из хранилища и проверьте их размер методом Размер(). Если лимит превышен, сообщите пользователю и очистите адрес. Дополнительно можно уменьшать изображение перед сохранением с помощью объекта ОбработкаКартинок.

Работает ли этот подход на мобильной платформе?

Да, механизм временного хранилища и поле картинки поддерживаются мобильной платформой. Отличия касаются выбора файлов: на мобильном устройстве вместо диалога выбора удобнее использовать средства мультимедиа, например СредстваМультимедиа.СделатьФотоснимок.