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

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

Как программно установить картинку в 1С: полное руководство

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

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

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

Объект «Картинка» и двоичные данные: основа всех способов

В платформе 1С изображение представлено объектом Картинка. Его можно создать из файла на диске или из двоичных данных, полученных любым способом — из HTTP-ответа, из хранилища значения, из архива. Поддерживаются распространённые форматы: PNG, JPEG, GIF, BMP и другие, которые распознаёт платформа.

// Из файла

Картинка = Новый Картинка("C:\Images\product.png");

// Из двоичных данных

ДвоичныеДанные = Новый ДвоичныеДанные("C:\Images\product.png");

Картинка = Новый Картинка(ДвоичныеДанные);

Второй параметр конструктора — признак «не проверять формат». По умолчанию платформа проверяет, что данные действительно являются изображением. Если передать Ложь, проверка отключается, но тогда ответственность за корректность данных лежит на разработчике: повреждённый файл вызовет ошибку уже при отображении.

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

Как установить картинку в элемент управляемой формы

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

&НаСервере

Процедура УстановитьКартинкуНаСервере(ПутьКФайлу)

ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);

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

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

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

Выбор файла на клиенте без модальных окон

В тонком и веб-клиенте модальные диалоги запрещены, поэтому выбор файла выполняется асинхронно через НачатьПомещениеФайла():

&НаКлиенте

Процедура ВыбратьКартинку(Команда)

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

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

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

&НаКлиенте

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

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

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

КонецЕсли;

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

Порядок установки картинки на форму
  1. 1
    Добавьте на форму строковый реквизит, например «АдресКартинки»
  2. 2
    Создайте элемент «Поле картинки» и привяжите его к реквизиту
  3. 3
    Поместите двоичные данные файла во временное хранилище с привязкой к УникальныйИдентификаторФормы
  4. 4
    Присвойте полученный адрес реквизиту формы
  5. 5
    Откройте форму и убедитесь, что изображение отображается

Как сохранить картинку в реквизит объекта

Для постоянного хранения изображений в базе используют реквизит типа ХранилищеЗначения. В него помещают двоичные данные или сам объект картинки через Новый ХранилищеЗначения(). Типичный сценарий — фото номенклатуры или подпись сотрудника.

ОбъектТовара = Справочники.Номенклатура.НайтиПоКоду("000001").ПолучитьОбъект();

ДвоичныеДанные = Новый ДвоичныеДанные("C:\Images\product.png");

ОбъектТовара.ФайлКартинки = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));

ОбъектТовара.Записать();

Обратный путь — чтение картинки из реквизита и вывод на форму:

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

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

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

КонецЕсли;

В типовых конфигурациях (УТ, ERP, БП) картинки часто хранятся не в самом объекте, а в присоединённых файлах через подсистему БСП «Работа с файлами». Там вместо прямой записи в реквизит правильнее использовать программный интерфейс РаботаСФайлами.ДобавитьФайл() — тогда файл появится в стандартном списке присоединённых, будет доступен пользователю и попадёт в обмены.

Как вставить картинку в табличный документ и печатную форму

В макетах и табличных документах картинка вставляется через коллекцию Рисунки. Это стандартный способ вывести логотип, штрихкод или печать в печатной форме:

Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);

Рисунок.Картинка = Новый Картинка(ДвоичныеДанные);

Рисунок.Расположить(ТабДок.Область("R2C2:R8C5"));

Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;

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

При программном добавлении следите за размером области: если область меньше изображения, картинка обрежется или вытеснит соседние ячейки. Свойство РазмерКартинки = РазмерКартинки.Пропорционально сохраняет пропорции и вписывает изображение в заданные границы.

bsl
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Новый Картинка(ДвоичныеДанные);
Рисунок.Расположить(ТабДок.Область("R2C2:R8C5"));
Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;

Обычные формы и поле «Картинка» в реквизитах

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

КартинкаРеквизит = Новый Картинка("C:\Images\photo.jpg");

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

Установка картинки из интернета и из хранилища значения

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

Соединение = Новый HTTPСоединение("example.com");

Запрос = Новый HTTPЗапрос("/images/item.png");

Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда

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

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

КонецЕсли;

Обязательно проверяйте код ответа и тип содержимого: при ошибке сервера в теле ответа может оказаться HTML-страница, и попытка создать из неё картинку завершится исключением. Для HTTPS-соединений дополнительно потребуется объект ЗащищенноеСоединениеOpenSSL.

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

Проверка результата и ограничения

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

Дополнительный способ диагностики — проверить размер двоичных данных: ДвоичныеДанные.Размер(). Нулевой размер означает, что файл не прочитан или хранилище значения пустое. Также полезно убедиться, что формат файла поддерживается: экзотические форматы вроде WebP старые версии платформы могут не распознать.

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

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

Адрес во временном хранилище
Норма

Строка вида e1cib/tempstorage/... заполнена

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

Пустая строка — данные не помещены или хранилище очищено

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

Получить() возвращает двоичные данные с размером больше нуля

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

Неопределено или размер 0 — запись не выполнена

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

Поле картинки показывает изображение после переоткрытия

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

Пустое поле или стандартная заглушка

Итог

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

В управляемых формах картинка отображается через адрес временного хранилища, в базе хранится как ХранилищеЗначения с двоичными данными, в табличный документ вставляется через коллекцию Рисунки. Всегда проверяйте данные на Неопределено и сжимайте большие изображения перед записью.

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

Как установить картинку из буфера обмена?

Штатного метода чтения изображения из буфера обмена на сервере нет. В толстом клиенте можно использовать COM-объекты или внешние компоненты, но в тонком и веб-клиенте это недоступно. Практичная альтернатива — сохранить изображение в файл и загрузить через НачатьПомещениеФайла().

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

Да. Сохраните изображение-заглушку в макет конфигурации типа «Двоичные данные» или «Картинка», затем при отсутствии фото получайте его: ПолучитьОбщийМакет("ЗаглушкаФото") и помещайте во временное хранилище тем же способом.

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

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

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

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

Как установить картинку в команду или кнопку?

Для команд и кнопок используется библиотека картинок: в свойстве «Картинка» выбирается стандартная картинка или картинка из общей картинки конфигурации. Программно установить можно через свойство Картинка элемента формы: Элементы.Кнопка.Картинка = БиблиотекаКартинок.СохранитьФайл.

Как выгрузить картинку из базы в файл?

Получите двоичные данные из хранилища значения методом Получить(), затем вызовите ДвоичныеДанные.Записать("путь к файлу"). На клиенте в асинхронном режиме используйте НачатьПолучениеФайла() с адресом временного хранилища.