Фото товара, логотип, печать, рисунок в макете: куда и как добавить изображение в 1С 8.3
Содержание
Вставить картинку в 1С проще всего через карточку объекта: в карточке номенклатуры щёлкните по пустой области изображения и выберите файл с диска, а логотип и печать загружаются в карточке организации, в группе «Логотип и печать». Для рисунка в печатной форме или отчёте откройте табличный документ и выберите в главном меню Таблица → Рисунки → Картинка.
Дальше всё зависит от того, кто вы. Пользователю хватит режима 1С:Предприятие и пары кликов. Программисту нужно решить, где хранить файл, как показать его на форме и не раздуть базу на десятки гигабайт. Ниже оба сценария, с кодом и типичными сбоями.
Какой способ добавить картинку выбрать
Сначала определите, что именно нужно: показать фото в карточке, вывести логотип на печать или нарисовать иконку на кнопке. От этого зависит инструмент.
| Задача | Где делается | Кто делает | Права в базе |
|---|---|---|---|
| Фото товара в карточке номенклатуры | Режим 1С:Предприятие | Пользователь | Изменение справочника |
| Логотип, печать, подписи для счёта | Карточка организации | Бухгалтер | Изменение организации |
| Файл-скан к документу (накладная, договор) | Присоединённые файлы | Пользователь | Работа с файлами |
| Рисунок в своём отчёте или бланке | Табличный документ | Пользователь | Не нужны особые |
| Иконка на кнопке, картинка на форме | Конфигуратор, общие картинки | Разработчик | Администратор |
| Загрузка фото из кода, с камеры | Модуль формы | Разработчик | Администратор |
Как вставить картинку в 1С:Предприятии без Конфигуратора
Типовые конфигурации на БСП (Бухгалтерия 3.0, Управление торговлей 11, ЗУП 3.1, Комплексная автоматизация) уже умеют хранить изображения. Пользователю ничего дорабатывать не нужно.
Фото в карточке номенклатуры
- Откройте
Справочники → Товары и услуги → Номенклатура(в Бухгалтерии 3.0) или разделНСИ и администрирование, ссылка «Номенклатура» (в УТ 11). - Откройте карточку нужной позиции.
- Щёлкните по пустому полю картинки в карточке.
- Выберите файл на диске: PNG, JPG, BMP или GIF.
- Нажмите
Записать и закрыть.
Картинка сохраняется как присоединённый файл номенклатуры и становится её основным изображением. Остальные фото того же товара можно добавить через кнопку со скрепкой, а потом выбрать, какое показывать в карточке.
Фото со смартфона весит 3–8 МБ. Перед загрузкой уменьшите его до 800–1200 пикселей по длинной стороне. В карточке разницы не видно, а база на тысячу товаров легче на несколько гигабайт.
Логотип, печать и подписи организации
- Откройте
Главное → Организациии карточку своей организации. - Разверните группу «Логотип и печать».
- Загрузите логотип, оттиск печати, подписи руководителя и главного бухгалтера, каждый своей командой загрузки.
- Запишите карточку.
Теперь в счёте на оплату откройте меню печати и выберите вариант «Счёт на оплату (с печатью и подписями)». Обычный вариант печатает документ без факсимиле.
Печать и подписи сканируйте на белом листе и сохраняйте в PNG с прозрачным фоном. Белый прямоугольник вокруг оттиска закроет сумму прописью и строку «Руководитель».
Факсимиле подписи заменяет живую подпись только там, где это согласовано с контрагентом. Для счёта на оплату обычно годится, для актов и накладных лучше уточнить договор.
Скан или фото, приложенные к документу
В форме любого документа или справочника на БСП есть кнопка со скрепкой. Она открывает список присоединённых файлов:
- 📎 перетащите файл в список мышью или выберите его через команду добавления;
- 📷 сканируйте сразу из 1С, если настроен сканер (команда сканирования есть в том же списке);
- 🔍 откройте файл двойным щелчком, он запустится в программе просмотра Windows.
Такой файл не появляется на печатной форме. Он просто хранится вместе с документом.
Рисунок в табличном документе
Нужен логотип в своём бланке или подпись в выгруженном отчёте:
- Откройте табличный документ: сформированный отчёт или новый файл через
Файл → Новый → Табличный документ. - Выделите ячейку, рядом с которой должен стоять рисунок.
- В главном меню выберите
Таблица → Рисунки → Картинка. - Укажите файл, поставьте рисунок на место и растяните за маркеры.
- Сохраните документ в MXL, если планируете переиспользовать бланк.
Сформированный отчёт при повторном формировании перерисуется, и картинка пропадёт. Вставляйте её в уже готовый результат перед печатью или сохраняйте копию.
Добавление картинок в конфигурацию через Конфигуратор
Здесь начинается работа разработчика. Изменения в типовой конфигурации на поддержке лучше делать в расширении: так обновления не затрут доработку.
Общая картинка (библиотека картинок)
- Откройте
Конфигурация → Открыть конфигурацию. - В дереве метаданных разверните
Общие → Общие картинки. - Нажмите
Добавить, задайте имя латиницей или кириллицей без пробелов, напримерЛоготипКомпании. - В окне свойств откройте картинку и выберите файл.
- Сохраните и обновите конфигурацию базы данных (
F7).
Теперь картинку видно во всех свойствах типа «Картинка» в выпадающем списке библиотеки. Из кода она доступна как БиблиотекаКартинок.ЛоготипКомпании.
Для иконок кнопок берите размер 16×16 пикселей. Общая картинка может хранить несколько вариантов под разную плотность экрана: тогда на мониторах с масштабом 150–200 % иконки не размываются.
Картинка на форме
Два элемента решают разные задачи:
| Элемент | Что показывает | Когда брать |
|---|---|---|
| Декорация «Картинка» | Одна и та же картинка всегда | Логотип в шапке, иллюстрация-подсказка |
| Поле картинки | Данные реквизита, у каждого объекта свои | Фото товара, сотрудника, скан |
Для декорации достаточно указать в свойстве Картинка общую картинку из библиотеки. Поле картинки привязывают к реквизиту формы типа Строка: в нём лежит адрес картинки во временном хранилище или навигационная ссылка на реквизит объекта.
Реквизит для хранения
В справочнике добавьте реквизит типа ХранилищеЗначения, например Картинка. Тип ДвоичныеДанные для реквизитов объектов не подходит: хранить двоичные данные в базе можно только через хранилище значения.
Программная загрузка изображения: код для формы
Пример ниже решает задачу целиком: пользователь выбирает файл, видит картинку на форме, при записи она сохраняется в реквизит Картинка (тип ХранилищеЗначения), при открытии карточки показывается снова.
На форме создайте реквизит АдресКартинки (тип Строка), поле картинки с путём к данным АдресКартинки и команду ЗагрузитьКартинку.
&НаКлиенте
Процедура ЗагрузитьКартинку(Команда)
Оповещение = Новый ОписаниеОповещения("ЗагрузитьКартинкуЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьКартинкуЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат; // пользователь отменил выбор
КонецЕсли;
АдресКартинки = Адрес;
Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресКартинки);
ТекущийОбъект.Картинка = Новый ХранилищеЗначения(ДвоичныеДанные);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
Если ТекущийОбъект.Картинка.Получить() <> Неопределено Тогда
АдресКартинки = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "Картинка");
КонецЕсли;
КонецПроцедуры
Что здесь важно:
- 🧷
УникальныйИдентификаторформы привязывает временное хранилище к форме. Закрыли форму без записи, и данные удалятся сами. - 🌐 Навигационная ссылка работает и в тонком клиенте, и в веб-клиенте. Тащить двоичные данные на клиент не нужно.
- 🗜 Сжатие в
ХранилищеЗначениядля JPG и PNG почти ничего не даёт: эти форматы уже сжаты.
Картинка в макете печатной формы
В макете нарисуйте рисунок-картинку и дайте ему имя, например Логотип. При формировании подставьте данные:
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ДанныеЛоготипа = Организация.Логотип.Получить(); // реквизит типа ХранилищеЗначения
Если ТипЗнч(ДанныеЛоготипа) = Тип("ДвоичныеДанные") Тогда
ОбластьШапка.Рисунки.Логотип.Картинка = Новый Картинка(ДанныеЛоготипа);
КонецЕсли;
ТабДок.Вывести(ОбластьШапка);
Чтобы логотип не растягивался, в свойствах рисунка в макете поставьте размер картинки «Пропорционально».
Рисунок можно добавить и без заготовки в макете:
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = БиблиотекаКартинок.ЛоготипКомпании;
Рисунок.Расположить(ТабДок.Область("R1C1:R4C3"));
Картинку из файла на сервере создают конструктором Новый Картинка("D:\Images\logo.png"). Путь должен быть доступен пользователю, от имени которого запущен сервер 1С, а не вашему пользователю Windows.
Почему картинка не отображается: типичные ошибки
Как не раздуть базу: оптимизация работы с изображениями
Картинки чаще всего становятся причиной, по которой файловая база внезапно весит 20 ГБ, а выгрузка в DT идёт час.
Простые правила:
- 📏 Ограничивайте размер на входе. Проверьте
ДвоичныеДанные.Размер()и откажитесь от записи, если файл больше, скажем, 2 МБ, с понятным сообщением пользователю. - 🖼 Логотипы и печати храните в PNG, фото в JPG. BMP занимает в 5–10 раз больше места при той же картинке.
- 🧺 Не читайте хранилище в запросах к спискам. Получение поля
ХранилищеЗначенияв запросе для 5 000 строк тянет все картинки с сервера. - 🪶 Для списка с превью храните отдельную маленькую копию (150–200 пикселей) и показывайте только её.
- 🔗 Показывайте картинку по навигационной ссылке, а не через
Получить()с передачей на клиент.
Уменьшенную копию проще подготовить до загрузки, в любом редакторе изображений: пакетное сжатие сотни фото занимает пару минут.
Где ещё хранить изображения: альтернативы реквизиту
Реквизит ХранилищеЗначения в самом объекте прост, но не единственный вариант.
| Способ | Плюсы | Минусы |
|---|---|---|
Реквизит ХранилищеЗначения в объекте | Просто, картинка всегда с объектом | Объект «тяжелеет», читается дольше |
| Присоединённые файлы (БСП) | Много файлов на объект, версии, готовый интерфейс | Нужна БСП в конфигурации |
| Тома на диске (настройка работы с файлами БСП) | База не растёт, файлы лежат в папке сервера | Папку нужно включать в резервное копирование отдельно |
| Отдельный регистр сведений «Объект → картинка» | Объект лёгкий, картинку читают только по запросу | Нужен код записи и чтения |
| Путь или URL на внешний ресурс | База не растёт вообще | Ссылка ломается при переносе файлов, нет контроля доступа |
В типовых конфигурациях хранение файлов в томах включается в разделе Администрирование, в настройках работы с файлами.
Если включили тома, папку томов обязательно добавьте в резервное копирование . Выгрузка DT не содержит файлов из томов, и после восстановления базы все картинки окажутся пустыми ссылками.
Фото с камеры в мобильном приложении 1С
В мобильной платформе есть доступ к камере через СредстваМультимедиа. Сначала проверьте, что устройство умеет снимать, затем получите двоичные данные снимка:
&НаКлиенте
Процедура СделатьФото(Команда)
#Если МобильноеПриложениеКлиент Тогда
Если Не СредстваМультимедиа.ПоддерживаетсяФотоснимок() Тогда
Сообщить("Камера на устройстве недоступна");
Возврат;
КонецЕсли;
ДанныеФото = СредстваМультимедиа.СделатьФотоснимок();
Если ДанныеФото = Неопределено Тогда
Возврат; // пользователь отменил съёмку
КонецЕсли;
АдресКартинки = ПоместитьВоВременноеХранилище(ДанныеФото.ПолучитьДвоичныеДанные(), УникальныйИдентификатор);
Модифицированность = Истина;
#КонецЕсли
КонецПроцедуры
Дальше запись идёт тем же кодом ПередЗаписьюНаСервере, что и в настольной версии.
Ещё два нюанса мобильной работы:
- 📶 Снимок современного телефона весит несколько мегабайт. При синхронизации с центральной базой через мобильный интернет это заметно, поэтому проверяйте размер до отправки.
- 🔐 В разрешениях мобильного приложения должна быть включена работа с камерой, иначе метод не сработает.
В мобильном клиенте (когда телефон подключается к обычной базе) отдельного кода не нужно: стандартный выбор файла предлагает галерею или камеру, а картинка попадает в базу через присоединённые файлы.
Частые вопросы
Можно ли вставить картинку в 1С, если нет прав на изменение справочника?
Какие форматы картинок понимает 1С?
Как перенести картинки номенклатуры в другую базу?
Как выгрузить все картинки номенклатуры в папку?
Записать() в файлы с именем по коду товара.