Разработка и Конфигурация · 12 мин
Как сохранить картинку в 1С
Как сохранить картинку в 1С: хранение в справочниках, работа с двоичными данными, код для разработчиков, типичные ошибки и проверка результата.
В 1С картинки нужны для карточек товаров, логотипов организаций, фотографий сотрудников, печатей на документах и десятков других задач. При этом «сохранить картинку» может означать разное: загрузить файл в базу, прикрепить изображение к элементу справочника, вывести картинку в печатную форму или программно записать файл на диск из базы данных. Каждый сценарий решается своим инструментарием, и путаница между ними — главная причина ошибок у начинающих.
В типовых конфигурациях (Управление торговлей, ERP, Бухгалтерия, ЗУП) уже встроен механизм хранения изображений, и пользователю достаточно нажать пару кнопок. Разработчику же приходится работать с объектами ДвоичныеДанные, Картинка и временным хранилищем. Ниже разобраны оба уровня: как действовать пользователю в готовой конфигурации и как писать код, который надёжно сохраняет и извлекает изображения.
Перед началом определите, где именно должна храниться картинка: в самой базе, в присоединённых файлах на диске или во временном хранилище на время сеанса. От этого зависит и способ сохранения, и влияние на размер базы, и скорость работы.
Определяем, где будет храниться картинка
В 1С существует три принципиально разных места хранения изображений. Первый — реквизит объекта с типом ХранилищеЗначения, внутри которого лежат двоичные данные или объект Картинка. Данные физически находятся в таблице базы, что увеличивает её размер, но гарантирует целостность при резервном копировании.
Второй вариант — механизм присоединённых файлов из Библиотеки стандартных подсистем (БСП). Файлы могут храниться как в базе, так и в томах на диске — это настраивается в разделе администрирования. Именно этот механизм используется в типовых конфигурациях для картинок номенклатуры, фото сотрудников и сканов документов.
Третий вариант — временное хранилище. Оно живёт только в рамках сеанса или вызова сервера и предназначено для передачи данных между клиентом и сервером, а не для постоянного хранения. Частая ошибка новичков — «сохранить» картинку во временное хранилище и ожидать, что она переживёт перезапуск сеанса.
Сравнение вариантов хранения
Подходит для одной-двух картинок на объект (логотип, печать). Увеличивает размер базы, сложнее управлять несколькими файлами.
Стандарт для типовых конфигураций: много файлов на объект, предпросмотр, возможность хранения в томах на диске. Требует наличия БСП в конфигурации.
Только для передачи данных между клиентом и сервером в рамках сеанса. Не является постоянным хранилищем.
Как пользователю сохранить картинку в типовой конфигурации
В типовых решениях изображение прикрепляется к карточке объекта без программирования. Рассмотрим на примере номенклатуры: откройте карточку товара, найдите область изображения (обычно слева или на отдельной вкладке) и нажмите «Добавить изображение» или аналогичную кнопку с иконкой картинки. В открывшемся диалоге выберите файл с диска и подтвердите выбор.
После загрузки картинка появится в карточке, а сам файл будет записан в справочник присоединённых файлов. Если в конфигурации включено хранение в томах, на диске в указанном каталоге появится файл со служебным именем — это нормально, переименовывать его вручную не нужно.
Для логотипа организации путь аналогичный: карточка организации, раздел «Логотип и печать» (в Бухгалтерии — в настройках печатных форм). Загруженные там изображения автоматически подставляются в счета и акты, если макет печатной формы это поддерживает.
- 1Откройте карточку товара в справочнике «Номенклатура»
- 2Нажмите «Добавить изображение» или кликните по области картинки
- 3Выберите файл на диске и подтвердите
- 4Убедитесь, что изображение отображается в карточке
- 5Запишите и закройте карточку, затем откройте её повторно — картинка должна остаться на месте
Ограничения по форматам и размеру
1С штатно работает с распространёнными растровыми форматами: PNG, JPEG, BMP, GIF. Проблемы чаще всего возникают с экзотическими форматами (например, WebP в старых версиях платформы) и с очень большими файлами — фотография с камеры весом в десятки мегабайт замедлит открытие карточки и раздует базу. Практическая рекомендация — заранее уменьшать изображения до разумного разрешения, достаточного для экрана и печати.
Как разработчику сохранить картинку программно
Базовый сценарий: файл с диска нужно записать в реквизит объекта типа ХранилищеЗначения. Сначала файл преобразуется в двоичные данные, затем они помещаются в хранилище значений, и объект записывается.
ДвоичныеДанные = Новый ДвоичныеДанные("C:\Images\logo.png");
Объект.Картинка = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
Объект.Записать();
Если нужен объект Картинка (например, для проверки формата или получения размеров), он создаётся из двоичных данных: Новый Картинка(ДвоичныеДанные). Сам объект Картинка тоже можно положить в ХранилищеЗначения — при извлечении через Получить() вы получите его обратно.
В клиент-серверном режиме загрузку с клиента на сервер выполняют через временное хранилище: на клиенте файл помещается методом ПоместитьВоВременноеХранилище (или через НачатьПомещениеФайла в тонком клиенте), а на сервере данные извлекаются по адресу хранилища и записываются в базу. Прямое обращение к пути на диске с сервера сработает только если файл физически доступен серверу — в файловой базе на локальной машине это так, в клиент-серверной обычно нет.
&НаСервере
Процедура СохранитьКартинкуНаСервере(АдресХранилища, ОбъектСсылка)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
Объект = ОбъектСсылка.ПолучитьОбъект();
Объект.Картинка = Новый ХранилищеЗначения(ДвоичныеДанные);
Объект.Записать();
КонецПроцедурыКак сохранить картинку из базы на диск
Обратная задача — выгрузить изображение из базы в файл — решается методом Записать() у двоичных данных. Извлеките значение из хранилища, при необходимости преобразуйте и запишите по нужному пути.
ДвоичныеДанные = Объект.Картинка.Получить();
Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда
ДвоичныеДанные.Записать("C:\Export\image.png");
КонецЕсли;
Проверка типа обязательна: если в хранилище лежал объект Картинка, а не двоичные данные, метод Записать() у него отсутствует. В этом случае сначала получите двоичные данные через Картинка.ПолучитьДвоичныеДанные() — либо храните изначально именно двоичные данные, чтобы не гадать при выгрузке.
Для массовой выгрузки присоединённых файлов в типовых конфигурациях используйте функции БСП: РаботаСФайлами.ДвоичныеДанныеФайла(ПрисоединенныйФайл) вернёт двоичные данные независимо от того, хранится файл в базе или в томе на диске. Это избавляет от ручной обработки двух режимов хранения.
Картинки в печатных формах и отчётах
Чтобы изображение попало в печатную форму, в макете табличного документа добавляется область с картинкой, а в коде при формировании ей присваивается значение. Для табличного документа используется коллекция Рисунки: у нужного рисунка свойству Картинка присваивается объект Картинка, извлечённый из хранилища.
Рисунок = ТабДок.Рисунки.Найти("Логотип");
Если Рисунок <> Неопределено Тогда
Рисунок.Картинка = Организация.Логотип.Получить();
КонецЕсли;
В СКД (системе компоновки данных) картинки выводятся через вычисляемые поля или макеты, но это заметно сложнее и оправдано только для отчётов с фотографиями (например, каталог товаров с изображениями). Для разовой задачи проще сформировать табличный документ программно.
Учтите: прозрачность PNG в печатных формах поддерживается, но при выгрузке в некоторые форматы (например, старые версии XLS) может теряться. Если фон под логотипом критичен, проверяйте результат именно в целевом формате выгрузки.
Проверка результата и типичные ошибки
После сохранения убедитесь, что картинка действительно записалась: повторно откройте объект и проверьте отображение, а при программной записи — извлеките значение из хранилища и сравните размер данных с исходным файлом. Пустое значение или Неопределено при извлечении означают, что запись не состоялась.
Как проверить результат
Картинка видна после повторного открытия объекта
Область изображения пуста — запись не выполнена или объект не записан
Получить() возвращает ДвоичныеДанные или Картинку с ненулевым размером
Возвращается Неопределено — в хранилище ничего не записано
Файл создаётся и открывается в просмотрщике
Файл нулевого размера или не открывается — неверный тип данных или повреждённые данные
Наиболее частые ошибки разработчиков связаны не с самой записью, а с контекстом выполнения. Попытка прочитать файл с клиентского пути на сервере, забытый Объект.Записать() после присвоения реквизита, потеря данных из временного хранилища после завершения серверного вызова — всё это приводит к «картинка сохранилась, но её нет».
Когда стоит привлечь специалиста
Самостоятельная работа безопасна, пока вы действуете в пользовательском режиме типовой конфигурации или пишете код в копии базы. Риск появляется при изменении конфигурации рабочей базы: добавление реквизитов, доработка модулей БСП, массовая обработка присоединённых файлов. Ошибка здесь может привести к потере данных или невозможности обновления.
Также к специалисту стоит обратиться, если картинки должны синхронизироваться с сайтом или внешней системой: здесь добавляются вопросы форматов обмена, ограничений API и нагрузки на базу, и цена ошибки заметно выше.
Что важно запомнить
Пользователь сохраняет картинку через кнопку добавления изображения в карточке объекта — файл попадает в присоединённые файлы. Разработчик работает через ДвоичныеДанные и ХранилищеЗначения, не забывая вызвать Записать() и учитывая разделение клиента и сервера. Крупные изображения стоит уменьшать заранее, а любые массовые операции — проверять на копии базы.
Частые вопросы
Куда физически сохраняется картинка в файловой базе 1С?
Если используется реквизит типа ХранилищеЗначения или хранение присоединённых файлов в базе, данные записываются внутрь файла 1Cv8.1CD. Если в настройках включено хранение в томах, файл лежит в указанном каталоге на диске, а в базе остаётся только ссылка на него.
Можно ли сохранить картинку из интернета по ссылке?
Да, программно: через HTTPСоединение или HTTPЗапрос получите двоичные данные ответа и запишите их в хранилище значений так же, как данные локального файла. В пользовательском режиме типовые конфигурации такой возможности обычно не предоставляют — потребуется доработка.
Почему картинка отображается в карточке, но не выводится на печать?
Изображение в карточке и картинка в печатной форме — разные механизмы. Проверьте, есть ли в макете печатной формы область с рисунком и присваивается ли ему значение в коде формирования. В типовых конфигурациях для печати обычно используется отдельный реквизит «Логотип» или «Факсимиле», а не картинка из карточки товара.
Какой формат лучше выбрать для хранения в 1С?
Для логотипов и изображений с прозрачностью — PNG, для фотографий — JPEG, так как он заметно компактнее при сопоставимом визуальном качестве. BMP хранить не рекомендуется: файлы получаются неоправданно большими.
Как массово загрузить картинки для всей номенклатуры?
Стандартной кнопки для этого нет, но задача решается внешней обработкой: обходите файлы в каталоге, сопоставляете имена с кодом или артикулом товара и записываете через механизм присоединённых файлов. Перед запуском на рабочей базе обязательно проверьте обработку на копии и сделайте резервную копию.
Почему база сильно выросла после загрузки изображений?
Каждая картинка, хранящаяся в базе, добавляет свой вес к файлу данных. Сотни фотографий в исходном разрешении легко добавляют гигабайты. Решение — заранее уменьшать изображения и, при больших объёмах, переносить хранение в тома на диске.