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