Добавляем изображения в 1С: справочники, печать и код

· 9 мин

Содержание

Картинку в 1С добавляют по-разному, и способ зависит от задачи. Нужен логотип в счёте или акте — его загружают в карточку организации, без программирования. Нужно фото номенклатуры или сотрудника в справочнике — заводят реквизит типа ХранилищеЗначения и поле картинки на форме. Нужна иконка команды в интерфейсе — рисунок кладут в общие картинки конфигурации.

Ниже — все рабочие сценарии для платформы 8.3 с интерфейсом «Такси»: хранение изображений в справочниках, логотипы в печатных формах, сборка сложной вёрстки через HTML-макет, работа с объектом Картинка во встроенном языке и хранение больших объёмов графики так, чтобы база не распухала.

Логотип и печать в документах «Бухгалтерии» без программирования

Самая частая задача — чтобы на счёте, акте или УПД печатались логотип, печать и подпись. В «1С:Бухгалтерии 3.0» это настраивается прямо из пользовательского режима.

  1. Откройте раздел Главное → Организации и зайдите в карточку своей организации.
  2. В карточке найдите ссылку Логотип и печать.
  3. Загрузите три изображения: логотип, факсимильную подпись руководителя (и бухгалтера, если нужна) и оттиск печати.
  4. Нажмите Записать и закрыть.

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

Готовьте изображения на прозрачном фоне (PNG). Печать и подпись на белом фоне перекроют текст и линии таблицы.

Требования к файлам простые: логотип — примерно до нескольких сотен килобайт, подпись и печать — компактные PNG. Слишком большой файл замедлит формирование печати и раздует хранилище настроек.

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

Картинка в карточке справочника: реквизит и поле картинки

Чтобы хранить изображение в элементе справочника (фото товара, сотрудника, скан), в типовой конфигурации с «Библиотекой стандартных подсистем» это чаще делают через присоединённые файлы. Но если нужна именно картинка в самой карточке, подойдёт классическая схема «реквизит + поле картинки».

На уровне конфигуратора:

  1. У справочника добавьте реквизит, например Фото, с типом ХранилищеЗначения. Этот тип хранит в себе произвольные двоичные данные, в том числе изображение.
  2. На форме элемента добавьте элемент Поле и задайте ему вид Поле картинки.
  3. В свойстве ПутьКДанным поля укажите этот реквизit объекта.

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

// Показать картинку из реквизита при открытии формы
&НаСервере
Процедура ПриСозданииНаСервереЗагрузкаФото()
    Если Объект.Фото <> Неопределено И Объект.Фото.Получить() <> Неопределено Тогда
        ЭтаФорма.Картинка = Объект.Фото;
    КонецЕсли;
КонецПроцедуры

Загрузку файла с диска удобно делать через стандартный механизм помещения файла: пользователь выбирает файл, платформа кладёт его во временное хранилище, а вы упаковываете данные в реквизит. Так работает и тонкий клиент, и веб-клиент — локальный путь к файлу на сервере недоступен, а помещение файла работает везде.

Не пытайтесь на сервере обратиться к файлу по локальному пути с машины пользователя (C:\...). В клиент-серверном и веб-варианте сервер этот диск не видит. Файл сначала помещают во временное хранилище на клиенте, а уже потом обрабатывают на сервере.

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

Общие картинки и иконки команд в интерфейсе «Такси»

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

Встроенная библиотека — это готовый набор платформы. В свойстве команды или кнопки Картинка открывается диалог выбора, где на одной вкладке лежат стандартные картинки, на другой — ваши собственные.

Чтобы добавить свою иконку:

  1. В дереве конфигурации раскройте ветку Общие → Общие картинки.
  2. Добавьте новую общую картинку и загрузите файл (обычно PNG с прозрачным фоном).
  3. Задайте осмысленное имя — по нему вы будете находить картинку в диалоге выбора.
  4. В свойстве Картинка нужной команды, кнопки или группы выберите её на вкладке с картинками конфигурации.

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

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

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

Рисунок в макете печатной формы

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

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

Есть два принципиально разных способа положить рисунок в макет:

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

Во втором случае в модуле печати присваивают картинку по имени объекта:

// Подставить логотип в макет при формировании печати
Макет = ПолучитьМакет("ПечатьСчёта");
Рисунок = Макет.Рисунки.Логотип;
Рисунок.Картинка = ЛоготипОрганизации; // объект типа Картинка

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

Печать сложной вёрстки через HTML-макет

Табличный документ удобен для бланков с таблицами, но плохо справляется с письмами, многоколоночной вёрсткой и свободным обтеканием текста вокруг картинки. Для этого в 1С есть макет типа HTML-документ.

HTML-макет — это по сути HTML-страница с параметрами. Картинку в неё вставляют тегом <img>, а источник изображения задают одним из двух способов:

  • Внешняя ссылка — <img src="https://...">. Простой, но ненадёжный способ: при печати без интернета или на другой машине картинка не загрузится.
  • Встраивание в сам документ (base64) — изображение кодируется в строку и подставляется прямо в тег: <img src="data:image/png;base64,...">. Тогда картинка «вшита» в макет и не зависит от внешних источников.

Для второго способа картинку сначала переводят в двоичные данные, затем кодируют в base64 и подставляют в HTML-шаблон:

// Встроить картинку в HTML как base64
ДвоичныеДанные = Логотип.ПолучитьДвоичныеДанные();
Base64Строка = Base64Строка(ДвоичныеДанные);
ТекстКартинки = "data:image/png;base64," + Base64Строка;
ИтоговыйHTML = СтрЗаменить(ШаблонHTML, "%ЛОГОТИП%", ТекстКартинки);

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

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

Объект Картинка во встроенном языке

Все способы выше в конечном счёте опираются на тип Картинка — это представление изображения во встроенном языке 1С. Разберём базовые операции.

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

// Из двоичных данных (универсальный способ)
Картинка = Новый Картинка(ДвоичныеДанные);

Сохранение в реквизит. Картинку упаковывают в ХранилищеЗначения — при желании со сжатием:

// Положить картинку в реквизит со сжатием
Объект.Фото = Новый ХранилищеЗначения(Картинка, Новый СжатиеДанных(9));

Получение обратно. Из хранилища картинку достают методом Получить() и присваивают реквизиту формы, связанному с полем картинки:

// Достать картинку из реквизита
ТекущаяКартинка = Объект.Фото.Получить();

Выгрузка в файл или двоичные данные. У объекта Картинка есть метод получения двоичных данных — их можно записать в файл, отправить по почте или встроить в HTML:

Данные = Картинка.ПолучитьДвоичныеДанные();

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

Ниже — короткая подсказка, какой способ выбрать под вашу задачу.

Куда нужно добавить картинку?

Как хранить большие объёмы графики без раздувания базы

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

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

Что это даёт:

  • 📉 Таблицы базы перестают расти от картинок — размер базы стабилизируется.
  • ⚡ Резервное копирование и выгрузка базы ускоряются, потому что картинки лежат отдельно.
  • 🗂 Файлы в томе можно бэкапить обычными средствами файловой системы.

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

Пара практических замечаний по размеру:

  • Сжимать уже сжатый JPEG или PNG через СжатиеДанных почти бесполезно — выигрыша по объёму не будет, только лишняя нагрузка. Сжатие имеет смысл для несжатых форматов.
  • Перед загрузкой уменьшайте разрешение до разумного. Для карточки товара хватает изображения в несколько сотен пикселей по стороне — хранить исходник с телефона на 12 мегапикселей смысла нет.

Частые ошибки и как их избежать

Несколько мест, где чаще всего спотыкаются.

  • Логотип на белом фоне. На печати белый прямоугольник перекрывает рамку таблицы и текст. Используйте PNG с прозрачностью.
  • Правка макета в основной конфигурации. После обновления типовой макет вернётся к исходному, и логотип пропадёт. Меняйте макеты через расширение.
  • Обращение к локальному файлу на сервере. В клиент-серверной и веб-базе сервер не видит диск пользователя. Файл помещают через временное хранилище.
  • Попытка показать ХранилищеЗначения в поле картинки напрямую. Поле картинки работает с объектом Картинка, поэтому данные из хранилища сначала распаковывают методом Получить().
  • Гигантские изображения в базе. Фото в полном разрешении раздувают базу и тормозят выгрузку. Уменьшайте размер и переносите хранение в тома.

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

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