В практике разработки на платформе 1С:Предприятие часто возникает задача вывода дополнительных визуальных данных в печатные формы документов. Это могут быть фотографии номенклатуры, логотипы организаций, факсимильные подписи ответственных лиц или печати. Рассмотрим подробно, как правильно организовать хранение таких данных и их последующий вывод в макет табличного документа, опираясь на лучшие практики программирования.
Прежде чем переходить к коду, проанализируем архитектурный вопрос. Для хранения бинарных данных (картинок) в 1С обычно используется тип ХранилищеЗначения. Существует два основных подхода:
Если ваша задача специфична и требует использования именно регистра сведений, убедитесь, что ресурс с типом ХранилищеЗначения является единственным «тяжелым» полем, чтобы не замедлять выборку остальных данных из регистра.
Важно различать обычные фотографии и штрихкоды. Разберем ситуацию, когда разработчику требуется вывести штрихкод в макет. Опытные специалисты не рекомендуют хранить штрихкод в виде готовой картинки. Проанализируем причины:
Правильный подход — хранить в регистре сведений только текстовую строку штрихкода, а саму картинку генерировать «на лету» в момент формирования печатной формы. В современных версиях 1С для этого используется встроенная компонента печати штрихкодов или функции платформы, такие как ГенерироватьШтрихКод() для QR-кодов.
Для вывода изображения в макете необходимо подготовить контейнер. Выполним следующие шаги:
РисунокЛоготип), чтобы мы могли обратиться к нему из программного кода.Рассмотрим пошагово процесс извлечения данных из регистра и их вставки в макет. Предположим, у нас есть регистр сведений лкп_ПодписиПечатиОтветственныхЛиц, где в ресурсе Подпись хранится ХранилищеЗначения с картинкой.
Разберем основной алгоритм получения картинки:
// Функция для получения двоичных данных картинки из регистра
Процедура ВывестиФаксимиле(Физлицо, ВидПодписиПечати, Рисунок, УбратьРамку)
// 1. Очищаем рамку рисунка, если это необходимо
Если УбратьРамку Тогда
Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
КонецЕсли;
// 2. Проверяем заполнение ключевых параметров
Если Не ЗначениеЗаполнено(Физлицо) Тогда
Возврат;
КонецЕсли;
// 3. Извлекаем запись из регистра сведений
// Используем структуру для поиска по измерениям
Отбор = Новый Структура("Физлицо, ВидПодписиПечати", Физлицо, ВидПодписиПечати);
ЗаписьРегистра = РегистрыСведений.лкп_ПодписиПечатиОтветственныхЛиц.Получить(Отбор);
// 4. Получаем данные из ХранилищаЗначения
ХранилищеЗначения = ЗаписьРегистра.Подпись;
ДвоичныеДанные = ХранилищеЗначения.Получить();
// 5. Если данные найдены, создаем объект Картинка и помещаем в Рисунок макета
Если ДвоичныеДанные <> Неопределено Тогда
// Параметр "Истина" позволяет сохранить прозрачность (важно для форматов PNG/GIF)
Рисунок.Картинка = Новый Картинка(ДвоичныеДанные, Истина);
КонецЕсли;
КонецПроцедуры
При выводе печатей и подписей критически важно учитывать формат исходного файла. Рассмотрим подробнее:
Новый Картинка(ДвоичныеДанные, Истина) второй параметр отвечает за сохранение прозрачности. Это позволит печати «накладываться» на текст документа, не перекрывая его белым прямоугольником.Рисунок есть свойство РазмерКартинки. Рекомендуется использовать значение Пропорционально (Proportional), чтобы изображение вписалось в заданную в макете область без искажений.Проанализируем ситуацию, когда печать происходит через веб-клиент. Прямая работа с ХранилищеЗначения на стороне клиента невозможна. В этом случае данные сначала необходимо поместить во временное хранилище на сервере:
// Пример получения адреса временного хранилища на сервере
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
// Затем на клиенте этот адрес можно использовать для отображения в формах
// Но для формирования макета на сервере достаточно прямой работы с ДвоичнымиДанными
Выясним причину, по которой иногда картинка не отображается, даже если код написан верно. Чаще всего это связано с тем, что в макете область, содержащая рисунок, не была выведена методом Вывести() в результирующий табличный документ. Сначала нужно заполнить параметры области (включая свойства рисунков), а затем передать область в итоговый документ.
Подведем итог: использование регистра сведений для хранения изображений — вполне рабочая схема при условии понимания принципов работы с типом ХранилищеЗначения. Для текстовых данных (штрихкоды) используйте динамическую генерацию, а для статичных (фото, подписи) — прямое извлечение бинарных данных и инициализацию объекта Картинка в макете.