Разработка и Конфигурация · 11 мин
Как записать картинку в 1С: способы хранения и вывода изображений
Как записать картинку в 1С: хранилище значений, двоичные данные, реквизиты справочников, вывод на форму и в макет. Примеры кода, ошибки и проверка результата.
Задача записать картинку в 1С возникает в двух типовых ситуациях: пользователю нужно прикрепить фото товара или скан документа к элементу справочника, а разработчику — программно сохранить изображение в базе и потом показать его на форме или в печатном макете. В обоих случаях используется один и тот же механизм: картинка преобразуется в двоичные данные, упаковывается в объект «ХранилищеЗначения» и записывается в реквизит объекта.
Важно понимать, что 1С не хранит файлы «как файлы» внутри базы. Любое изображение — это набор байт, и платформа работает с ним через тип «ДвоичныеДанные». Поэтому схема всегда одинаковая: получить двоичные данные из файла или из буфера, поместить в хранилище значений, записать объект. Обратная операция — извлечь данные и либо вывести их на форму, либо сохранить во временный файл.
Ниже разобраны все рабочие способы: от интерактивного прикрепления картинки в типовых конфигурациях до программной записи через встроенный язык, вывода на форму и в макет, а также типичные ошибки, из-за которых картинка «пропадает» или база начинает стремительно расти.
Как 1С хранит изображения: хранилище значений и двоичные данные
Базовый механизм — тип «ХранилищеЗначения». Это контейнер, который сериализует любое значение (в том числе двоичные данные) и позволяет сохранить его в поле базы данных. Реквизиту объекта назначается тип «ХранилищеЗначения», и именно туда кладётся картинка.
Двоичные данные получают из файла конструктором Новый ДвоичныеДанные(ИмяФайла). Дальше они оборачиваются: Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)). Параметр сжатия необязателен, но для фотографий и сканов он заметно уменьшает объём занимаемого места.
В типовых конфигурациях (Управление торговлей, ERP, Бухгалтерия) уже есть готовая подсистема присоединенных файлов из Библиотеки стандартных подсистем. Там картинки хранятся не в самом товаре, а в отдельном справочнике присоединенных файлов со ссылкой на владельца — это правильный подход, который стоит повторять и в собственных разработках.
Как прикрепить картинку в типовой конфигурации без программирования
В конфигурациях на управляемых формах с БСП прикрепление выполняется штатно. Откройте карточку объекта (номенклатуры, контрагента, документа), найдите команду «Присоединенные файлы» или кнопку с изображением скрепки, нажмите «Добавить» и выберите файл. Для номенклатуры первый добавленный файл изображения обычно назначается основной картинкой и показывается в карточке.
Если команды «Присоединенные файлы» нет, проверьте настройки: в разделе администрирования должна быть включена функциональная опция хранения присоединенных файлов. В некоторых конфигурациях доступен выбор — хранить файлы в информационной базе или в томах на диске; этот параметр влияет на рост базы и скорость резервного копирования.
- 1Откройте карточку объекта (товар, контрагент, документ)
- 2Нажмите «Присоединенные файлы» или значок скрепки
- 3Выберите «Добавить из файла» и укажите изображение
- 4Для номенклатуры проверьте, что файл назначен основным изображением
- 5Запишите объект и убедитесь, что картинка отображается в карточке
Программная запись картинки в реквизит объекта
Когда требуется записать изображение кодом — при загрузке каталога товаров, обмене с сайтом, импорте сканов — используется прямая работа с объектом. Типовой фрагмент выглядит так:
ДвоичныеДанные = Новый ДвоичныеДанные("C:\Images\tovar1.jpg");
ТоварОбъект = СсылкаНаТовар.ПолучитьОбъект();
ТоварОбъект.ДанныеКартинки = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
ТоварОбъект.Записать();
Здесь «ДанныеКартинки» — реквизит справочника с типом «ХранилищеЗначения». Если реквизита нет, его нужно добавить в конфигураторе. Обратите внимание: запись выполняется через объект, а не через менеджер записи, и требует монопольных прав только в момент записи при конкурентном доступе — в многопользовательском режиме возможны конфликты блокировок, поэтому массовую загрузку лучше выполнять порциями с обработкой исключений.
Если картинка приходит извне не файлом, а строкой Base64 (например, из HTTP-сервиса или JSON), сначала выполняется декодирование: ДвоичныеДанные = Base64Значение(СтрокаBase64), дальше схема та же.
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
Объект.Картинка = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
Объект.Записать();Как вывести картинку на форму
На управляемой форме изображение выводится через реквизит формы типа «Строка», содержащий адрес во временном хранилище. Элемент формы — поле с видом «Поле картинки». Последовательность такая: извлечь двоичные данные из хранилища, поместить их во временное хранилище, присвоить полученный адрес реквизиту формы.
&НаСервере
Процедура ПоказатьКартинку()
Данные = Объект.Ссылка.ДанныеКартинки.Получить();
Если Данные <> Неопределено Тогда
АдресКартинки = ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры
Третий параметр ПоместитьВоВременноеХранилище — идентификатор формы — важен: он привязывает данные к времени жизни формы, и адрес не «протухнет» при обновлении. Без него картинка может исчезать после серверных вызовов. Для обычных форм (старые конфигурации) подход другой: там поле картинки связывается напрямую с реквизитом типа «ХранилищеЗначения» или значением типа «Картинка».
Вывод картинки в табличный документ и печатную форму
Для печатных форм картинка вставляется в макет. В макете табличного документа добавьте рисунок с типом «Картинка» и задайте ему имя. В коде область с рисунком получается из макета, после чего свойству «Картинка» рисунка присваивается объект «Картинка», созданный из двоичных данных:
Область = Макет.ПолучитьОбласть("Шапка");
Данные = Ссылка.ДанныеКартинки.Получить();
Если Данные <> Неопределено Тогда
Область.Рисунки.Логотип.Картинка = Новый Картинка(Данные);
КонецЕсли;
ТабДок.Вывести(Область);
Конструктор Новый Картинка(ДвоичныеДанные) сам определяет формат по содержимому. Поддерживаются распространённые растровые форматы — PNG, JPEG, BMP, GIF. Если данные повреждены или это не изображение, платформа выдаст ошибку именно на этом этапе, поэтому при массовой печати полезна проверка на Неопределено и оборачивание в попытку.
Ограничения, объём базы и альтернативные варианты хранения
Главный риск хранения картинок в базе — неуправляемый рост объёма. Сотни фотографий товаров в исходном разрешении быстро превращают базу в многогигабайтную, что удлиняет резервное копирование, обновление и выгрузку в dt. Перед записью изображения стоит уменьшать до разумного размера — для карточки товара обычно достаточно разрешения порядка 800–1000 пикселей по большей стороне.
Варианты хранения изображений
Просто и надёжно для небольшого числа картинок; при росте количества раздувает основную таблицу и замедляет выборки
Рекомендуемый вариант для типовых и доработанных конфигураций; файлы отделены от объектов, есть версионирование и права
Файлы лежат в файловой системе, в базе только ссылки; разгружает СУБД, но требует отдельного резервного копирования томов и настройки прав доступа
Подходит для интеграций с сайтом; в базе только URL, но при недоступности внешнего ресурса картинки не отобразятся
Для файлового варианта в типовых конфигурациях используется настройка «Хранить файлы в томах на диске» в параметрах работы с файлами. Помните: тома не попадают в выгрузку dt и в стандартный бэкап базы — их нужно копировать отдельно, иначе при восстановлении вы получите ссылки на несуществующие файлы.
Проверка результата и типичные ошибки
После записи убедитесь, что картинка действительно сохранилась: откройте объект в режиме предприятия и проверьте отображение, либо выполните обратное чтение — Получить() не должен вернуть Неопределено, а размер полученных двоичных данных должен быть больше нуля.
Как проверить результат
Получить() возвращает двоичные данные ненулевого размера
Возвращается Неопределено — запись не выполнилась или реквизит не тот
Картинка видна и не пропадает после обновления формы
Пустое поле — адрес временного хранилища создан без привязки к форме
Изображение выводится в табличном документе
Ошибка при создании Картинки — данные повреждены или формат не поддерживается
Ещё одна частая ситуация — картинка записана, но не видна в списке или карточке типовой конфигурации. Причина обычно в том, что файл добавлен в присоединенные, но не помечен как основное изображение, либо у пользователя нет прав на справочник присоединенных файлов. Проверяйте и то, и другое.
При загрузке каталога изображений из папки удобно сопоставлять файлы с товарами по имени файла, совпадающему с артикулом или кодом. Перед массовой загрузкой сделайте отчёт о файлах, для которых не нашлось соответствия, — это сэкономит часы разбора пропущенных позиций.
Частые вопросы
Можно ли записать картинку в 1С без изменения конфигурации?
Да, если конфигурация содержит подсистему присоединенных файлов (большинство типовых на БСП). Картинка прикрепляется через интерфейс без доработок. Если такой подсистемы нет и реквизита под изображение тоже, потребуется добавление реквизита в конфигураторе.
Какие форматы изображений поддерживает платформа?
Объект «Картинка» работает с распространёнными растровыми форматами: PNG, JPEG, BMP, GIF и некоторыми другими. Для хранения формат не важен — двоичные данные сохранятся любые, — но для вывода на форму и в макет файл должен быть читаемым изображением.
Как извлечь картинку из базы обратно в файл?
Получите двоичные данные методом Получить() из хранилища значений и вызовите у них метод Записать(ИмяФайла). Расширение файла должно соответствовать исходному формату, поэтому его удобно хранить в отдельном реквизите рядом с данными.
Почему база резко выросла после загрузки фотографий?
Изображения сохраняются в исходном размере. Фотография с камеры может занимать несколько мегабайт, и тысяча таких файлов добавляет гигабайты. Решение — уменьшать изображения перед записью до разумного разрешения и использовать сжатие данных в хранилище значений.
Как показать картинку в динамическом списке?
Напрямую из хранилища значений в динамическом списке картинку вывести нельзя. Обычно делают отдельный реквизит с адресом временного хранилища, заполняемый при получении данных строки, либо используют пиктограммы из библиотеки картинок платформы для служебных индикаторов.
Что лучше для обмена с сайтом — Base64 или двоичные данные?
При передаче через JSON или XML картинку кодируют в Base64, на стороне 1С декодируют функцией Base64Значение и далее работают как с обычными двоичными данными. Учтите, что Base64 увеличивает объём передаваемых данных примерно на треть.
Что важно запомнить
Картинка в 1С — это двоичные данные в хранилище значений. Запись: ДвоичныеДанные → ХранилищеЗначения → реквизит объекта. Вывод на форму — через адрес временного хранилища, в макет — через объект Картинка. Контролируйте размер изображений и тестируйте массовую загрузку на копии базы.