Добавление изображений в 1С: справочник, форма и печатный макет
Содержание
Чтобы вставить картинку
в 1С, нужно решить две вещи: где изображение будет храниться и как пользователь или код его туда положит. В типовых конфигурациях на платформе 8.3 («Такси») изображение чаще всего кладут в реквизит справочника типа ХранилищеЗначения, а на форме показывают через поле с типом Картинка. Для печати рисунок добавляют в макет.
Разберём все рабочие варианты: добавить фото номенклатуры или сотрудника прямо в карточке, настроить хранение изображения в конфигураторе, загрузить картинку из файла программно и вывести логотип на печатную форму. По ходу — где платформа чаще всего спотыкается и как этого избежать.
Где 1С хранит изображения: в базе или во внешних файлах
Первое решение — физическое место хранения. От него зависит и размер базы, и скорость резервного копирования.
🗂️ Внутри информационной базы. Картинка лежит в реквизите типа ХранилищеЗначения. Платформа упаковывает двоичные данные изображения в этот реквизит и хранит их вместе с остальными данными объекта. Плюс — всё в одном месте, картинка едет вместе с объектом при выгрузке в .dt. Минус — база быстро пухнет: тысяча фотографий номенклатуры по 300 КБ — это 300 МБ прямо в таблицах.
📁 Во внешнем каталоге или томах. В базе хранится только путь или идентификатор файла, а само изображение — на диске (механизм томов хранения файлов в БСП). Так работают присоединённые файлы в типовых конфигурациях. База остаётся лёгкой, бэкап быстрый, но нужен доступ к каталогу и его собственное резервное копирование .
Для одиночных картинок (фото товара, скан печати, логотип организации) достаточно ХранилищеЗначения. Если изображений много и они тяжёлые — используйте присоединённые файлы с томами, не раздувайте таблицы объектов.
Как добавить фото в справочник вручную, без программирования
Если конфигурация типовая и реквизит под картинку уже есть, вставить изображение можно прямо в режиме 1С:Предприятие, без конфигуратора.
Самый частый случай — фото номенклатуры. В «Управлении торговлей» и «Рознице» у номенклатуры есть присоединённые файлы и поле изображения:
- Откройте карточку товара в справочнике
Номенклатура. - Найдите область изображения в карточке (обычно слева сверху или на отдельной вкладке с файлами).
- Нажмите команду добавления картинки и выберите файл на диске.
- Запишите элемент.
Для сотрудника фото хранится в его файлах или в поле изображения карточки физлица — порядок тот же: открыть карточку, добавить файл , записать.
Если в карточке нет места под картинку, значит, в этой конфигурации реквизит не предусмотрен. Добавлять его в типовую конфигурацию нужно через расширение, а не правкой основной конфигурации — иначе слетит поддержка и усложнятся обновления.
Поддерживаемые форматы для показа на форме — PNG, JPG, BMP, GIF. Слишком большие файлы лучше заранее уменьшить: на экране карточки картинка всё равно масштабируется, а в базе занимает полный размер оригинала.
Реквизит ХранилищеЗначения: настройка хранения в конфигураторе
Когда своего поля под изображение нет, его заводят в конфигураторе. Базовая схема — реквизит-хранилище плюс поле на форме.
Шаг 1. Добавить реквизит
объекту. В дереве конфигурации откройте нужный объект (например справочник), добавьте реквизит и задайте тип ХранилищеЗначения. В этом реквизите будут лежать двоичные данные картинки.
Шаг 2. Разместить поле на форме. На форме элемента добавьте реквизит формы типа Картинка (именно Картинка, а не ХранилищеЗначения — поле формы умеет рисовать только Картинка). Свяжите его с элементом формы «Поле картинки».
Шаг 3. Связать форму и хранилище кодом. Напрямую «Поле картинки» с ХранилищеЗначения не соединяется: в хранилище лежат упакованные данные, а полю нужен готовый объект Картинка. Поэтому при открытии формы данные распаковывают, а при записи — упаковывают обратно. Код приведён в следующем разделе.
Почему именно так, а не «картинка прямо в реквизите объекта»: тип Картинка нельзя назначить реквизиту объекта метаданных — он живёт только на формах и в макетах. Для долговременного хранения в базе используется ХранилищеЗначения. Это и есть ключевой момент, на котором застревает большинство новичков.
Присоединённые файлы вместо реквизита: когда картинок много
Если изображений десятки на объект или они тяжёлые, реквизит в объекте — плохой выбор: база раздувается, а показать несколько картинок одним полем не получится. В типовых конфигурациях на БСП для этого есть механизм присоединённых файлов (подсистема «Работа с файлами»).
Как это выглядит на практике:
- В карточке объекта (номенклатура, контрагент, физлицо) есть команда или гиперссылка для работы с файлами — «Файлы», «Присоединённые файлы» или значок скрепки.
- По этой команде открывается список файлов объекта. Через добавление выбираете картинку с диска, она загружается и привязывается к объекту.
- Файлов можно привязать сколько угодно: несколько фото товара, сканы, чертежи.
Где физически лежат такие файлы, зависит от настройки томов. По умолчанию в файловой базе они внутри базы, а в клиент-серверном варианте их обычно выносят на диск. Настраивается это в разделе Администрирование → Настройки работы с файлами (точное название пункта может отличаться по конфигурации) — там включают хранение в томах и указывают каталог тома на сервере.
Присоединённые файлы — штатный способ хранить много картинок, не раздувая таблицы объектов. Реквизит ХранилищеЗначения оставьте для одной главной картинки, которую нужно показывать на форме и в печати.
Чтобы получить такое изображение программно для вывода в макет, в типовых конфигурациях используют методы работы с файлами из БСП (получение двоичных данных файла по ссылке). Конкретные имена процедур зависят от версии библиотеки — смотрите общий модуль работы с файлами в вашей конфигурации, а не придумывайте вызовы наугад.
Как загрузить картинку из файла программно
Код зависит от того, где выполняется загрузка. На тонком и веб-клиенте прямого доступа к файловой системе сервера нет, поэтому файл сначала передают механизмом помещения файлов.
Распаковать картинку из хранилища при открытии формы. В обработчике ПриСозданииНаСервере достаём объект Картинка из реквизита и кладём в реквизит формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
Данные = Объект.Ссылка.ХранилищеКартинки.Получить();
Если ТипЗнч(Данные) = Тип("Картинка") Тогда
Картинка = Данные;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Здесь ХранилищеКартинки — имя реквизита объекта типа ХранилищеЗначения, а Картинка — реквизит формы типа Картинка.
Выбрать файл
и загрузить его в поле. На управляемой форме выбор файла делают через НачатьПомещениеФайла. Файл попадает во временное хранилище, оттуда данные читают на сервере:
&НаКлиенте
Процедура ЗагрузитьКартинку(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(Результат, АдресВоВременномХранилище, ВыбранноеИмя, ДопПараметры) Экспорт
Если Результат Тогда
ЗагрузитьНаСервере(АдресВоВременномХранилище);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
Картинка = Новый Картинка(ДвоичныеДанные);
КонецПроцедуры
Упаковать картинку обратно при записи. Чтобы изображение сохранилось в базе, перед записью объекта данные поля кладут в ХранилищеЗначения:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если Картинка <> Неопределено Тогда
ТекущийОбъект.ХранилищеКартинки = Новый ХранилищеЗначения(Картинка);
КонецЕсли;
КонецПроцедуры
Конструктор Новый ХранилищеЗначения(Картинка, Новый СжатиеДанных()) сожмёт данные перед сохранением. Для JPG и PNG выигрыш почти нулевой — они уже сжаты, так что сжатие нужно скорее для несжатых BMP.
В толстом клиенте файлового варианта доступен прямой конструктор Новый Картинка("C:\foto\tovar.png") — он принимает путь к файлу. Но завязываться на локальный путь не стоит: на сервере и у других пользователей такого каталога не будет. Универсальный способ — через временное хранилище, показанный выше.
Как вывести изображение в печатный макет
Для печати логотипа, печати организации или фото в прайс-листе картинку размещают в макете табличного документа.
Если рисунок один и постоянный (например логотип):
- Откройте макет в конфигураторе (или макет во внешней обработке).
- На панели вставьте рисунок, выберите тип «Картинка» и загрузите файл.
- Задайте рисунку имя в его свойствах.
- Расположите его в нужной области макета.
При формировании печатной формы такой рисунок выводится сам, кодом его трогать не надо — он часть области.
Если картинка меняется (фото конкретного товара из базы), в макете размещают пустой рисунок-картинку с именем, а значение подставляют кодом при заполнении области:
Макет = Обработки.ПечатьПрайса.ПолучитьМакет("Макет");
Область = Макет.ПолучитьОбласть("СтрокаТовара");
Данные = ВыборкаТоваров.ХранилищеКартинки.Получить();
Если ТипЗнч(Данные) = Тип("Картинка") Тогда
Область.Рисунки.ФотоТовара.Картинка = Данные;
КонецЕсли;
ТабДок.Вывести(Область);
Здесь ФотоТовара — имя рисунка в макете, который вы задали на шаге с именем. Если имя не совпадёт — платформа не найдёт рисунок и выдаст ошибку.
Размер рисунка в макете фиксирован рамкой, которую вы нарисовали. Если исходные фото разного размера, задайте рисунку способ размещения «Пропорционально» в свойствах, иначе изображения растянутся и исказятся.
Частые ошибки при вставке картинок и как их устранить
Ещё несколько моментов, которые экономят время:
- 🖼️ Формат. Для экрана и печати берите
PNG(без фона) илиJPG(фото).GIFиBMPплатформа покажет, ноBMPзанимает много места. - 📐 Размер. Уменьшайте фото до разумного разрешения перед загрузкой. Полноразмерные снимки с телефона в базе не нужны — они только раздувают таблицы.
- 🔁 Прозрачность на печати. Прозрачный фон
PNGв табличном документе отображается корректно, но при экспорте в некоторые форматы фон может стать белым — проверяйте результат печати. - 🧩 Расширение вместо правки типовой. Новый реквизит под картинку, поле на форме и макет с рисунком добавляйте расширением конфигурации. Так основная конфигурация остаётся на поддержке и обновляется штатно.
- 🧪 Проверяйте на тонком клиенте. Код, который работает в толстом клиенте файловой базы (прямой путь к файлу), часто падает на тонком и веб-клиенте. Тестируйте в том режиме, в котором реально работают пользователи.
Прежде чем добавлять реквизиты в типовую конфигурацию — делайте это через расширение, а не правкой основной конфигурации. Иначе потеряете автоматическое обновление.
Частые вопросы
Можно ли вставить картинку без конфигуратора?
Чем отличаются типы Картинка и ХранилищеЗначения?
Картинка — объект для показа и печати, живёт на форме и в макете, в базе напрямую не хранится. ХранилищеЗначения — универсальный контейнер двоичных данных для долговременного хранения в реквизите объекта. При показе данные распаковывают из хранилища в Картинка, при сохранении — упаковывают обратно.Почему картинка тяжёлая, а база растёт?
Как загрузить картинку из файла на веб-клиенте?
НачатьПомещениеФайла: платформа сама покажет диалог выбора, передаст файл во временное хранилище, а на сервере вы прочитаете данные через ПолучитьИзВременногоХранилища.Как подставить разные фото товаров в один макет?
Область.Рисунки.ИмяРисунка.Картинка распакованное из хранилища изображение конкретного товара.