Разработка и Конфигурация · 11 мин
Как вывести картинку в 1С: форма, печать, отчёт
Как вывести картинку в 1С: поле картинки на форме, изображение из справочника, картинка в макете печатной формы и в отчёте СКД. Пошаговые инструкции и код.
Вывод картинки в 1С — задача с несколькими разными сценариями: показать фото товара на форме элемента справочника, вставить логотип в печатную форму счёта, отобразить изображение в отчёте или в табличном документе. В каждом случае используются свои механизмы платформы, и универсального «одного способа» нет.
Ключевой момент — откуда берётся изображение. Картинка может храниться в базе данных (в реквизите типа «ХранилищеЗначения»), лежать в файле на диске, быть частью библиотеки картинок конфигурации или размещаться в макете. От источника зависит и код, и способ настройки.
Материал ориентирован на управляемые формы (такси-интерфейс), которые используются в актуальных конфигурациях вроде «1С:Бухгалтерия», «1С:Управление торговлей» и «1С:ERP». Отдельно разобраны печатные формы и отчёты на СКД, где вывод картинки устроен иначе.
Откуда 1С может взять картинку: четыре источника
Перед настройкой определите источник изображения — от этого зависит вся дальнейшая схема. Первый вариант — реквизит объекта с типом «ХранилищеЗначения», где картинка лежит внутри самой базы. Так обычно хранят фото товаров и сотрудников: надёжно, резервные копии захватывают изображения автоматически, но база растёт в размере.
Второй источник — файл на диске или в сетевом каталоге. Подходит, когда изображения обновляются внешними системами, но требует доступности пути с сервера 1С и ломается при переносе файлов. Третий вариант — библиотека картинок конфигурации (общие картинки): статичные иконки и логотипы, встроенные в конфигурацию. Четвёртый — картинка, вставленная прямо в макет печатной формы.
Сравнение вариантов хранения
Надёжно, картинки входят в бэкап; минус — рост размера базы при большом числе фото
База не раздувается, удобно для больших каталогов изображений; минус — зависимость от доступности пути и прав доступа
Подходит для логотипов и иконок, не требует кода; минус — меняется только через конфигуратор
Статичный логотип печатной формы; минус — не подходит для динамических изображений
Как вывести картинку на форме элемента справочника
Типовая задача — показать фото номенклатуры на карточке товара. Схема для управляемой формы выглядит так: в объекте есть реквизит с типом «ХранилищеЗначения» (например, «ДанныеКартинки»), а на форме создаётся строковый реквизит, например «АдресКартинки», в который помещается адрес двоичных данных во временном хранилище.
Затем на форму добавляется элемент вида «Поле картинки», в свойстве «ПутьКДанным» которого указывается реквизит «АдресКартинки». Свойство «РазмерКартинки» удобно установить в «Пропорционально», чтобы изображение не искажалось. При открытии формы и после записи картинку нужно извлечь из хранилища и положить во временное хранилище формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДанныеКартинки = Объект.ДанныеКартинки.Получить();
Если ДанныеКартинки <> Неопределено Тогда
АдресКартинки = ПоместитьВоВременноеХранилище(ДанныеКартинки, УникальныйИдентификатор);
КонецЕсли;
КонецПроцедурыЗагрузка новой картинки делается через диалог выбора файла и метод НачатьПомещениеФайла: выбранный файл помещается во временное хранилище, затем на сервере его двоичные данные записываются в реквизит-хранилище объекта. После записи адрес обновляется, чтобы пользователь сразу увидел новое изображение.
- 1Добавьте в объект реквизит типа ХранилищеЗначения для данных картинки
- 2Создайте на форме строковый реквизит для адреса во временном хранилище
- 3Добавьте элемент «Поле картинки» и привяжите его к строковому реквизиту
- 4В ПриСозданииНаСервере извлеките данные и поместите их во временное хранилище
- 5Реализуйте команду загрузки файла через НачатьПомещениеФайла
- 6Проверьте: откройте элемент, загрузите фото, запишите и переоткройте форму
Вывод картинки без изменения конфигурации
Если дорабатывать конфигурацию нельзя (типовая на поддержке), есть обходные пути. Во многих типовых решениях механизм присоединенных файлов уже встроен: у номенклатуры, контрагентов и других объектов есть кнопка прикрепления файлов, и первое изображение может автоматически показываться на форме. Проверьте наличие гиперссылки «Присоединенные файлы» или панели с картинкой — возможно, всё уже работает.
Второй вариант — расширение конфигурации. Через расширение можно добавить реквизит формы, элемент «Поле картинки» и обработчики, не снимая конфигурацию с поддержки. Это безопаснее прямой доработки: обновления типовой версии не затрут ваш код, а само расширение легко отключить при проблемах.
Как вставить картинку в печатную форму
Для печатных форм есть два сценария. Если картинка статичная (логотип компании, печать), её вставляют прямо в макет: откройте макет табличного документа, встать в нужную ячейку и через меню «Таблица — Рисунки — Вставить» добавьте изображение. Рисунок привяжется к ячейке и будет выводиться вместе с областью.
Если картинка динамическая (фото товара в каждой строке накладной), её выводят программно. В модуле менеджера документа после вывода области находят рисунок табличного документа и подменяют его картинкой из данных объекта. Для этого в макете заранее размещают рисунок-заглушку с известным именем.
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ТабличныйДокумент.Вывести(ОбластьСтрока);
Рисунок = ТабличныйДокумент.Рисунки.Найти("ФотоТовара");
Если Рисунок <> Неопределено Тогда
ДанныеКартинки = Выборка.ДанныеКартинки.Получить();
Если ДанныеКартинки <> Неопределено Тогда
Рисунок.Картинка = Новый Картинка(ДанныеКартинки);
КонецЕсли;
КонецЕсли;Учтите ограничение: при выводе каждой следующей строки рисунок с тем же именем конфликтует, поэтому в цикле рисунки либо удаляют перед повторным выводом, либо работают с последним добавленным. Также задайте рисунку фиксированные размеры в макете — иначе большие фото «разорвут» макет печатной формы.
Картинка в отчёте на СКД и в динамическом списке
В отчётах на системе компоновки данных картинки чаще всего выводят как индикаторы: зелёный круг при выполнении плана, красный — при просрочке. Делается это через условное оформление или через параметр «Оформление» поля, где для значения задаётся картинка из библиотеки. Для произвольных изображений из данных используют вычисляемое поле с функцией, возвращающей адрес картинки, и формат поля с картинкой.
В динамических списках (например, список товаров с миниатюрами) картинку выводят через колонку с типом «Картинка» и заполнением в событии «ПриПолученииДанныхНаСервере». Это ресурсоёмкая операция: если в списке сотни строк, загрузка всех изображений заметно замедлит открытие. Практичный компромисс — маленькие превью заранее уменьшенного размера, хранящиеся отдельно от полноразмерных фото.
Храните в базе две версии изображения: полноразмерную для просмотра и уменьшенную миниатюру для списков. Вывод миниатюр в списках ускоряет работу в разы, особенно при медленном соединении с сервером.
Типичные ошибки и как их избежать
Самая частая ошибка — вывод картинки в тонком клиенте с использованием пути к файлу на сервере. Код «Новый Картинка("C:\Images\photo.jpg")» сработает только если файл доступен именно с той машины, где выполняется код. В клиент-серверном режиме серверный код не видит диск пользователя, и наоборот. Правильный путь — передача двоичных данных через временное хранилище.
Вторая группа проблем — производительность и объём. Хранение фото по несколько мегабайт в базе без сжатия быстро раздувает её, а вывод полноразмерных изображений в списках тормозит интерфейс. Третья ошибка — отсутствие проверки на Неопределено: если картинки у объекта нет, обращение к данным хранилища без проверки приводит к ошибкам или пустым рамкам на форме.
Как проверить результат
После настройки пройдите полный цикл: загрузите картинку, запишите объект, закройте и снова откройте форму — изображение должно остаться на месте. Проверьте объект без картинки: форма должна открываться без ошибок и показывать пустое поле или заглушку.
Для печатной формы сформируйте документ с картинкой и без неё, выведите на предпросмотр и в PDF. Убедитесь, что рисунок не искажён, не обрезан и не сдвигает соседние области. Если форма используется в файловом и клиент-серверном режимах, проверьте оба — поведение при работе с файлами в них различается.
Как проверить результат
Картинка отображается после записи и переоткрытия
Поле пустое или ошибка обращения к хранилищу
Форма открывается, поле пустое или показывает заглушку
Ошибка «Невозможно получить данные»
Изображение в нужном месте, пропорции сохранены
Картинка обрезана, растянута или сдвигает строки
Картинка видна всем пользователям
Видна только на одном компьютере — использован локальный путь
Частые вопросы
Как вывести картинку на форму, если она хранится в файле на диске?
Создайте объект ДвоичныеДанные из файла через Новый ДвоичныеДанные(ПутьКФайлу), поместите их во временное хранилище и присвойте адрес реквизиту, связанному с полем картинки. Учтите, что код должен выполняться там, где файл физически доступен — на сервере или на клиенте.
Почему картинка отображается у меня, но не видна другим пользователям?
Почти наверняка использован путь к локальному файлу на вашем компьютере. Перенесите изображение в базу через ХранилищеЗначения или в общедоступный сетевой каталог, доступный серверу 1С, и передавайте данные через временное хранилище.
Какие форматы изображений поддерживает 1С?
Объект «Картинка» работает с распространёнными растровыми форматами: PNG, JPEG, GIF, BMP. Для фото товаров обычно используют JPEG, для логотипов и иконок с прозрачностью — PNG.
Как уменьшить картинку перед сохранением в базу?
Встроенных средств ресайза в платформе нет. Обычно используют внешние компоненты, обработку через средства операционной системы или заранее подготовленные миниатюры. Практичный вариант — требовать от пользователей загружать изображения разумного размера и ограничивать объём файла.
Можно ли вывести картинку в отчёте СКД без программирования?
Для индикаторов — да: через условное оформление и картинки из библиотеки конфигурации. Для произвольных изображений из данных объекта потребуется вычисляемое поле и код, полностью без программирования не обойтись.
Картинка в печатной форме выводится только в первой строке, дальше пропадает. Что делать?
Это конфликт имён рисунков при выводе областей в цикле. Перед выводом каждой следующей строки удаляйте предыдущий рисунок через ТабличныйДокумент.Рисунки.Удалить() или работайте с последним добавленным рисунком по индексу.
Что важно запомнить
Способ вывода картинки зависит от места: на форме — поле картинки с адресом во временном хранилище, в печати — рисунок макета с программной подменой, в отчёте — условное оформление или вычисляемое поле. Храните изображения в базе через ХранилищеЗначения, используйте миниатюры для списков и всегда проверяйте результат у разных пользователей.