Хранение изображений в 1С: куда класть картинку и как её достать

· 10 мин

Содержание

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

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

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

Что выбрать: сравнение способов хранения

Картинка в базе — это набор байт плюс имя и формат. Вопрос только в том, где эти байты лежат.

СпособГде лежат данныеКогда подходитРиски
Присоединённый файлТаблица базы или том на дискеФото товара, скан документа, договорНужна подсистема работы с файлами
Реквизит ХранилищеЗначенияВнутри записи объектаОдно небольшое фото на элементРаздувает таблицу, тормозит списки
Реквизит типа КартинкаТолько в памяти формыПоказать, а не хранитьПосле закрытия формы данные теряются
Путь к файлу в строкеДиск или сетевая папкаОгромные объёмы, внешние сервисыФайл можно удалить мимо 1С

💡 Если сомневаетесь, берите присоединённые файлы. Они уже умеют версии, права доступа , просмотр и перенос в тома.

Где в метаданных хранятся изображения

Для разработчика есть четыре «места» под картинку.

Присоединённые файлы

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

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

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

Это универсальный контейнер. В реквизит можно положить любое сериализуемое значение, в том числе двоичные данные картинки.

  1. Откройте конфигуратор, найдите справочник, например Номенклатура.
  2. Добавьте реквизит Фото и выберите тип ХранилищеЗначения.
  3. Добавьте в форму поле вида «Поле картинки» и свяжите его с временным реквизитом формы.

Данные хранилища читаются отдельно, поэтому в списке элементов они не мешают. Но сама запись разрастается.

Тип Картинка

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

Из картинки получают двоичные данные методом ПолучитьДвоичныеДанные(), а потом кладут их в хранилище или файл.

Двоичные данные

Тип ДвоичныеДанные — «сырые» байты файла. Именно с ним работают, когда читают файл с диска и пишут в базу. Он же приходит из почтовых вложений, веб-сервисов и сканеров.

Как загрузить картинку через интерфейс

Пользовательский путь зависит от конфигурации, но логика одна.

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

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

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

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

Часто нужно обратное: выгрузить фото товара из базы.

  1. Откройте список присоединённых файлов объекта.
  2. Выделите нужный файл.
  3. Выберите команду «Сохранить как» (в разных формах называется «Сохранить на диск» или «Открыть и сохранить»).
  4. Выберите папку и подтвердите.

Для массовой выгрузки фото используют обработку на основе кода из следующего раздела.

Программная загрузка и выгрузка файлов

Код ниже работает в управляемом приложении. Он показывает схему, а имена реквизитов подставьте свои.

Загрузка с клиента на сервер

Файл с компьютера пользователя нельзя прочитать прямо на сервере. Его сначала помещают во временное хранилище:

&НаКлиенте
Процедура ЗагрузитьФото(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
    НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, ДополнительныеПараметры) Экспорт
    Если Результат.ПомещениеФайлаОтменено Тогда
        Возврат;
    КонецЕсли;
    СохранитьФотоНаСервере(Результат.Адрес);
КонецПроцедуры

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

Вторым параметром у конструктора хранилища идёт степень сжатия. Для JPEG и PNG выигрыш небольшой, потому что формат уже сжат.

Показ картинки в форме

Чтобы показать сохранённое фото, достаньте двоичные данные и поместите их во временное хранилище:

&НаСервере
Процедура ПоказатьФотоНаСервере()
    ДвоичныеДанные = Объект.Фото.Получить();
    Если ДвоичныеДанные <> Неопределено Тогда
        АдресФото = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
    КонецЕсли;
КонецПроцедуры

Реквизит формы АдресФото связывают с полем картинки, у которого тип данных Картинка или ДвоичныеДанные. Подробные настройки поля зависят от версии платформы, проверьте в свойствах элемента.

Запись картинки на диск

На сервере удобно писать через двоичные данные:

ДвоичныеДанные = Объект.Фото.Получить();
ДвоичныеДанные.Записать("C:\Temp\foto.jpg");

Путь должен быть доступен учётной записи, под которой работает сервер 1С, а не вашему пользователю Windows. Частая ошибка: на клиенте папка есть, на сервере нет.

Чтение файла с диска

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

Для папки с тысячей фото перебирайте файлы через НайтиФайлы() и пишите каждый в отдельную транзакцию. Одна транзакция на всё закончится нехваткой памяти.

Серверный код не должен открывать диалоги выбора файла. Диалог живёт только на клиенте.

Тома хранения: вынести файлы за пределы базы

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

Настройка выполняется один раз под пользователем с полными правами:

  1. Откройте раздел Администрирование → Настройки программы.
  2. Найдите пункт, связанный с файлами (в типовых конфигурациях он называется «Работа с файлами»).
  3. Включите хранение файлов в томах на диске.
  4. Создайте том: укажите путь для Windows или Linux, максимальный размер и порядок заполнения.
  5. При необходимости запустите перенос уже загруженных файлов в тома.

Что нужно учесть:

  • 📁 Путь должен быть виден серверу 1С, а не клиентам. Для сетевой папки указывайте UNC-путь вида \\server\share\files, а не букву диска.
  • 🔐 У учётной записи службы сервера 1С должны быть права на запись в каталог.
  • 💾 Каталог томов нужно включать в резервное копирование наравне с базой. Иначе после восстановления ссылки будут вести в пустоту.
  • 📏 В БСП есть ограничение на размер загружаемого файла (по умолчанию порядка 50 МБ), его меняют в настройках работы с файлами.

Перенос в тома обратим, но запускайте его вне рабочих часов: пока идёт операция, нагрузка на диск и базу заметна.

Формат Картинка и преобразование типов

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

Что естьЧто нужноКак
Файл на дискеДвоичныеДанныеНовый ДвоичныеДанные(ИмяФайла)
ДвоичныеДанныеКартинкаНовый Картинка(ДвоичныеДанные)
КартинкаДвоичныеДанныеКартинка.ПолучитьДвоичныеДанные()
ДвоичныеДанныеХранилищеЗначенияНовый ХранилищеЗначения(ДвоичныеДанные)
ХранилищеЗначенияДвоичныеДанныеХранилище.Получить()
ДвоичныеДанныеАдрес для формыПоместитьВоВременноеХранилище(...)

Пример: показать на форме картинку, которая хранится как двоичные данные:

Картинка = Новый Картинка(ДвоичныеДанные);

У объекта Картинка есть методы получения формата и размера, а в платформе встроенная библиотека картинок со стандартными значками. Свои фото в неё не добавляют, это для интерфейса.

💡 Если нужно уменьшить большое фото до миниатюры, платформа сама этого не умеет. Обычно используют внешний компонент или COM-объект работы с изображениями, либо вызывают веб-сервис.

Оптимизация: что делать, чтобы база не тормозила

Картинки — главный источник «тяжёлой» базы. Несколько правил, которые реально работают.

  1. Не выводите реквизит с фото в динамический список. Если поле нужно, читайте его только при открытии элемента.
  2. Не делайте запросы ВЫБРАТЬ * по таблицам, где есть ХранилищеЗначения с картинками. Выбирайте только нужные поля.
  3. Сжимайте фото до загрузки: для карточки товара достаточно 800–1200 пикселей по большей стороне. Фото с телефона на 5–8 МБ превращается в 200–300 КБ без заметной потери.
  4. Храните файлы в томах, если общий объём больше нескольких гигабайт.
  5. Не складывайте в базу скан-копии «на всякий случай», у них есть срок хранения, после которого их удаляют.

Прикиньте объём заранее. 10 000 товаров по 300 КБ — это около 3 ГБ. При тех же 10 000 фото по 6 МБ уже 60 ГБ. Разница в сотни раз, и чаще всего её создаёт одно решение: сжимать или не сжимать.

Если база стала медленной после массовой загрузки фото, не оптимизируйте индексы наугад. Сначала проверьте размер таблиц файлов и хранилищ в СУБД.

Альтернатива, если штатные способы не подошли

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

Хранить можно только ссылку или имя файла, а картинку отдавать с веб-сервера. В 1С остаётся строковый реквизит, а форма показывает картинку по адресу через поле HTML-документа. Минус очевиден: пока внешний сервис недоступен, фото не видно, а при смене адреса ссылки придётся перезаписывать.

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

Перед любым выбором ответьте себе на три вопроса:

  • 📷 Сколько будет картинок через год, а не сейчас?
  • 🔍 Нужен ли поиск и отбор по ним внутри 1С?
  • 🛡 Кто и как будет делать резервную копию файлов?

Ответы обычно сами подсказывают способ. Малый объём и нужен контроль доступа: присоединённые файлы. Большой объём: тома. Внешняя система: ссылки.

Если картинка не сохраняется или не отображается

Самые частые причины:

  • Файл не помещается. Превышен лимит размера. Сожмите фото или увеличьте лимит в настройках работы с файлами.
  • Нет прав. У роли пользователя нет права на добавление присоединённых файлов или изменение справочника.
  • Путь недоступен серверу. Запись в том или чтение с диска не проходит, потому что учётная запись службы не видит каталог.
  • Форма не знает про адрес. Вы записали данные в хранилище, но не обновили реквизит формы с адресом. Картинка есть в базе, но на экране пусто.
  • Временное хранилище очищено. Адрес живёт недолго. Если держать его в форме часами, данные пропадут. Помещайте заново перед показом.
  • Неподдерживаемый формат. Для отображения лучше всего подходят .jpg, .png, .gif, .bmp. Экзотические форматы (.webp, .heic) конвертируйте до загрузки.

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

Диагностика: выберите симптом

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

Можно ли хранить картинку просто в реквизите типа Картинка?
Нет. Этот тип живёт в памяти и не записывается в базу как постоянный. Для хранения берите ХранилищеЗначения или присоединённый файл.
Где лучше хранить фото товаров: в базе или на диске?
До нескольких гигабайт удобнее в базе как присоединённые файлы. Дальше выносите в тома на диске: база быстрее и меньше по размеру.
Какой формат картинки выбрать?
JPEG для фотографий, PNG для схем, логотипов и скриншотов с текстом. Оба формата платформа показывает без доп. настроек.
Как выгрузить все фото из базы разом?
Через обработку: обойти справочник присоединённых файлов, получить двоичные данные каждого и записать на диск. Делайте это на сервере и порциями.
Почему картинка пропала после перезапуска формы?
Если она лежала только в реквизите формы, а не в объекте, она не сохранилась. Запишите данные в реквизит объекта или в присоединённый файл.