Изображения в базе 1С:Предприятия 8.3: где хранить, как показать на форме, вывести в печать и отдать на сайт
Содержание
Картинку в 1С 8.3 хранят одним из трёх способов: в реквизите типа ХранилищеЗначения, в присоединённых файлах (механизм БСП, есть в БП 3.0, УТ 11, ЗУП 3.1) или в томах на диске. На форме её показывают полем картинки, привязанным к адресу во временном хранилище или к навигационной ссылке. В печать её выводят через рисунок в макете табличного документа.
Типичная ситуация: менеджер загрузил в карточки товаров 3 000 фотографий прямо с телефона, по 4–6 МБ каждая. Через месяц база выросла на 15 ГБ, список номенклатуры открывается медленно, а обмен с сайтом падает по таймауту. Всё это лечится правильной настройкой хранения, импорта и выгрузки изображений в 1С — и проще сделать её до первой тысячи фото, чем после.
Три способа хранить изображения в базе 1С
Выбор способа хранения определяет всё остальное: скорость, размер базы, удобство обмена.
| Способ | Где лежат данные | Когда подходит | Минусы |
|---|---|---|---|
Реквизит ХранилищеЗначения | В той же таблице, что и объект | Одна небольшая картинка на объект: логотип, фото сотрудника | Читается вместе с объектом, тормозит обращения «через точку» |
| Присоединённые файлы (БСП) | Отдельный справочник файлов, связанный с владельцем | Несколько фото на товар, документы-сканы | Нужна БСП; в своей конфигурации придётся встраивать |
| Тома на диске | Файловая система сервера, в базе только ссылка | Тысячи фото, база больше 10–20 ГБ | Тома надо бэкапить отдельно от базы |
🔹 Хранилище значений — самый простой путь для разработчика. Реквизит справочника получает тип ХранилищеЗначения, внутрь кладутся двоичные данные файла.
🔹 Присоединённые файлы используют типовые конфигурации. У каждого объекта-владельца свой справочник вида НоменклатураПрисоединенныеФайлы. У номенклатуры есть реквизит ФайлКартинки — ссылка на файл, который считается основным изображением.
🔹 Тома — надстройка над присоединёнными файлами. Включается константой «Хранить файлы в томах на диске», тома описываются в справочнике «Тома хранения файлов». Тело файла уходит в папку, в базе остаётся только запись о нём.
Для типовой конфигурации не изобретайте свой реквизит под фото. Пользуйтесь присоединёнными файлами: с ними работают обмен с сайтом, печатные формы и мобильные приложения.
Если включаете хранение в томах — папку тома обязательно добавьте в резервное копирование
. Выгрузка .dt файлы из томов не содержит, и восстановленная база окажется без картинок.
Загрузка картинок в карточку и на форму
Пользователю типовой конфигурации
- Откройте карточку номенклатуры.
- Кликните по области изображения в карточке (в БП 3.0 и УТ 11 она находится в правой части формы).
- Выберите файл на диске. Программа создаст присоединённый файл и сделает его основным изображением.
- Чтобы добавить ещё несколько фото, откройте присоединённые файлы товара (команда со скрепкой в командной панели карточки) и добавьте их там.
Массовая загрузка сотен фото вручную — плохая идея. Для этого есть загрузка из внешнего файла или обработка, которая сопоставляет имя файла с артикулом.
Разработчику: своя форма с полем картинки
На форме нужны поле картинки и реквизит формы типа Строка — в нём хранится адрес картинки. Поле картинки привязывается к этому реквизиту. Сам файл хранится в реквизите объекта Изображение типа ХранилищеЗначения.
&НаКлиенте
Процедура ЗагрузитьКартинку(Команда)
Оповещение = Новый ОписаниеОповещения("ЗагрузитьКартинкуЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьКартинкуЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
АдресКартинки = Адрес;
Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
Данные = ТекущийОбъект.Изображение.Получить();
Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
АдресКартинки = ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда
Данные = ПолучитьИзВременногоХранилища(АдресКартинки);
ТекущийОбъект.Изображение = Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(9));
КонецЕсли;
КонецПроцедуры
Что здесь происходит:
- 📥 файл с клиента попадает во временное хранилище, привязанное к форме через
УникальныйИдентификатор— пока форма открыта, адрес живой; - 🖼️ поле картинки сразу показывает изображение по адресу, запись объекта для этого не нужна;
- 💾 при записи двоичные данные упаковываются в хранилище значений.
Вместо временного хранилища для уже записанного объекта можно взять навигационную ссылку: ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Изображение"). Для нового, ещё не записанного объекта ссылки нет — поэтому в примере используется временное хранилище.
Синхронные ПоместитьФайл и Предупреждение в веб-клиенте и при включённом режиме без модальности не работают. Используйте асинхронные Начать... методы с описанием оповещения, как в примере.
Выгрузка изображений из 1С в файлы
Обратная задача — вытащить фото из базы: для маркетплейса, для дизайнера, для переноса в другую программу. Серверная процедура ниже сохраняет картинки номенклатуры в папку, имя файла — артикул.
&НаСервереБезКонтекста
Процедура ВыгрузитьКартинкиВПапку(Каталог)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.Изображение КАК Изображение
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Данные = Выборка.Изображение.Получить();
Если ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Или ПустаяСтрока(Выборка.Артикул) Тогда
Продолжить;
КонецЕсли;
ИмяФайла = СтрШаблон("%1\%2.jpg", Каталог, СокрЛП(Выборка.Артикул));
Данные.Записать(ИмяФайла);
КонецЦикла;
КонецПроцедуры
Пример рассчитан на свой реквизит Изображение из предыдущего раздела. В типовой конфигурации данные лежат в присоединённых файлах — получать их правильнее через программный интерфейс БСП (общий модуль РаботаСФайлами), а не читать таблицы напрямую: при хранении в томах тела файла в базе просто нет.
💡 Расширение .jpg в примере жёстко задано для простоты. Если в базе есть PNG, берите расширение из данных файла, иначе часть изображений откроется с ошибкой.
Обмен картинками с сайтом по CommerceML
Обмен 1С с интернет-магазином (1С-Битрикс, плагины для WordPress/WooCommerce, OpenCart и другие) идёт по протоколу CommerceML. Картинки передаются не внутри XML, а отдельными файлами.
Как устроен пакет
- 📄
import.xml— каталог: группы, товары, свойства; - 📄
offers.xml— цены и остатки; - 📁
import_files/— папка с изображениями, разложенными по подпапкам.
В карточке товара внутри import.xml картинка указана относительным путём:
<Товар>
<Ид>8d1c3e2a-...</Ид>
<Наименование>Кружка керамическая 350 мл</Наименование>
<Картинка>import_files/8d/8d1c3e2a-....jpg</Картинка>
</Товар>
Сайт получает пакет по HTTP. Последовательность запросов: mode=checkauth → mode=init → mode=file → mode=import. На шаге init сайт сообщает, принимает ли он zip-архив (zip=yes) и какой максимальный размер одной порции (file_limit). 1С режет пакет по этому лимиту.
Что настроить в 1С
- Откройте узел обмена с сайтом. В УТ 11 это раздел
НСИ и администрирование → Интеграция с другими программами, в БП 3.0 — разделАдминистрирование, группа настроек синхронизации данных. - В настройках выгрузки включите передачу картинок (файлов) товаров.
- Включите упаковку в zip, если сайт её поддерживает: 200 МБ фото обычно ужимаются слабо, но число HTTP-запросов падает.
- Сделайте пробный обмен на 10–20 товарах через отбор и проверьте результат на сайте.
Первая выгрузка с картинками — самая тяжёлая. Делайте её ночью, а дальше выгружайте только изменения: повторная полная выгрузка тысяч фото ничего не даёт, кроме нагрузки.
Что проверить на стороне сайта
- 🔸 лимиты PHP:
upload_max_filesize,post_max_size,max_execution_time— они должны быть не меньшеfile_limit; - 🔸 права на запись в папку обмена (в Битриксе —
/upload/1c_catalog/); - 🔸 свободное место на хостинге: при распаковке архив занимает место дважды.
Как не раздуть базу и не замедлить работу
Картинка весит в сотни раз больше, чем вся остальная карточка товара . Отсюда главные приёмы оптимизации.
Уменьшайте фото до загрузки
Для карточки и сайта хватает 1200 пикселей по длинной стороне и качества JPEG 80–85%. Фото с телефона при этом уменьшается с 4–6 МБ до 150–300 КБ, то есть примерно в 20 раз.
Встроенного метода «изменить размер» у объекта Картинка нет. Пакетно уменьшить папку фото до загрузки в 1С можно бесплатной утилитой ImageMagick:
magick mogrify -resize "1200x1200>" -quality 85 *.jpg
Знак > означает «уменьшать только то, что больше». Команда перезаписывает исходные файлы — запускайте её на копии папки.
Не рассчитывайте на сжатие хранилища
Параметр Новый СжатиеДанных(9) хорошо сжимает тексты и BMP, но JPEG и PNG уже сжаты. Выигрыш на них — единицы процентов. Реальную экономию даёт только уменьшение размера в пикселях.
Уберите картинку из основной таблицы
Когда код обращается к реквизиту «через точку» (Номенклатура.Артикул), платформа читает строку объекта целиком. Если в той же строке лежит фото на 2 МБ, каждое такое обращение тянет его с сервера СУБД.
Что делать:
- Храните изображения в отдельном справочнике или регистре сведений, связанном с объектом, — так работают присоединённые файлы.
- В запросах выбирайте поле хранилища только там, где картинка действительно нужна.
- При базе от 10–20 ГБ, где больше половины объёма — файлы, переведите хранение в тома на диске.
Перенос файлов из базы в тома (и обратно) — длительная операция, которая пишет в базу тысячи записей. Запускайте её вне рабочего времени, после резервной копии, и предупредите пользователей о замедлении.
Отображение в списках
Колонка с картинкой в динамическом списке на тысячи строк замедляет прокрутку. Если миниатюры в списке нужны, делайте отдельное маленькое превью (100–150 пикселей) и храните его отдельно от оригинала.
Картинки в печатных формах и отчётах
Логотип, печать и подпись в типовых формах
В БП 3.0 логотип, факсимиле печати и подписи загружают в карточке организации, в разделе «Логотип и печать». После этого их подставляет в счёт на оплату и ряд других форм, если при печати включён соответствующий флажок.
Подготовьте файлы заранее:
- 🖋️ печать и подпись — PNG с прозрачным фоном, иначе белый прямоугольник закроет текст документа;
- 📏 разрешение 300 dpi, чтобы оттиск не «рассыпался» при печати;
- ✂️ без лишних полей вокруг — 1С масштабирует картинку по размеру области.
Своя печатная форма
В макете табличного документа вставьте в нужную область рисунок (в Конфигураторе: Таблица → Рисунки → Картинка) и задайте ему имя, например Фото. В коде формирования замените картинку:
ОбластьТовар = Макет.ПолучитьОбласть("Товар");
Данные = Выборка.Изображение.Получить();
Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
ОбластьТовар.Рисунки.Фото.Картинка = Новый Картинка(Данные);
КонецЕсли;
ТабДок.Вывести(ОбластьТовар);
Чтобы фото не растягивалось, в свойствах рисунка в макете поставьте пропорциональный размер картинки (свойство РазмерКартинки).
Для типовой конфигурации печатную форму меняйте не в основной конфигурации, а через расширение или внешнюю печатную форму — тогда обновления не затрут доработку.