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