Хранение изображений в 1С: куда класть картинку и как её достать
Содержание
Сохранить картинку в 1С можно тремя способами: прикрепить её к элементу справочника как файл, положить в реквизит типа ХранилищеЗначения или оставить на диске и хранить только путь. Первый способ подходит почти всегда, второй нужен для фото «внутри» объекта, третий — для больших архивов.
Если вы пользователь, вам хватит раздела про интерфейс. Если вы разработчик или администратор, читайте про метаданные, код и тома. Ниже все варианты с примерами и подводными камнями.
Прежде чем менять конфигурацию или включать тома хранения, сделайте выгрузку базы. Для файловой базы это копия каталога, для серверной — выгрузка .dt.
Что выбрать: сравнение способов хранения
Картинка в базе — это набор байт плюс имя и формат. Вопрос только в том, где эти байты лежат.
| Способ | Где лежат данные | Когда подходит | Риски |
|---|---|---|---|
| Присоединённый файл | Таблица базы или том на диске | Фото товара, скан документа, договор | Нужна подсистема работы с файлами |
Реквизит ХранилищеЗначения | Внутри записи объекта | Одно небольшое фото на элемент | Раздувает таблицу, тормозит списки |
Реквизит типа Картинка | Только в памяти формы | Показать, а не хранить | После закрытия формы данные теряются |
| Путь к файлу в строке | Диск или сетевая папка | Огромные объёмы, внешние сервисы | Файл можно удалить мимо 1С |
💡 Если сомневаетесь, берите присоединённые файлы. Они уже умеют версии, права доступа , просмотр и перенос в тома.
Где в метаданных хранятся изображения
Для разработчика есть четыре «места» под картинку.
Присоединённые файлы
В типовых конфигурациях на базе БСП у справочников есть подчинённый справочник вида ИмяСправочникаПрисоединенныеФайлы. Он хранит имя, расширение, размер, дату и сами двоичные данные. Именно он открывается по ссылке «Файлы» на форме элемента.
Если у вашего объекта такого справочника нет, его добавляют в конфигураторе как подчинённый справочник, а подсистему работы с файлами подключают из БСП. Писать всё с нуля обычно не нужно.
Реквизит типа ХранилищеЗначения
Это универсальный контейнер. В реквизит можно положить любое сериализуемое значение, в том числе двоичные данные картинки.
- Откройте конфигуратор, найдите справочник, например
Номенклатура. - Добавьте реквизит
Фотои выберите типХранилищеЗначения. - Добавьте в форму поле вида «Поле картинки» и свяжите его с временным реквизитом формы.
Данные хранилища читаются отдельно, поэтому в списке элементов они не мешают. Но сама запись разрастается.
Тип Картинка
Тип Картинка — это объект для отображения и работы в памяти: размер, формат, чтение из файла и запись в файл. Как постоянное хранилище он не годится. Реквизит этого типа в форме живёт, пока форма открыта.
Из картинки получают двоичные данные методом ПолучитьДвоичныеДанные(), а потом кладут их в хранилище или файл.
Двоичные данные
Тип ДвоичныеДанные — «сырые» байты файла. Именно с ним работают, когда читают файл с диска и пишут в базу. Он же приходит из почтовых вложений, веб-сервисов и сканеров.
Как загрузить картинку через интерфейс
Пользовательский путь зависит от конфигурации, но логика одна.
- Откройте элемент, к которому нужна картинка (товар, сотрудник, контрагент).
- Найдите ссылку «Файлы» или значок скрепки в форме. В управляемых формах она обычно в командной панели или на панели навигации.
- Нажмите «Создать» или «Добавить», затем выберите «С диска».
- Укажите файл
.jpg,.pngи т. п., подтвердите загрузку. - Запишите элемент, если форма просит.
Если у объекта есть отдельное поле «Изображение» или «Фото», в нём обычно кнопка выбора с многоточием или значком папки. Выберите файл на диске, и картинка отобразится в поле.
Часть конфигураций умеет вставлять картинку из буфера обмена: сделайте скриншот, откройте список файлов и воспользуйтесь командой вставки из буфера. Если такой кнопки нет, сохраните скриншот в файл и добавьте обычным способом.
Как сохранить картинку из 1С обратно на диск
Часто нужно обратное: выгрузить фото товара из базы.
- Откройте список присоединённых файлов объекта.
- Выделите нужный файл.
- Выберите команду «Сохранить как» (в разных формах называется «Сохранить на диск» или «Открыть и сохранить»).
- Выберите папку и подтвердите.
Для массовой выгрузки фото используют обработку на основе кода из следующего раздела.
Программная загрузка и выгрузка файлов
Код ниже работает в управляемом приложении. Он показывает схему, а имена реквизитов подставьте свои.
Загрузка с клиента на сервер
Файл с компьютера пользователя нельзя прочитать прямо на сервере. Его сначала помещают во временное хранилище:
&НаКлиенте
Процедура ЗагрузитьФото(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, ДополнительныеПараметры) Экспорт
Если Результат.ПомещениеФайлаОтменено Тогда
Возврат;
КонецЕсли;
СохранитьФотоНаСервере(Результат.Адрес);
КонецПроцедуры
&НаСервере
Процедура СохранитьФотоНаСервере(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
Объект.Фото = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
Записать();
КонецПроцедуры
Вторым параметром у конструктора хранилища идёт степень сжатия. Для JPEG и PNG выигрыш небольшой, потому что формат уже сжат.
Показ картинки в форме
Чтобы показать сохранённое фото, достаньте двоичные данные и поместите их во временное хранилище:
&НаСервере
Процедура ПоказатьФотоНаСервере()
ДвоичныеДанные = Объект.Фото.Получить();
Если ДвоичныеДанные <> Неопределено Тогда
АдресФото = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры
Реквизит формы АдресФото связывают с полем картинки, у которого тип данных Картинка или ДвоичныеДанные. Подробные настройки поля зависят от версии платформы, проверьте в свойствах элемента.
Запись картинки на диск
На сервере удобно писать через двоичные данные:
ДвоичныеДанные = Объект.Фото.Получить();
ДвоичныеДанные.Записать("C:\Temp\foto.jpg");
Путь должен быть доступен учётной записи, под которой работает сервер 1С, а не вашему пользователю Windows. Частая ошибка: на клиенте папка есть, на сервере нет.
Чтение файла с диска
ДвоичныеДанные = Новый ДвоичныеДанные("C:\Temp\foto.jpg");
Для папки с тысячей фото перебирайте файлы через НайтиФайлы() и пишите каждый в отдельную транзакцию. Одна транзакция на всё закончится нехваткой памяти.
Серверный код не должен открывать диалоги выбора файла. Диалог живёт только на клиенте.
Тома хранения: вынести файлы за пределы базы
Когда фото набирается на десятки гигабайт, база распухает и бэкап тянется часами. Выход — хранить присоединённые файлы в томах на диске, а в базе оставить только ссылки.
Настройка выполняется один раз под пользователем с полными правами:
- Откройте раздел
Администрирование → Настройки программы. - Найдите пункт, связанный с файлами (в типовых конфигурациях он называется «Работа с файлами»).
- Включите хранение файлов в томах на диске.
- Создайте том: укажите путь для Windows или Linux, максимальный размер и порядок заполнения.
- При необходимости запустите перенос уже загруженных файлов в тома.
Что нужно учесть:
- 📁 Путь должен быть виден серверу 1С, а не клиентам. Для сетевой папки указывайте UNC-путь вида
\\server\share\files, а не букву диска. - 🔐 У учётной записи службы сервера 1С должны быть права на запись в каталог.
- 💾 Каталог томов нужно включать в резервное копирование наравне с базой. Иначе после восстановления ссылки будут вести в пустоту.
- 📏 В БСП есть ограничение на размер загружаемого файла (по умолчанию порядка 50 МБ), его меняют в настройках работы с файлами.
Перенос в тома обратим, но запускайте его вне рабочих часов: пока идёт операция, нагрузка на диск и базу заметна.
Формат Картинка и преобразование типов
Конвертировать приходится постоянно: из файла в ДвоичныеДанные, оттуда в Картинку и обратно. Схема такая:
| Что есть | Что нужно | Как |
|---|---|---|
| Файл на диске | ДвоичныеДанные | Новый ДвоичныеДанные(ИмяФайла) |
ДвоичныеДанные | Картинка | Новый Картинка(ДвоичныеДанные) |
Картинка | ДвоичныеДанные | Картинка.ПолучитьДвоичныеДанные() |
ДвоичныеДанные | ХранилищеЗначения | Новый ХранилищеЗначения(ДвоичныеДанные) |
ХранилищеЗначения | ДвоичныеДанные | Хранилище.Получить() |
ДвоичныеДанные | Адрес для формы | ПоместитьВоВременноеХранилище(...) |
Пример: показать на форме картинку, которая хранится как двоичные данные:
Картинка = Новый Картинка(ДвоичныеДанные);
У объекта Картинка есть методы получения формата и размера, а в платформе встроенная библиотека картинок со стандартными значками. Свои фото в неё не добавляют, это для интерфейса.
💡 Если нужно уменьшить большое фото до миниатюры, платформа сама этого не умеет. Обычно используют внешний компонент или COM-объект работы с изображениями, либо вызывают веб-сервис.
Оптимизация: что делать, чтобы база не тормозила
Картинки — главный источник «тяжёлой» базы. Несколько правил, которые реально работают.
- Не выводите реквизит с фото в динамический список. Если поле нужно, читайте его только при открытии элемента.
- Не делайте запросы
ВЫБРАТЬ *по таблицам, где естьХранилищеЗначенияс картинками. Выбирайте только нужные поля. - Сжимайте фото до загрузки: для карточки товара достаточно 800–1200 пикселей по большей стороне. Фото с телефона на 5–8 МБ превращается в 200–300 КБ без заметной потери.
- Храните файлы в томах, если общий объём больше нескольких гигабайт.
- Не складывайте в базу скан-копии «на всякий случай», у них есть срок хранения, после которого их удаляют.
Прикиньте объём заранее. 10 000 товаров по 300 КБ — это около 3 ГБ. При тех же 10 000 фото по 6 МБ уже 60 ГБ. Разница в сотни раз, и чаще всего её создаёт одно решение: сжимать или не сжимать.
Если база стала медленной после массовой загрузки фото, не оптимизируйте индексы наугад. Сначала проверьте размер таблиц файлов и хранилищ в СУБД.
Альтернатива, если штатные способы не подошли
Бывает, что фото приходят из внешней системы: сайта, фотоархива, мобильного приложения. Тогда копировать их в базу не обязательно.
Хранить можно только ссылку или имя файла, а картинку отдавать с веб-сервера. В 1С остаётся строковый реквизит, а форма показывает картинку по адресу через поле HTML-документа. Минус очевиден: пока внешний сервис недоступен, фото не видно, а при смене адреса ссылки придётся перезаписывать.
Второй вариант: оставить файлы в сетевой папке и подключать их по требованию. Он проще, но 1С не контролирует доступ и версии. Для документов с юридической силой такой способ не годится, берите присоединённые файлы с журналом изменений.
Перед любым выбором ответьте себе на три вопроса:
- 📷 Сколько будет картинок через год, а не сейчас?
- 🔍 Нужен ли поиск и отбор по ним внутри 1С?
- 🛡 Кто и как будет делать резервную копию файлов?
Ответы обычно сами подсказывают способ. Малый объём и нужен контроль доступа: присоединённые файлы. Большой объём: тома. Внешняя система: ссылки.
Если картинка не сохраняется или не отображается
Самые частые причины:
- Файл не помещается. Превышен лимит размера. Сожмите фото или увеличьте лимит в настройках работы с файлами.
- Нет прав. У роли пользователя нет права на добавление присоединённых файлов или изменение справочника.
- Путь недоступен серверу. Запись в том или чтение с диска не проходит, потому что учётная запись службы не видит каталог.
- Форма не знает про адрес. Вы записали данные в хранилище, но не обновили реквизит формы с адресом. Картинка есть в базе, но на экране пусто.
- Временное хранилище очищено. Адрес живёт недолго. Если держать его в форме часами, данные пропадут. Помещайте заново перед показом.
- Неподдерживаемый формат. Для отображения лучше всего подходят
.jpg,.png,.gif,.bmp. Экзотические форматы (.webp,.heic) конвертируйте до загрузки.
Если ничего из списка не подошло, включите регистрацию ошибок в журнале регистрации и повторите операцию. Там будет точный текст исключения.
Частые вопросы
Можно ли хранить картинку просто в реквизите типа Картинка?
ХранилищеЗначения или присоединённый файл.