Изображения в базе 1С:Предприятия 8.3: где хранить, как показать на форме, вывести в печать и отдать на сайт

· 10 мин

Содержание

Картинку в 1С 8.3 хранят одним из трёх способов: в реквизите типа ХранилищеЗначения, в присоединённых файлах (механизм БСП, есть в БП 3.0, УТ 11, ЗУП 3.1) или в томах на диске. На форме её показывают полем картинки, привязанным к адресу во временном хранилище или к навигационной ссылке. В печать её выводят через рисунок в макете табличного документа.

Типичная ситуация: менеджер загрузил в карточки товаров 3 000 фотографий прямо с телефона, по 4–6 МБ каждая. Через месяц база выросла на 15 ГБ, список номенклатуры открывается медленно, а обмен с сайтом падает по таймауту. Всё это лечится правильной настройкой хранения, импорта и выгрузки изображений в 1С — и проще сделать её до первой тысячи фото, чем после.

Три способа хранить изображения в базе 1С

Выбор способа хранения определяет всё остальное: скорость, размер базы, удобство обмена.

СпособГде лежат данныеКогда подходитМинусы
Реквизит ХранилищеЗначенияВ той же таблице, что и объектОдна небольшая картинка на объект: логотип, фото сотрудникаЧитается вместе с объектом, тормозит обращения «через точку»
Присоединённые файлы (БСП)Отдельный справочник файлов, связанный с владельцемНесколько фото на товар, документы-сканыНужна БСП; в своей конфигурации придётся встраивать
Тома на дискеФайловая система сервера, в базе только ссылкаТысячи фото, база больше 10–20 ГБТома надо бэкапить отдельно от базы

🔹 Хранилище значений — самый простой путь для разработчика. Реквизит справочника получает тип ХранилищеЗначения, внутрь кладутся двоичные данные файла.

🔹 Присоединённые файлы используют типовые конфигурации. У каждого объекта-владельца свой справочник вида НоменклатураПрисоединенныеФайлы. У номенклатуры есть реквизит ФайлКартинки — ссылка на файл, который считается основным изображением.

🔹 Тома — надстройка над присоединёнными файлами. Включается константой «Хранить файлы в томах на диске», тома описываются в справочнике «Тома хранения файлов». Тело файла уходит в папку, в базе остаётся только запись о нём.

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

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

Загрузка картинок в карточку и на форму

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

  1. Откройте карточку номенклатуры.
  2. Кликните по области изображения в карточке (в БП 3.0 и УТ 11 она находится в правой части формы).
  3. Выберите файл на диске. Программа создаст присоединённый файл и сделает его основным изображением.
  4. Чтобы добавить ещё несколько фото, откройте присоединённые файлы товара (команда со скрепкой в командной панели карточки) и добавьте их там.

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

Разработчику: своя форма с полем картинки

На форме нужны поле картинки и реквизит формы типа Строка — в нём хранится адрес картинки. Поле картинки привязывается к этому реквизиту. Сам файл хранится в реквизите объекта Изображение типа ХранилищеЗначения.

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

&НаКлиенте
Процедура ЗагрузитьКартинкуЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	Если Не Результат Тогда
		Возврат;
	КонецЕсли;
	АдресКартинки = Адрес;
	Модифицированность = Истина;
КонецПроцедуры

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда
		Данные = ПолучитьИзВременногоХранилища(АдресКартинки);
		ТекущийОбъект.Изображение = Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(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С

  1. Откройте узел обмена с сайтом. В УТ 11 это раздел НСИ и администрирование → Интеграция с другими программами, в БП 3.0 — раздел Администрирование, группа настроек синхронизации данных.
  2. В настройках выгрузки включите передачу картинок (файлов) товаров.
  3. Включите упаковку в zip, если сайт её поддерживает: 200 МБ фото обычно ужимаются слабо, но число HTTP-запросов падает.
  4. Сделайте пробный обмен на 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 МБ, каждое такое обращение тянет его с сервера СУБД.

Что делать:

  1. Храните изображения в отдельном справочнике или регистре сведений, связанном с объектом, — так работают присоединённые файлы.
  2. В запросах выбирайте поле хранилища только там, где картинка действительно нужна.
  3. При базе от 10–20 ГБ, где больше половины объёма — файлы, переведите хранение в тома на диске.

Перенос файлов из базы в тома (и обратно) — длительная операция, которая пишет в базу тысячи записей. Запускайте её вне рабочего времени, после резервной копии, и предупредите пользователей о замедлении.

Отображение в списках

Колонка с картинкой в динамическом списке на тысячи строк замедляет прокрутку. Если миниатюры в списке нужны, делайте отдельное маленькое превью (100–150 пикселей) и храните его отдельно от оригинала.

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

Логотип, печать и подпись в типовых формах

В БП 3.0 логотип, факсимиле печати и подписи загружают в карточке организации, в разделе «Логотип и печать». После этого их подставляет в счёт на оплату и ряд других форм, если при печати включён соответствующий флажок.

Подготовьте файлы заранее:

  • 🖋️ печать и подпись — PNG с прозрачным фоном, иначе белый прямоугольник закроет текст документа;
  • 📏 разрешение 300 dpi, чтобы оттиск не «рассыпался» при печати;
  • ✂️ без лишних полей вокруг — 1С масштабирует картинку по размеру области.

Своя печатная форма

В макете табличного документа вставьте в нужную область рисунок (в Конфигураторе: Таблица → Рисунки → Картинка) и задайте ему имя, например Фото. В коде формирования замените картинку:

ОбластьТовар = Макет.ПолучитьОбласть("Товар");
Данные = Выборка.Изображение.Получить();
Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
	ОбластьТовар.Рисунки.Фото.Картинка = Новый Картинка(Данные);
КонецЕсли;
ТабДок.Вывести(ОбластьТовар);

Чтобы фото не растягивалось, в свойствах рисунка в макете поставьте пропорциональный размер картинки (свойство РазмерКартинки).

Для типовой конфигурации печатную форму меняйте не в основной конфигурации, а через расширение или внешнюю печатную форму — тогда обновления не затрут доработку.

Почему картинка не показывается, не грузится или не уходит на сайт

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

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

Какие форматы картинок понимает 1С 8.3?
Уверенно работают BMP, GIF, JPEG, PNG, TIFF, ICO, WMF и EMF. Для фото товаров лучше JPEG, для логотипов и печатей с прозрачным фоном — PNG.
Сколько можно хранить картинок в базе?
Жёсткого лимита на число файлов нет, ограничение — размер базы и скорость работы. Если файлы занимают больше половины объёма базы, пора переходить на хранение в томах.
Можно ли показать картинку в табличной части документа?
Да. Добавьте колонку с полем картинки, связанную с реквизитом строки. Но на сотнях строк это замедлит форму, поэтому показывайте маленькие превью.
Попадают ли картинки в файл выгрузки .dt?
Те, что хранятся в реквизитах и присоединённых файлах внутри базы, — да. Файлы из томов на диске в .dt не попадают, их копируют отдельно.
Почему база после удаления фото не уменьшилась?
Удалённые данные освобождают место внутри файла базы, но сам файл не сжимается. В файловом варианте помогает сжатие таблиц в режиме тестирования и исправления, в клиент-серверном — средства СУБД.