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