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

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

Как сохранить картинку в 1С

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

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

В типовых конфигурациях (Управление торговлей, ERP, Бухгалтерия, ЗУП) уже встроен механизм хранения изображений, и пользователю достаточно нажать пару кнопок. Разработчику же приходится работать с объектами ДвоичныеДанные, Картинка и временным хранилищем. Ниже разобраны оба уровня: как действовать пользователю в готовой конфигурации и как писать код, который надёжно сохраняет и извлекает изображения.

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

Определяем, где будет храниться картинка

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

Второй вариант — механизм присоединённых файлов из Библиотеки стандартных подсистем (БСП). Файлы могут храниться как в базе, так и в томах на диске — это настраивается в разделе администрирования. Именно этот механизм используется в типовых конфигурациях для картинок номенклатуры, фото сотрудников и сканов документов.

Третий вариант — временное хранилище. Оно живёт только в рамках сеанса или вызова сервера и предназначено для передачи данных между клиентом и сервером, а не для постоянного хранения. Частая ошибка новичков — «сохранить» картинку во временное хранилище и ожидать, что она переживёт перезапуск сеанса.

Сравнение вариантов хранения

ХранилищеЗначения в реквизите

Подходит для одной-двух картинок на объект (логотип, печать). Увеличивает размер базы, сложнее управлять несколькими файлами.

Присоединённые файлы (БСП)

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

Временное хранилище

Только для передачи данных между клиентом и сервером в рамках сеанса. Не является постоянным хранилищем.

Как пользователю сохранить картинку в типовой конфигурации

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

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

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

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

Ограничения по форматам и размеру

1С штатно работает с распространёнными растровыми форматами: PNG, JPEG, BMP, GIF. Проблемы чаще всего возникают с экзотическими форматами (например, WebP в старых версиях платформы) и с очень большими файлами — фотография с камеры весом в десятки мегабайт замедлит открытие карточки и раздует базу. Практическая рекомендация — заранее уменьшать изображения до разумного разрешения, достаточного для экрана и печати.

Как разработчику сохранить картинку программно

Базовый сценарий: файл с диска нужно записать в реквизит объекта типа ХранилищеЗначения. Сначала файл преобразуется в двоичные данные, затем они помещаются в хранилище значений, и объект записывается.

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

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

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

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

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

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

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

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

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

Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда

ДвоичныеДанные.Записать("C:\Export\image.png");

КонецЕсли;

Проверка типа обязательна: если в хранилище лежал объект Картинка, а не двоичные данные, метод Записать() у него отсутствует. В этом случае сначала получите двоичные данные через Картинка.ПолучитьДвоичныеДанные() — либо храните изначально именно двоичные данные, чтобы не гадать при выгрузке.

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

Картинки в печатных формах и отчётах

Чтобы изображение попало в печатную форму, в макете табличного документа добавляется область с картинкой, а в коде при формировании ей присваивается значение. Для табличного документа используется коллекция Рисунки: у нужного рисунка свойству Картинка присваивается объект Картинка, извлечённый из хранилища.

Рисунок = ТабДок.Рисунки.Найти("Логотип");

Если Рисунок <> Неопределено Тогда

Рисунок.Картинка = Организация.Логотип.Получить();

КонецЕсли;

В СКД (системе компоновки данных) картинки выводятся через вычисляемые поля или макеты, но это заметно сложнее и оправдано только для отчётов с фотографиями (например, каталог товаров с изображениями). Для разовой задачи проще сформировать табличный документ программно.

Учтите: прозрачность PNG в печатных формах поддерживается, но при выгрузке в некоторые форматы (например, старые версии XLS) может теряться. Если фон под логотипом критичен, проверяйте результат именно в целевом формате выгрузки.

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

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

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

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

Отображение в карточке объекта
Норма

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

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

Область изображения пуста — запись не выполнена или объект не записан

Извлечение из хранилища
Норма

Получить() возвращает ДвоичныеДанные или Картинку с ненулевым размером

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

Возвращается Неопределено — в хранилище ничего не записано

Выгрузка на диск
Норма

Файл создаётся и открывается в просмотрщике

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

Файл нулевого размера или не открывается — неверный тип данных или повреждённые данные

Наиболее частые ошибки разработчиков связаны не с самой записью, а с контекстом выполнения. Попытка прочитать файл с клиентского пути на сервере, забытый Объект.Записать() после присвоения реквизита, потеря данных из временного хранилища после завершения серверного вызова — всё это приводит к «картинка сохранилась, но её нет».

Типичные ошибки
01
Присвоили значение реквизиту, но не вызвали Записать() — данные потеряны после закрытия формы
02
Читают файл с диска клиентской машины в серверной процедуре — в клиент-серверном режиме файл недоступен, нужна передача через временное хранилище
03
Хранят в базе фотографии в исходном разрешении — база быстро разрастается, карточки открываются медленно
04
Сохраняют адрес временного хранилища в реквизит надолго — после завершения сеанса адрес становится недействительным
05
Путают объект Картинка и ДвоичныеДанные при выгрузке — метод Записать() есть только у двоичных данных

Когда стоит привлечь специалиста

Самостоятельная работа безопасна, пока вы действуете в пользовательском режиме типовой конфигурации или пишете код в копии базы. Риск появляется при изменении конфигурации рабочей базы: добавление реквизитов, доработка модулей БСП, массовая обработка присоединённых файлов. Ошибка здесь может привести к потере данных или невозможности обновления.

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

Итог

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

Пользователь сохраняет картинку через кнопку добавления изображения в карточке объекта — файл попадает в присоединённые файлы. Разработчик работает через ДвоичныеДанные и ХранилищеЗначения, не забывая вызвать Записать() и учитывая разделение клиента и сервера. Крупные изображения стоит уменьшать заранее, а любые массовые операции — проверять на копии базы.

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

Куда физически сохраняется картинка в файловой базе 1С?

Если используется реквизит типа ХранилищеЗначения или хранение присоединённых файлов в базе, данные записываются внутрь файла 1Cv8.1CD. Если в настройках включено хранение в томах, файл лежит в указанном каталоге на диске, а в базе остаётся только ссылка на него.

Можно ли сохранить картинку из интернета по ссылке?

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

Почему картинка отображается в карточке, но не выводится на печать?

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

Какой формат лучше выбрать для хранения в 1С?

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

Как массово загрузить картинки для всей номенклатуры?

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

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

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