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

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

Как записать картинку в 1С: способы хранения и вывода изображений

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

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

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

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

Как 1С хранит изображения: хранилище значений и двоичные данные

Базовый механизм — тип «ХранилищеЗначения». Это контейнер, который сериализует любое значение (в том числе двоичные данные) и позволяет сохранить его в поле базы данных. Реквизиту объекта назначается тип «ХранилищеЗначения», и именно туда кладётся картинка.

Двоичные данные получают из файла конструктором Новый ДвоичныеДанные(ИмяФайла). Дальше они оборачиваются: Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)). Параметр сжатия необязателен, но для фотографий и сканов он заметно уменьшает объём занимаемого места.

В типовых конфигурациях (Управление торговлей, ERP, Бухгалтерия) уже есть готовая подсистема присоединенных файлов из Библиотеки стандартных подсистем. Там картинки хранятся не в самом товаре, а в отдельном справочнике присоединенных файлов со ссылкой на владельца — это правильный подход, который стоит повторять и в собственных разработках.

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

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

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

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

Программная запись картинки в реквизит объекта

Когда требуется записать изображение кодом — при загрузке каталога товаров, обмене с сайтом, импорте сканов — используется прямая работа с объектом. Типовой фрагмент выглядит так:

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

ТоварОбъект = СсылкаНаТовар.ПолучитьОбъект();

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

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

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

Если картинка приходит извне не файлом, а строкой Base64 (например, из HTTP-сервиса или JSON), сначала выполняется декодирование: ДвоичныеДанные = Base64Значение(СтрокаBase64), дальше схема та же.

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

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

На управляемой форме изображение выводится через реквизит формы типа «Строка», содержащий адрес во временном хранилище. Элемент формы — поле с видом «Поле картинки». Последовательность такая: извлечь двоичные данные из хранилища, поместить их во временное хранилище, присвоить полученный адрес реквизиту формы.

&НаСервере

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

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

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

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

КонецЕсли;

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

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

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

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

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

Данные = Ссылка.ДанныеКартинки.Получить();

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

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

КонецЕсли;

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

Конструктор Новый Картинка(ДвоичныеДанные) сам определяет формат по содержимому. Поддерживаются распространённые растровые форматы — PNG, JPEG, BMP, GIF. Если данные повреждены или это не изображение, платформа выдаст ошибку именно на этом этапе, поэтому при массовой печати полезна проверка на Неопределено и оборачивание в попытку.

Ограничения, объём базы и альтернативные варианты хранения

Главный риск хранения картинок в базе — неуправляемый рост объёма. Сотни фотографий товаров в исходном разрешении быстро превращают базу в многогигабайтную, что удлиняет резервное копирование, обновление и выгрузку в dt. Перед записью изображения стоит уменьшать до разумного размера — для карточки товара обычно достаточно разрешения порядка 800–1000 пикселей по большей стороне.

Варианты хранения изображений

Хранилище значений в реквизите объекта

Просто и надёжно для небольшого числа картинок; при росте количества раздувает основную таблицу и замедляет выборки

Справочник присоединенных файлов (БСП)

Рекомендуемый вариант для типовых и доработанных конфигураций; файлы отделены от объектов, есть версионирование и права

Тома на диске

Файлы лежат в файловой системе, в базе только ссылки; разгружает СУБД, но требует отдельного резервного копирования томов и настройки прав доступа

Внешнее хранилище / HTTP-ссылки

Подходит для интеграций с сайтом; в базе только URL, но при недоступности внешнего ресурса картинки не отобразятся

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

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

После записи убедитесь, что картинка действительно сохранилась: откройте объект в режиме предприятия и проверьте отображение, либо выполните обратное чтение — Получить() не должен вернуть Неопределено, а размер полученных двоичных данных должен быть больше нуля.

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

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

Чтение хранилища
Норма

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

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

Возвращается Неопределено — запись не выполнилась или реквизит не тот

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

Картинка видна и не пропадает после обновления формы

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

Пустое поле — адрес временного хранилища создан без привязки к форме

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

Изображение выводится в табличном документе

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

Ошибка при создании Картинки — данные повреждены или формат не поддерживается

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

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

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

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

Можно ли записать картинку в 1С без изменения конфигурации?

Да, если конфигурация содержит подсистему присоединенных файлов (большинство типовых на БСП). Картинка прикрепляется через интерфейс без доработок. Если такой подсистемы нет и реквизита под изображение тоже, потребуется добавление реквизита в конфигураторе.

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

Объект «Картинка» работает с распространёнными растровыми форматами: PNG, JPEG, BMP, GIF и некоторыми другими. Для хранения формат не важен — двоичные данные сохранятся любые, — но для вывода на форму и в макет файл должен быть читаемым изображением.

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

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

Почему база резко выросла после загрузки фотографий?

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

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

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

Что лучше для обмена с сайтом — Base64 или двоичные данные?

При передаче через JSON или XML картинку кодируют в Base64, на стороне 1С декодируют функцией Base64Значение и далее работают как с обычными двоичными данными. Учтите, что Base64 увеличивает объём передаваемых данных примерно на треть.

Итог

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

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