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

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

Как поместить картинку на форму 1С

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

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

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

Выбор источника картинки

Перед добавлением элемента на форму определите, откуда будет браться изображение. Это определяет весь код загрузки и способ хранения данных.

Основные варианты источников:

  • Общая картинка конфигурации — статическое изображение, зашитое в конфигурацию (логотип, иконка). Подходит для неизменных картинок, доступно всем пользователям без дополнительных прав.
  • Картинка из библиотеки картинок — стандартные пиктограммы платформы (например, БиблиотекаКартинок.Информация).
  • Файл на диске или на сервере — временная загрузка, например при импорте фото товара.
  • Хранилище значений в базе данных — реквизит типа «ХранилищеЗначения» с двоичными данными. Основной способ для фотографий товаров, сотрудников, сканов документов.
Маршрут решения

Как выбрать источник

Картинка одна на всю конфигурацию и не меняется пользователямиИспользуйте общую картинку в ветке «Общие — Общие картинки» конфигуратора
Картинка индивидуальна для каждого объекта (фото товара, сотрудника)Храните двоичные данные в реквизите типа «ХранилищеЗначения» или в регистре сведений
Картинка загружается пользователем разовоИспользуйте диалог выбора файла и временное хранилище

Картинка на обычной форме

Обычные формы встречаются в старых конфигурациях и в режиме обычного приложения. Здесь всё проще: элемент формы напрямую хранит значение типа «Картинка».

Порядок действий в конфигураторе:

  1. Откройте форму объекта, в меню выберите «Форма — Вставить элемент управления — Поле картинки».
  2. Разместите элемент на форме и задайте ему имя, например «ПолеКартинки».
  3. В свойствах проверьте, что тип значения — «Картинка», а рамка и размер настроены под макет.
  4. В модуле формы присвойте элементу картинку.
// Загрузка из общей картинки конфигурации

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

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

ЭлементыФормы.ПолеКартинки.Картинка = Новый Картинка("C:\Images\logo.png");

// Загрузка из хранилища значений

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

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

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

КонецЕсли;

Обратите внимание: конструктор Новый Картинка() принимает либо путь к файлу, либо двоичные данные. Если хранилище пустое, метод Получить() вернёт Неопределено, и присваивание нужно обернуть в проверку, иначе форма выдаст ошибку.

Картинка на управляемой форме через временное хранилище

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

Типовая схема состоит из трёх шагов: создать реквизит формы, добавить элемент формы, заполнить реквизит адресом картинки.

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

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

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

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

Возврат;

КонецЕсли;

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

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

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

Картинка через навигационную ссылку

Если картинка хранится как реквизит объекта с двоичными данными (например, «ФайлКартинки» типа «ХранилищеЗначения» в справочнике «Номенклатура»), можно не использовать временное хранилище вовсе. Платформа умеет отдавать данные по навигационной ссылке.

В этом случае реквизиту формы присваивается строка вида:

АдресКартинки = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ХранилищеКартинки");

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

Загрузка картинки с диска по кнопке пользователя

Частый сценарий: пользователь нажимает «Загрузить фото», выбирает файл, картинка появляется на форме и сохраняется в базу. В тонком клиенте файловые операции выполняются асинхронно через НачатьПомещениеФайла.

&НаКлиенте

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

Оповещение = Новый ОписаниеОповещения("ЗагрузитьКартинкуЗавершение", ЭтотОбъект);

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

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

&НаКлиенте

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

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

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

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

КонецЕсли;

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

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

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

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

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

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

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

Открытие существующего объекта
Норма

Картинка видна сразу, без нажатий на форму

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

Пустое поле или перечёркнутый значок

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

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

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

После записи картинка пропадает

Объект без картинки
Норма

Форма открывается без ошибок, поле пустое

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

Ошибка обращения к хранилищу

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

Ограничения и рекомендации по производительности

Форматы, которые платформа гарантированно отображает в поле картинки: PNG, JPEG, GIF, BMP, TIFF, ICO. Для фотографий используйте JPEG, для логотипов с прозрачностью — PNG. Файлы SVG в поле картинки обычных версий платформы напрямую не отображаются.

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

Итог

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

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

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

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

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

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

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

Как вывести картинку на форму, если она лежит в присоединённых файлах (БСП)?

В конфигурациях на Библиотеке стандартных подсистем используйте функции работы с присоединёнными файлами: получите двоичные данные файла через РаботаСФайлами.ДвоичныеДанныеФайла и поместите их во временное хранилище, далее — как обычную картинку.

Ошибка «Несоответствие типов» при присваивании картинки реквизиту формы — в чём причина?

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

Как очистить картинку на форме?

Присвойте реквизиту пустую строку: АдресКартинки = "". Поле картинки очистится. При необходимости также очистите реквизит объекта с хранилищем значений и запишите объект.

Работает ли поле картинки в веб-клиенте?

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