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

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

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

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

Вывод картинки на форму в 1С — типовая задача: фото товара в карточке номенклатуры, логотип компании на печатной форме, скан подписи в документе. Механизм зависит от того, где хранится изображение: в реквизите объекта, во временном хранилище, в макете конфигурации или в файле на диске.

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

Перед началом работы определите три вещи: откуда берётся изображение (файл, хранилище значения в базе, макет), нужно ли его редактировать прямо на форме и должна ли картинка сохраняться вместе с объектом. От этого зависит выбор реквизитов и кода.

Способы вывода картинки: что выбрать

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

Третий источник — картинка из макета конфигурации или библиотеки картинок: используется для статичных элементов интерфейса, например логотипов. Четвёртый — файл на диске или в сети, который загружается программно. Каждый вариант требует своего способа получения данных, но элемент формы во всех случаях один и тот же.

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

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

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

Временное хранилище

Картинка живёт только в сеансе работы с формой. Подходит для предпросмотра и передачи данных между клиентом и сервером.

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

Статичные изображения интерфейса. Не требуют кода загрузки, но нельзя менять без изменения конфигурации.

Файл на диске

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

Добавление реквизита и элемента «Поле картинки» на форму

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

Если автоматически создался другой тип поля, выделите элемент и в палитре свойств измените «Вид» на «Поле картинки». Полезные свойства: «РазмерКартинки» (например, «Пропорционально» — чтобы изображение не искажалось), «Гиперссылка» и обработчики «Нажатие» и «Перетаскивание» для интерактивной загрузки. Задайте элементу осмысленную ширину и высоту, иначе картинка сожмётся до строки.

Порядок добавления картинки на управляемую форму
  1. 1
    Откройте форму в конфигураторе, добавьте реквизит формы «АдресКартинки» типа «Строка»
  2. 2
    Перетащите реквизит в дерево элементов и установите вид «Поле картинки»
  3. 3
    В свойствах задайте РазмерКартинки = Пропорционально и нужные размеры
  4. 4
    В модуле формы напишите код загрузки данных во временное хранилище
  5. 5
    Откройте форму в режиме 1С:Предприятие и проверьте отображение

Программная загрузка картинки из файла

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

&НаКлиенте

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

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

Диалог.Фильтр = "Картинки (.jpg;.png;.bmp)|.jpg;.png;.bmp";

Если Диалог.Выбрать() Тогда

ДвоичныеДанные = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);

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

КонецЕсли;

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

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

Вывод картинки из хранилища значения объекта

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

&НаСервере

Процедура ПриЧтенииНаСервере(ТекущийОбъект)

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

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

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

КонецЕсли;

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

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

&НаСервере

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

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

ТекущийОбъект.ДанныеКартинки = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресКартинки));

КонецЕсли;

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

Картинка из макета и библиотеки картинок

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

Элементы.ДекорацияЛоготип.Картинка = БиблиотекаКартинок.Информация;

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

Обычные формы: отличия

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

Картинка = Новый Картинка(ПолноеИмяФайла);

ЭлементыФормы.ПолеКартинки1.Картинка = Картинка;

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

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

Проверка результата и типичные проблемы

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

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

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

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

Адрес в реквизите формы
Норма

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

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

Возвращает Ложь — данные не помещены или хранилище очищено

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

Картинка видна сразу после загрузки и после перезаписи объекта

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

Видна только до записи — данные не сохраняются в объект

Повторное открытие
Норма

Картинка загружается из базы при открытии формы

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

Поле пустое — не реализовано чтение в ПриЧтенииНаСервере

FAQ

Можно ли вывести картинку на форму списка, а не объекта?

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

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

Объект «Картинка» и поле картинки работают с распространёнными растровыми форматами: PNG, JPEG, BMP, GIF, а также с иконками ICO. Поддержка конкретного формата зависит от версии платформы, поэтому для совместимости надёжнее использовать PNG или JPEG.

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

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

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

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

Как вывести картинку в печатную форму (макет)?

В табличном макете создайте рисунок типа «Картинка» и при формировании в коде присвойте ему объект Картинка, созданный из двоичных данных: Рисунок.Картинка = Новый Картинка(ДвоичныеДанные). Данные предварительно извлеките из хранилища значения или файла на сервере.

Что лучше для фото товаров: свой реквизит или присоединённые файлы?

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

Итог

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

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