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

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

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

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

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

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

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

Как добавить картинку в типовой конфигурации без программирования

В конфигурациях на Библиотеке стандартных подсистем (УТ 11, ERP, КА, БП 3.0) у большинства справочников и документов есть механизм присоединённых файлов. Откройте карточку номенклатуры, контрагента или сотрудника и найдите ссылку «Присоединенные файлы», кнопку со скрепкой или область предпросмотра изображения. Нажмите «Добавить» → «Файл с диска», выберите PNG или JPG — изображение сохранится и появится в карточке.

Для номенклатуры в УТ 11 и ERP первое добавленное изображение обычно назначается основным и показывается в списке товаров и подборе. Если картинок несколько, основную можно сменить в списке присоединённых файлов. Учтите: файлы хранятся либо в информационной базе, либо в томах на диске — это настраивается в разделе «Настройки работы с файлами».

Порядок действий в типовой конфигурации
  1. 1
    Откройте карточку объекта (номенклатура, контрагент, сотрудник)
  2. 2
    Найдите кнопку «Присоединенные файлы», скрепку или область изображения
  3. 3
    Нажмите «Добавить» → «Файл с диска» и выберите изображение
  4. 4
    Проверьте, что картинка отобразилась в карточке
  5. 5
    При необходимости назначьте изображение основным

Как программно загрузить картинку из файла

При доработке конфигурации загрузка выполняется в три этапа: показать пользователю диалог выбора файла, поместить файл во временное хранилище, сохранить данные в базу. В тонком и веб-клиенте обязательна асинхронная модель — синхронные вызовы ПоместитьФайл без расширения работы с файлами не сработают.

Типовой фрагмент кода в клиентской процедуре формы:

&НаКлиенте

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

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

Диалог.Фильтр = "Изображения (.png;.jpg)|.png;.jpg";

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

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

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

&НаКлиенте

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

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

АдресКартинки = АдресХранилища; // реквизит формы для отображения

КонецЕсли;

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

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

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

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

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

На сервере сохранение выглядит так:

&НаСервере

Процедура СохранитьКартинкуНаСервере()

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

ТекущийОбъект = РеквизитФормыВЗначение("Объект");

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

ТекущийОбъект.Записать();

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

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

Как вывести картинку в форму и печатный макет

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

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

Область = Макет.ПолучитьОбласть("Шапка");

Область.Рисунки.Логотип.Картинка = Новый Картинка(ДвоичныеДанныеЛоготипа);

ТабличныйДокумент.Вывести(Область);

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

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

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

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

Картинка видна сразу после выбора файла и после повторного открытия карточки

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

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

Печатная форма
Норма

Логотип выводится в предпросмотре и при печати

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

Рамка рисунка есть, изображения нет — не присвоено свойство Картинка

Производительность
Норма

Список справочника открывается без задержек

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

Заметные паузы — изображения хранятся в основной таблице справочника

Как получить картинку из интернета или по ссылке

Иногда изображение нужно получить не из файла, а по URL — например, при обмене с сайтом или загрузке фото товаров от поставщика. На сервере 1С это делается через HTTP-соединение:

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

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

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

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

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

КонецЕсли;

Для HTTPS укажите защищённое соединение через Новый ЗащищенноеСоединениеOpenSSL. Полученные двоичные данные дальше обрабатываются точно так же: помещаются в хранилище значений или временное хранилище. Учитывайте, что сервер 1С должен иметь доступ в интернет, а при работе через прокси его параметры задаются в конструкторе HTTP-соединения.

Типичные ошибки и ограничения

Чаще всего картинка «не загружается» из-за пяти причин: синхронный вызов помещения файла в тонком клиенте, потеря адреса временного хранилища между вызовами сервера, отсутствие связи поля формы с реквизитом, попытка передать двоичные данные с клиента на сервер напрямую и неподдерживаемый формат файла. Объект Картинка корректно работает с BMP, PNG, JPEG, GIF и TIFF; экзотические форматы лучше конвертировать заранее.

Отдельная группа проблем — права и окружение. Пользователю нужны права на запись объекта и на работу с присоединёнными файлами, а при загрузке по HTTP — сетевой доступ с сервера 1С. В файловой базе расширение работы с файлами в веб-клиенте требует отдельной установки в браузере.

Типичные ошибки
01
Использование ПоместитьФайл в тонком клиенте без асинхронного вызова — код молча не выполняется
02
Сохранение адреса временного хранилища в базу вместо двоичных данных — после перезапуска картинка пропадает
03
Хранение крупных изображений в реквизите справочника — раздувание базы и медленные выборки
04
Загрузка по HTTP без проверки кода ответа — в базе оказывается HTML-страница ошибки
05
Отсутствие сжатия в ХранилищеЗначения — лишний расход места при большом числе файлов

Ответы на частые вопросы

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

Объект «Картинка» штатно работает с BMP, PNG, JPEG, GIF и TIFF. Для других форматов (WebP, SVG) потребуется предварительная конвертация внешними средствами или компонентами.

Можно ли хранить картинки вне базы данных?

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

Почему картинка видна сразу после загрузки, но пропадает после записи?

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

Как вывести картинку в списке справочника?

Добавьте в форму списка колонку с видом «Поле картинки» и заполните её при получении данных на сервере, помещая изображения во временное хранилище. Для больших списков это замедляет открытие, поэтому часто ограничиваются миниатюрами уменьшенного размера.

Работает ли загрузка картинок в веб-клиенте?

Да, через асинхронные методы «НачатьПомещениеФайлаВоВременноеХранилище». Для полноценной работы с файловой системой в браузере может потребоваться установка расширения работы с файлами, которое платформа предложит автоматически.

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

Встроенных средств ресайза в платформе нет. Используют внешние компоненты, вызов графических утилит на сервере или обработку через COM-объекты. Практичная альтернатива — заранее готовить изображения нужного размера до загрузки.

Итог

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

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