Добавление изображений в 1С: справочник, форма и печатный макет

· 9 мин

Содержание

Чтобы вставить картинку в 1С, нужно решить две вещи: где изображение будет храниться и как пользователь или код его туда положит. В типовых конфигурациях на платформе 8.3 («Такси») изображение чаще всего кладут в реквизит справочника типа ХранилищеЗначения, а на форме показывают через поле с типом Картинка. Для печати рисунок добавляют в макет.

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

Где 1С хранит изображения: в базе или во внешних файлах

Первое решение — физическое место хранения. От него зависит и размер базы, и скорость резервного копирования.

🗂️ Внутри информационной базы. Картинка лежит в реквизите типа ХранилищеЗначения. Платформа упаковывает двоичные данные изображения в этот реквизит и хранит их вместе с остальными данными объекта. Плюс — всё в одном месте, картинка едет вместе с объектом при выгрузке в .dt. Минус — база быстро пухнет: тысяча фотографий номенклатуры по 300 КБ — это 300 МБ прямо в таблицах.

📁 Во внешнем каталоге или томах. В базе хранится только путь или идентификатор файла, а само изображение — на диске (механизм томов хранения файлов в БСП). Так работают присоединённые файлы в типовых конфигурациях. База остаётся лёгкой, бэкап быстрый, но нужен доступ к каталогу и его собственное резервное копирование .

Для одиночных картинок (фото товара, скан печати, логотип организации) достаточно ХранилищеЗначения. Если изображений много и они тяжёлые — используйте присоединённые файлы с томами, не раздувайте таблицы объектов.

Где хранить изображения в вашей задаче?

Как добавить фото в справочник вручную, без программирования

Если конфигурация типовая и реквизит под картинку уже есть, вставить изображение можно прямо в режиме 1С:Предприятие, без конфигуратора.

Самый частый случай — фото номенклатуры. В «Управлении торговлей» и «Рознице» у номенклатуры есть присоединённые файлы и поле изображения:

  1. Откройте карточку товара в справочнике Номенклатура.
  2. Найдите область изображения в карточке (обычно слева сверху или на отдельной вкладке с файлами).
  3. Нажмите команду добавления картинки и выберите файл на диске.
  4. Запишите элемент.

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

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

Поддерживаемые форматы для показа на форме — PNG, JPG, BMP, GIF. Слишком большие файлы лучше заранее уменьшить: на экране карточки картинка всё равно масштабируется, а в базе занимает полный размер оригинала.

Реквизит ХранилищеЗначения: настройка хранения в конфигураторе

Когда своего поля под изображение нет, его заводят в конфигураторе. Базовая схема — реквизит-хранилище плюс поле на форме.

Шаг 1. Добавить реквизит объекту. В дереве конфигурации откройте нужный объект (например справочник), добавьте реквизит и задайте тип ХранилищеЗначения. В этом реквизите будут лежать двоичные данные картинки.

Шаг 2. Разместить поле на форме. На форме элемента добавьте реквизит формы типа Картинка (именно Картинка, а не ХранилищеЗначения — поле формы умеет рисовать только Картинка). Свяжите его с элементом формы «Поле картинки».

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

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

Присоединённые файлы вместо реквизита: когда картинок много

Если изображений десятки на объект или они тяжёлые, реквизит в объекте — плохой выбор: база раздувается, а показать несколько картинок одним полем не получится. В типовых конфигурациях на БСП для этого есть механизм присоединённых файлов (подсистема «Работа с файлами»).

Как это выглядит на практике:

  1. В карточке объекта (номенклатура, контрагент, физлицо) есть команда или гиперссылка для работы с файлами — «Файлы», «Присоединённые файлы» или значок скрепки.
  2. По этой команде открывается список файлов объекта. Через добавление выбираете картинку с диска, она загружается и привязывается к объекту.
  3. Файлов можно привязать сколько угодно: несколько фото товара, сканы, чертежи.

Где физически лежат такие файлы, зависит от настройки томов. По умолчанию в файловой базе они внутри базы, а в клиент-серверном варианте их обычно выносят на диск. Настраивается это в разделе Администрирование → Настройки работы с файлами (точное название пункта может отличаться по конфигурации) — там включают хранение в томах и указывают каталог тома на сервере.

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

Чтобы получить такое изображение программно для вывода в макет, в типовых конфигурациях используют методы работы с файлами из БСП (получение двоичных данных файла по ссылке). Конкретные имена процедур зависят от версии библиотеки — смотрите общий модуль работы с файлами в вашей конфигурации, а не придумывайте вызовы наугад.

Как загрузить картинку из файла программно

Код зависит от того, где выполняется загрузка. На тонком и веб-клиенте прямого доступа к файловой системе сервера нет, поэтому файл сначала передают механизмом помещения файлов.

Распаковать картинку из хранилища при открытии формы. В обработчике ПриСозданииНаСервере достаём объект Картинка из реквизита и кладём в реквизит формы:

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

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

Выбрать файл и загрузить его в поле. На управляемой форме выбор файла делают через НачатьПомещениеФайла. Файл попадает во временное хранилище, оттуда данные читают на сервере:

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

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

&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
    Картинка = Новый Картинка(ДвоичныеДанные);
КонецПроцедуры

Упаковать картинку обратно при записи. Чтобы изображение сохранилось в базе, перед записью объекта данные поля кладут в ХранилищеЗначения:

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

Конструктор Новый ХранилищеЗначения(Картинка, Новый СжатиеДанных()) сожмёт данные перед сохранением. Для JPG и PNG выигрыш почти нулевой — они уже сжаты, так что сжатие нужно скорее для несжатых BMP.

В толстом клиенте файлового варианта доступен прямой конструктор Новый Картинка("C:\foto\tovar.png") — он принимает путь к файлу. Но завязываться на локальный путь не стоит: на сервере и у других пользователей такого каталога не будет. Универсальный способ — через временное хранилище, показанный выше.

Как вывести изображение в печатный макет

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

Если рисунок один и постоянный (например логотип):

  1. Откройте макет в конфигураторе (или макет во внешней обработке).
  2. На панели вставьте рисунок, выберите тип «Картинка» и загрузите файл.
  3. Задайте рисунку имя в его свойствах.
  4. Расположите его в нужной области макета.

При формировании печатной формы такой рисунок выводится сам, кодом его трогать не надо — он часть области.

Если картинка меняется (фото конкретного товара из базы), в макете размещают пустой рисунок-картинку с именем, а значение подставляют кодом при заполнении области:

Макет = Обработки.ПечатьПрайса.ПолучитьМакет("Макет");
Область = Макет.ПолучитьОбласть("СтрокаТовара");

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

ТабДок.Вывести(Область);

Здесь ФотоТовара — имя рисунка в макете, который вы задали на шаге с именем. Если имя не совпадёт — платформа не найдёт рисунок и выдаст ошибку.

Размер рисунка в макете фиксирован рамкой, которую вы нарисовали. Если исходные фото разного размера, задайте рисунку способ размещения «Пропорционально» в свойствах, иначе изображения растянутся и исказятся.

Частые ошибки при вставке картинок и как их устранить

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

Ещё несколько моментов, которые экономят время:

  • 🖼️ Формат. Для экрана и печати берите PNG (без фона) или JPG (фото). GIF и BMP платформа покажет, но BMP занимает много места.
  • 📐 Размер. Уменьшайте фото до разумного разрешения перед загрузкой. Полноразмерные снимки с телефона в базе не нужны — они только раздувают таблицы.
  • 🔁 Прозрачность на печати. Прозрачный фон PNG в табличном документе отображается корректно, но при экспорте в некоторые форматы фон может стать белым — проверяйте результат печати.
  • 🧩 Расширение вместо правки типовой. Новый реквизит под картинку, поле на форме и макет с рисунком добавляйте расширением конфигурации. Так основная конфигурация остаётся на поддержке и обновляется штатно.
  • 🧪 Проверяйте на тонком клиенте. Код, который работает в толстом клиенте файловой базы (прямой путь к файлу), часто падает на тонком и веб-клиенте. Тестируйте в том режиме, в котором реально работают пользователи.

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

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

Можно ли вставить картинку без конфигуратора?
Да, если в конфигурации уже есть поле под изображение или механизм присоединённых файлов. Тогда картинку добавляют прямо в карточке объекта в режиме 1С:Предприятие. Если поля нет, без доработки в конфигураторе (лучше через расширение) не обойтись.
Чем отличаются типы Картинка и ХранилищеЗначения?
Картинка — объект для показа и печати, живёт на форме и в макете, в базе напрямую не хранится. ХранилищеЗначения — универсальный контейнер двоичных данных для долговременного хранения в реквизите объекта. При показе данные распаковывают из хранилища в Картинка, при сохранении — упаковывают обратно.
Почему картинка тяжёлая, а база растёт?
Изображение целиком лежит внутри таблиц объекта. Тысяча фотографий по несколько сотен килобайт — это сотни мегабайт в базе и в каждом бэкапе. Для больших объёмов используйте присоединённые файлы с томами хранения, чтобы файлы лежали на диске, а не в базе.
Как загрузить картинку из файла на веб-клиенте?
Прямого доступа к диску у веб-клиента нет. Используйте НачатьПомещениеФайла: платформа сама покажет диалог выбора, передаст файл во временное хранилище, а на сервере вы прочитаете данные через ПолучитьИзВременногоХранилища.
Как подставить разные фото товаров в один макет?
В макете разместите рисунок типа «Картинка» с именем и пустым значением. При выводе каждой строки присваивайте Область.Рисунки.ИмяРисунка.Картинка распакованное из хранилища изображение конкретного товара.