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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике разработки на платформе 1С:Предприятие часто возникает задача вывода дополнительных визуальных данных в печатные формы документов. Это могут быть фотографии номенклатуры, логотипы организаций, факсимильные подписи ответственных лиц или печати. Рассмотрим подробно, как правильно организовать хранение таких данных и их последующий вывод в макет табличного документа, опираясь на лучшие практики программирования.

Хранение изображений: Регистр сведений или справочник?

Прежде чем переходить к коду, проанализируем архитектурный вопрос. Для хранения бинарных данных (картинок) в 1С обычно используется тип ХранилищеЗначения. Существует два основных подхода:

  1. Регистр сведений: Удобен, когда изображение привязано к комбинации измерений (например, подпись конкретного физического лица для конкретного вида документов) или когда требуется хранить историю изменений (используя периодический регистр).
  2. Справочник присоединенных файлов: Этот вариант считается стандартом в современных конфигурациях на базе БСП (Библиотеки стандартных подсистем). Он позволяет выносить тяжелые данные во внешние тома, не перегружая основную базу SQL.

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

Особенности работы со штрихкодами

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

Правильный подход — хранить в регистре сведений только текстовую строку штрихкода, а саму картинку генерировать «на лету» в момент формирования печатной формы. В современных версиях 1С для этого используется встроенная компонента печати штрихкодов или функции платформы, такие как ГенерироватьШтрихКод() для QR-кодов.

Подготовка макета табличного документа

Для вывода изображения в макете необходимо подготовить контейнер. Выполним следующие шаги:

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

Программная реализация вывода изображения

Рассмотрим пошагово процесс извлечения данных из регистра и их вставки в макет. Предположим, у нас есть регистр сведений лкп_ПодписиПечатиОтветственныхЛиц, где в ресурсе Подпись хранится ХранилищеЗначения с картинкой.

Разберем основной алгоритм получения картинки:


// Функция для получения двоичных данных картинки из регистра
Процедура ВывестиФаксимиле(Физлицо, ВидПодписиПечати, Рисунок, УбратьРамку)
    
    // 1. Очищаем рамку рисунка, если это необходимо
    Если УбратьРамку Тогда
        Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
    КонецЕсли;

    // 2. Проверяем заполнение ключевых параметров
    Если Не ЗначениеЗаполнено(Физлицо) Тогда
        Возврат;
    КонецЕсли;

    // 3. Извлекаем запись из регистра сведений
    // Используем структуру для поиска по измерениям
    Отбор = Новый Структура("Физлицо, ВидПодписиПечати", Физлицо, ВидПодписиПечати);
    ЗаписьРегистра = РегистрыСведений.лкп_ПодписиПечатиОтветственныхЛиц.Получить(Отбор);

    // 4. Получаем данные из ХранилищаЗначения
    ХранилищеЗначения = ЗаписьРегистра.Подпись;
    ДвоичныеДанные = ХранилищеЗначения.Получить();

    // 5. Если данные найдены, создаем объект Картинка и помещаем в Рисунок макета
    Если ДвоичныеДанные <> Неопределено Тогда
        // Параметр "Истина" позволяет сохранить прозрачность (важно для форматов PNG/GIF)
        Рисунок.Картинка = Новый Картинка(ДвоичныеДанные, Истина);
    КонецЕсли;
    
КонецПроцедуры

Нюансы форматирования и прозрачности

При выводе печатей и подписей критически важно учитывать формат исходного файла. Рассмотрим подробнее:

Работа в веб-клиенте

Проанализируем ситуацию, когда печать происходит через веб-клиент. Прямая работа с ХранилищеЗначения на стороне клиента невозможна. В этом случае данные сначала необходимо поместить во временное хранилище на сервере:


// Пример получения адреса временного хранилища на сервере
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
// Затем на клиенте этот адрес можно использовать для отображения в формах
// Но для формирования макета на сервере достаточно прямой работы с ДвоичнымиДанными

Выясним причину, по которой иногда картинка не отображается, даже если код написан верно. Чаще всего это связано с тем, что в макете область, содержащая рисунок, не была выведена методом Вывести() в результирующий табличный документ. Сначала нужно заполнить параметры области (включая свойства рисунков), а затем передать область в итоговый документ.

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

← На главную