Добавляем изображения в 1С: справочники, печать и код
Содержание
Картинку в 1С добавляют по-разному, и способ зависит от задачи. Нужен логотип в счёте или акте — его загружают в карточку организации, без программирования. Нужно фото номенклатуры или сотрудника в справочнике — заводят реквизит типа ХранилищеЗначения и поле картинки на форме. Нужна иконка команды в интерфейсе — рисунок кладут в общие картинки конфигурации.
Ниже — все рабочие сценарии для платформы 8.3 с интерфейсом «Такси»: хранение изображений в справочниках, логотипы в печатных формах, сборка сложной вёрстки через HTML-макет, работа с объектом Картинка во встроенном языке и хранение больших объёмов графики так, чтобы база не распухала.
Логотип и печать в документах «Бухгалтерии» без программирования
Самая частая задача — чтобы на счёте, акте или УПД печатались логотип, печать и подпись. В «1С:Бухгалтерии 3.0» это настраивается прямо из пользовательского режима.
- Откройте раздел
Главное → Организациии зайдите в карточку своей организации. - В карточке найдите ссылку
Логотип и печать. - Загрузите три изображения: логотип, факсимильную подпись руководителя (и бухгалтера, если нужна) и оттиск печати.
- Нажмите
Записать и закрыть.
После этого при печати счёта на оплату и ряда других форм логотип и факсимиле подставятся автоматически — в самой печатной форме есть галочка вроде Подпись и печать.
Готовьте изображения на прозрачном фоне (PNG). Печать и подпись на белом фоне перекроют текст и линии таблицы.
Требования к файлам простые: логотип — примерно до нескольких сотен килобайт, подпись и печать — компактные PNG. Слишком большой файл замедлит формирование печати и раздует хранилище настроек.
Если вашей типовой печатной формы нет галочки для логотипа, его добавляют уже на уровне макета — об этом ниже.
Картинка в карточке справочника: реквизит и поле картинки
Чтобы хранить изображение в элементе справочника (фото товара, сотрудника, скан), в типовой конфигурации с «Библиотекой стандартных подсистем» это чаще делают через присоединённые файлы. Но если нужна именно картинка в самой карточке, подойдёт классическая схема «реквизит + поле картинки».
На уровне конфигуратора:
- У справочника добавьте реквизит, например
Фото, с типомХранилищеЗначения. Этот тип хранит в себе произвольные двоичные данные, в том числе изображение. - На форме элемента добавьте элемент
Полеи задайте ему видПоле картинки. - В свойстве
ПутьКДаннымполя укажите этот реквизit объекта.
ХранилищеЗначения нельзя показать на форме напрямую — его сначала распаковывают в объект Картинка. Поэтому при открытии формы картинку достают из хранилища, а при загрузке нового файла — кладут обратно.
// Показать картинку из реквизита при открытии формы
&НаСервере
Процедура ПриСозданииНаСервереЗагрузкаФото()
Если Объект.Фото <> Неопределено И Объект.Фото.Получить() <> Неопределено Тогда
ЭтаФорма.Картинка = Объект.Фото;
КонецЕсли;
КонецПроцедуры
Загрузку файла с диска удобно делать через стандартный механизм помещения файла: пользователь выбирает файл, платформа кладёт его во временное хранилище, а вы упаковываете данные в реквизит. Так работает и тонкий клиент, и веб-клиент — локальный путь к файлу на сервере недоступен, а помещение файла работает везде.
Не пытайтесь на сервере обратиться к файлу по локальному пути с машины пользователя (C:\...). В клиент-серверном и веб-варианте сервер этот диск не видит. Файл сначала помещают во временное хранилище на клиенте, а уже потом обрабатывают на сервере.
Если конфигурация типовая и менять её не хочется, используйте раздел работы с файлами («Присоединённые файлы»): к элементу справочника можно прикрепить изображение без изменения структуры метаданных.
Общие картинки и иконки команд в интерфейсе «Такси»
Картинки в самом интерфейсе — иконки у кнопок, команд, групп — берутся из двух источников: встроенной библиотеки картинок платформы и общих картинок конфигурации.
Встроенная библиотека — это готовый набор платформы. В свойстве команды или кнопки Картинка открывается диалог выбора, где на одной вкладке лежат стандартные картинки, на другой — ваши собственные.
Чтобы добавить свою иконку:
- В дереве конфигурации раскройте ветку
Общие → Общие картинки. - Добавьте новую общую картинку и загрузите файл (обычно PNG с прозрачным фоном).
- Задайте осмысленное имя — по нему вы будете находить картинку в диалоге выбора.
- В свойстве
Картинканужной команды, кнопки или группы выберите её на вкладке с картинками конфигурации.
Для «Такси» важен размер и прозрачность. Платформа масштабирует иконки под разные режимы интерфейса, поэтому берите квадратное изображение с запасом по качеству и прозрачным фоном — иначе иконка будет с белым квадратом вокруг.
Для одной команды можно задать картинку сразу для обычного и для масштабированного режима, добавив в общую картинку несколько вариантов разного размера. Платформа сама подберёт нужный под текущее разрешение.
Общие картинки используются и на формах — например, как декоративный элемент в поле картинки с фиксированным изображением, у которого в свойстве указана не ссылка на данные, а конкретная картинка из конфигурации.
Рисунок в макете печатной формы
Когда логотип нужно печатать на форме, где типовой галочки нет, его вставляют в макет табличного документа.
- Откройте нужный макет (например, через расширение конфигурации , чтобы не менять типовую) — это табличный документ.
- На панели работы с табличным документом выберите вставку рисунка.
- Вставьте картинку из файла или из общих картинок конфигурации.
- Разместите и растяните рисунок над нужными ячейками, задайте ему имя.
Есть два принципиально разных способа положить рисунок в макет:
- Статичный рисунок — картинка жёстко лежит в макете. Подходит для постоянного логотипа компании.
- Рисунок с данными — у объекта «Рисунок» в свойстве указывается имя параметра, а изображение подставляется из кода при формировании. Так печатают, например, печать и подпись конкретной организации из документа.
Во втором случае в модуле печати присваивают картинку по имени объекта:
// Подставить логотип в макет при формировании печати
Макет = ПолучитьМакет("ПечатьСчёта");
Рисунок = Макет.Рисунки.Логотип;
Рисунок.Картинка = ЛоготипОрганизации; // объект типа Картинка
Правку типовых макетов делайте через расширение конфигурации (появились в 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 с прозрачностью.
- Правка макета в основной конфигурации. После обновления типовой макет вернётся к исходному, и логотип пропадёт. Меняйте макеты через расширение.
- Обращение к локальному файлу на сервере. В клиент-серверной и веб-базе сервер не видит диск пользователя. Файл помещают через временное хранилище.
- Попытка показать
ХранилищеЗначенияв поле картинки напрямую. Поле картинки работает с объектомКартинка, поэтому данные из хранилища сначала распаковывают методомПолучить(). - Гигантские изображения в базе. Фото в полном разрешении раздувают базу и тормозят выгрузку. Уменьшайте размер и переносите хранение в тома.
Частые вопросы
В каком формате загружать логотип и печать?
Чем отличаются присоединённые файлы от реквизита с картинкой?
ХранилищеЗначения хранит одну картинку в самой карточке и требует доработки структуры.Почему картинка не отображается в поле на форме?
ХранилищеЗначения, а не распакованный объект Картинка. Достаньте картинку методом Получить() и присвойте связанному реквизиту формы.