Разработка и Конфигурация · 11 мин
Как программно установить картинку в 1С: полное руководство
Как программно установить картинку в 1С: помещение файла во временное хранилище, запись в реквизит объекта, вывод в форму и табличный документ. Примеры кода и типичные ошибки.
Задача программно установить картинку в 1С возникает постоянно: нужно загрузить фото товара из файла, показать логотип в печатной форме, вывести изображение на управляемую форму или сохранить картинку в реквизит справочника. Способ решения зависит от того, где хранится исходное изображение и куда его нужно поместить — в базу данных, в элемент формы или в табличный документ.
Все варианты сводятся к трём базовым операциям: получить объект Картинка из файла или двоичных данных, сохранить его в нужное место (реквизит типа «ХранилищеЗначения», временное хранилище, табличный документ) и отобразить результат пользователю. Ниже разобраны рабочие примеры для управляемых и обычных форм, а также ограничения, о которых часто забывают.
Объект «Картинка» и двоичные данные: основа всех способов
В платформе 1С изображение представлено объектом Картинка. Его можно создать из файла на диске или из двоичных данных, полученных любым способом — из HTTP-ответа, из хранилища значения, из архива. Поддерживаются распространённые форматы: PNG, JPEG, GIF, BMP и другие, которые распознаёт платформа.
// Из файла
Картинка = Новый Картинка("C:\Images\product.png");
// Из двоичных данных
ДвоичныеДанные = Новый ДвоичныеДанные("C:\Images\product.png");
Картинка = Новый Картинка(ДвоичныеДанные);
Второй параметр конструктора — признак «не проверять формат». По умолчанию платформа проверяет, что данные действительно являются изображением. Если передать Ложь, проверка отключается, но тогда ответственность за корректность данных лежит на разработчике: повреждённый файл вызовет ошибку уже при отображении.
Важно понимать разницу: ДвоичныеДанные — это просто массив байт, а Картинка — типизированный объект, который умеет отображаться в интерфейсе и преобразовывать форматы через метод Преобразовать(). Для хранения в базе обычно сохраняют именно двоичные данные, а объект картинки создают в момент показа.
Как установить картинку в элемент управляемой формы
Поле картинки на управляемой форме не принимает объект Картинка напрямую — оно работает с адресом во временном хранилище. Поэтому последовательность всегда одинаковая: поместить данные в хранилище, получить адрес, присвоить адрес реквизиту формы, связанному с элементом «Поле картинки».
&НаСервере
Процедура УстановитьКартинкуНаСервере(ПутьКФайлу)
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);
КонецПроцедуры
Здесь АдресКартинки — строковый реквизит формы, а элемент формы «Поле картинки» привязан к нему через свойство «ПутьКДанным». Второй параметр ПоместитьВоВременноеХранилище() привязывает данные к времени жизни формы: без него хранилище очистится после завершения серверного вызова, и картинка пропадёт.
Выбор файла на клиенте без модальных окон
В тонком и веб-клиенте модальные диалоги запрещены, поэтому выбор файла выполняется асинхронно через НачатьПомещениеФайла():
&НаКлиенте
Процедура ВыбратьКартинку(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения, , , Истина, УникальныйИдентификаторФормы);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт
Если Результат Тогда
АдресКартинки = Адрес;
КонецЕсли;
КонецПроцедуры
- 1Добавьте на форму строковый реквизит, например «АдресКартинки»
- 2Создайте элемент «Поле картинки» и привяжите его к реквизиту
- 3Поместите двоичные данные файла во временное хранилище с привязкой к УникальныйИдентификаторФормы
- 4Присвойте полученный адрес реквизиту формы
- 5Откройте форму и убедитесь, что изображение отображается
Как сохранить картинку в реквизит объекта
Для постоянного хранения изображений в базе используют реквизит типа ХранилищеЗначения. В него помещают двоичные данные или сам объект картинки через Новый ХранилищеЗначения(). Типичный сценарий — фото номенклатуры или подпись сотрудника.
ОбъектТовара = Справочники.Номенклатура.НайтиПоКоду("000001").ПолучитьОбъект();
ДвоичныеДанные = Новый ДвоичныеДанные("C:\Images\product.png");
ОбъектТовара.ФайлКартинки = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
ОбъектТовара.Записать();
Обратный путь — чтение картинки из реквизита и вывод на форму:
ДвоичныеДанные = Объект.ФайлКартинки.Получить();
Если ДвоичныеДанные <> Неопределено Тогда
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);
КонецЕсли;
В типовых конфигурациях (УТ, ERP, БП) картинки часто хранятся не в самом объекте, а в присоединённых файлах через подсистему БСП «Работа с файлами». Там вместо прямой записи в реквизит правильнее использовать программный интерфейс РаботаСФайлами.ДобавитьФайл() — тогда файл появится в стандартном списке присоединённых, будет доступен пользователю и попадёт в обмены.
Как вставить картинку в табличный документ и печатную форму
В макетах и табличных документах картинка вставляется через коллекцию Рисунки. Это стандартный способ вывести логотип, штрихкод или печать в печатной форме:
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Новый Картинка(ДвоичныеДанные);
Рисунок.Расположить(ТабДок.Область("R2C2:R8C5"));
Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
Если картинка постоянная (логотип компании), её проще заранее добавить в макет через конструктор: в режиме конфигуратора открыть макет, вставить рисунок и задать ему имя. Тогда в коде достаточно заполнить данные, и никакой программной вставки не потребуется.
При программном добавлении следите за размером области: если область меньше изображения, картинка обрежется или вытеснит соседние ячейки. Свойство РазмерКартинки = РазмерКартинки.Пропорционально сохраняет пропорции и вписывает изображение в заданные границы.
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Новый Картинка(ДвоичныеДанные);
Рисунок.Расположить(ТабДок.Область("R2C2:R8C5"));
Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;Обычные формы и поле «Картинка» в реквизитах
В обычных (неуправляемых) формах всё проще: элемент «Поле картинки» может быть связан напрямую с реквизитом типа Картинка или ХранилищеЗначения, и временное хранилище не нужно. Достаточно присвоить значение реквизиту формы:
КартинкаРеквизит = Новый Картинка("C:\Images\photo.jpg");
Кроме того, в обычных формах доступен метод ВыбратьИзображение() и диалог выбора файла в модальном режиме. Если конфигурация ещё работает на обычных формах, код переносить не нужно — но при миграции на управляемый интерфейс всю логику придётся переписать на асинхронные вызовы.
Установка картинки из интернета и из хранилища значения
Частый сценарий — загрузить изображение по URL, например из каталога поставщика. Данные получают через HTTP-соединение в виде двоичных данных, а дальше работают стандартно:
Соединение = Новый HTTPСоединение("example.com");
Запрос = Новый HTTPЗапрос("/images/item.png");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);
КонецЕсли;
Обязательно проверяйте код ответа и тип содержимого: при ошибке сервера в теле ответа может оказаться HTML-страница, и попытка создать из неё картинку завершится исключением. Для HTTPS-соединений дополнительно потребуется объект ЗащищенноеСоединениеOpenSSL.
Проверка результата и ограничения
После установки картинки проверьте три вещи: изображение видно в форме сразу после открытия, оно сохраняется в базе после записи объекта и корректно выводится в печатной форме. Если картинка не отображается, первым делом смотрите, не пуст ли адрес хранилища и не очищено ли оно.
Дополнительный способ диагностики — проверить размер двоичных данных: ДвоичныеДанные.Размер(). Нулевой размер означает, что файл не прочитан или хранилище значения пустое. Также полезно убедиться, что формат файла поддерживается: экзотические форматы вроде WebP старые версии платформы могут не распознать.
Как проверить результат
Строка вида e1cib/tempstorage/... заполнена
Пустая строка — данные не помещены или хранилище очищено
Получить() возвращает двоичные данные с размером больше нуля
Неопределено или размер 0 — запись не выполнена
Поле картинки показывает изображение после переоткрытия
Пустое поле или стандартная заглушка
Что важно запомнить
В управляемых формах картинка отображается через адрес временного хранилища, в базе хранится как ХранилищеЗначения с двоичными данными, в табличный документ вставляется через коллекцию Рисунки. Всегда проверяйте данные на Неопределено и сжимайте большие изображения перед записью.
Частые вопросы
Как установить картинку из буфера обмена?
Штатного метода чтения изображения из буфера обмена на сервере нет. В толстом клиенте можно использовать COM-объекты или внешние компоненты, но в тонком и веб-клиенте это недоступно. Практичная альтернатива — сохранить изображение в файл и загрузить через НачатьПомещениеФайла().
Можно ли установить картинку по умолчанию, если фото не задано?
Да. Сохраните изображение-заглушку в макет конфигурации типа «Двоичные данные» или «Картинка», затем при отсутствии фото получайте его: ПолучитьОбщийМакет("ЗаглушкаФото") и помещайте во временное хранилище тем же способом.
Как изменить размер картинки перед сохранением?
Объект Картинка имеет метод Преобразовать() для смены формата, но не масштабирования. Для уменьшения размера используют внешние средства: команду на сервере через сторонние утилиты, внешние компоненты обработки изображений или предварительную обработку файла до загрузки в 1С.
Почему картинка отображается в тонком клиенте, но не в веб-клиенте?
Чаще всего причина в том, что файл читается на клиенте, а код выполняется в контексте, где путь недоступен, либо хранилище очищается между вызовами. Убедитесь, что данные помещаются в хранилище с привязкой к УникальныйИдентификаторФормы, а чтение файла выполняется через асинхронные методы помещения файла.
Как установить картинку в команду или кнопку?
Для команд и кнопок используется библиотека картинок: в свойстве «Картинка» выбирается стандартная картинка или картинка из общей картинки конфигурации. Программно установить можно через свойство Картинка элемента формы: Элементы.Кнопка.Картинка = БиблиотекаКартинок.СохранитьФайл.
Как выгрузить картинку из базы в файл?
Получите двоичные данные из хранилища значения методом Получить(), затем вызовите ДвоичныеДанные.Записать("путь к файлу"). На клиенте в асинхронном режиме используйте НачатьПолучениеФайла() с адресом временного хранилища.