При работе с платформой 1С:Предприятие часто возникает необходимость отобразить на форме различные данные, которые хранятся в двоичном виде. Чаще всего это изображения, но также это могут быть и другие форматированные данные, такие как HTML-документы или макеты печатных форм. Рассмотрим, как эффективно решить эту задачу, исходя из типа двоичных данных и требований к отображению.
Если ваши двоичные данные представляют собой изображение (например, из общего макета "Картинка"), то наиболее распространенный и эффективный способ его вывода на управляемую форму заключается в использовании временного хранилища. Этот подход позволяет отобразить изображение, не загружая его полностью в оперативную память клиентского приложения, что особенно важно для больших файлов.
Создание реквизита формы для хранения адреса картинки:
Начнем с создания специального реквизита на вашей форме. Этот реквизит будет служить контейнером для адреса изображения во временном хранилище, а не для самих двоичных данных. Создадим реквизит с именем, например, АдресКартинки.
Почему строка, а не сами двоичные данные? Потому что на форме мы будем отображать не сами двоичные данные, а ссылку на них, хранящуюся во временном хранилище. Платформа 1С самостоятельно "подтянет" изображение по этой ссылке.
Размещение реквизита на форме и выбор вида отображения:
После создания реквизита АдресКартинки, перенесем его на форму. На форме он должен отображаться как картинка. Для этого:
АдресКартинки.Теперь элемент формы готов к приему адреса картинки.
Получение двоичных данных на сервере:
Двоичные данные необходимо получить на сервере. Это может быть общий макет, реквизит объекта типа "Двоичные данные", или данные, полученные из файла. Рассмотрим эти варианты:
Из общего макета: Если ваша инструкция хранится в общем макете, который представляет собой изображение, то получить его можно так:
ТекущиеДвоичныеДанные = ПолучитьОбщийМакет("ИмяВашегоМакетаСКартинкой");
Здесь ИмяВашегоМакетаСКартинкой — это название вашего общего макета, который содержит изображение.
Из реквизита объекта: Если двоичные данные хранятся в реквизите объекта базы данных (например, в справочнике или документе) с типом Двоичные данные, то доступ к ним будет таким:
ТекущиеДвоичныеДанные = ТекущийОбъект.ДанныеКартинки;
Где ТекущийОбъект — это объект формы (например, ссылка на элемент справочника), а ДанныеКартинки — имя реквизита объекта, хранящего двоичные данные.
Из переменной: Если двоичные данные уже находятся в какой-либо переменной на сервере:
ТекущиеДвоичныеДанные = ИмяПеременнойДвоичныеДанные;
Помещение двоичных данных во временное хранилище:
Теперь, когда у нас есть двоичные данные, мы должны поместить их во временное хранилище на сервере. Это делается с помощью функции ПоместитьВоВременноеХранилище(). Эта функция возвращает уникальный адрес, по которому клиентское приложение сможет получить данные.
Важно: Всегда выполняйте эту операцию на сервере, например, в обработчике события ПриЧтенииНаСервере или в серверной процедуре, которая заполняет данные формы.
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Получаем двоичные данные. Например, из общего макета:
ТекущиеДвоичныеДанные = ПолучитьОбщийМакет("КартинкаИнструкции");
// Или из реквизита объекта:
// ТекущиеДвоичныеДанные = ТекущийОбъект.ДанныеКартинки;
// Помещаем двоичные данные во временное хранилище
АдресКартинки = ПоместитьВоВременноеХранилище(ТекущиеДвоичныеДанные, УникальныйИдентификатор);
КонецПроцедуры
Второй параметр функции ПоместитьВоВременноеХранилище() – УникальныйИдентификатор – позволяет связать адрес с сессией текущего пользователя. Это гарантирует, что адрес будет уникален и доступен только для текущей сессии.
Присвоение адреса реквизиту формы:
Последний шаг – присвоить полученный адрес временного хранилища реквизиту формы, который мы создали ранее:
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// ... (получение ТекущиеДвоичныеДанные) ...
// Помещаем двоичные данные во временное хранилище
АдресКартинки = ПоместитьВоВременноеХранилище(ТекущиеДвоичныеДанные, УникальныйИдентификатор);
// Присваиваем адрес реквизиту формы
// Имя реквизита формы такое же, как и имя элемента на форме
РеквизитФормыАдресКартинки = АдресКартинки;
КонецПроцедуры
Замените РеквизитФормыАдресКартинки на фактическое имя вашего реквизита формы, который имеет тип "Строка" неограниченной длины и вид "Поле картинки формы". После выполнения этого кода на форме появится изображение. Если исходная картинка сохранена в неподдерживаемом платформой формате WEBP, для её корректного отображения подойдёт инструмент для конвертации изображений WEBP в JPG.
В случае, если "инструкция" представляет собой не просто небольшую картинку, а объемный текст, возможно, форматированный, или даже структурированный документ, то вывод ее на форму как "Поле картинки формы" может быть неоптимальным или даже невозможным. Рассмотрим альтернативные подходы.
Если ваша инструкция изначально является HTML-разметкой или может быть преобразована в HTML, то элемент формы Поле HTML документа идеально подходит для ее отображения. Этот элемент позволяет выводить сложный форматированный текст, таблицы, ссылки и даже небольшие изображения, встроенные в HTML. Если требуется не только выводить, но и удобно редактировать такую разметку на форме, можно воспользоваться готовым WYSIWYG-редактором для работы с HTML-разметкой.
Создание реквизита формы:
Создайте реквизит формы типа Строка с неограниченной длиной. Например, HTMLТекстИнструкции.
Размещение на форме:
Перенесите этот реквизит на форму и установите Вид: Поле HTML документа.
Преобразование двоичных данных в строку HTML и присвоение реквизиту:
На сервере необходимо получить двоичные данные, преобразовать их в строку (если они уже не в виде строки HTML) и присвоить реквизиту формы.
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Получаем двоичные данные, например, из общего макета:
ДвоичныеДанныеHTML = ПолучитьОбщийМакет("HTMLИнструкция");
// Преобразуем двоичные данные в строку (предполагаем, что макет содержит текст HTML)
Если ДвоичныеДанныеHTML <> Неопределено Тогда
ЧтениеТекста = Новый ЧтениеТекста(ДвоичныеДанныеHTML, КодировкаТекста.UTF8); // Выберите подходящую кодировку
ТекстHTML = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
// Присваиваем полученный HTML-текст реквизиту формы
HTMLТекстИнструкции = ТекстHTML;
КонецЕсли;
КонецПроцедуры
Здесь КодировкаТекста.UTF8 должна соответствовать кодировке, в которой был сохранен ваш HTML-макет.
Если инструкция является простым текстом без сложного форматирования, то можно использовать Поле текстового документа.
Создание реквизита формы:
Создайте реквизит формы типа Строка с неограниченной длиной. Например, ТекстИнструкции.
Размещение на форме:
Перенесите этот реквизит на форму и установите Вид: Поле текстового документа.
Преобразование двоичных данных в строку и присвоение реквизиту:
Действия аналогичны предыдущему примеру с HTML, но без предположения о HTML-разметке.
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Получаем двоичные данные, например, из общего макета:
ДвоичныеДанныеТекста = ПолучитьОбщийМакет("ТекстоваяИнструкция");
// Преобразуем двоичные данные в строку
Если ДвоичныеДанныеТекста <> Неопределено Тогда
ЧтениеТекста = Новый ЧтениеТекста(ДвоичныеДанныеТекста, КодировкаТекста.UTF8); // Выберите подходящую кодировку
ТекстИнструкции = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
// Присваиваем полученный текст реквизиту формы
Элементы.ТекстИнструкции.УстановитьТекст(ТекстИнструкции); // Для текстового документа используем УстановитьТекст
КонецЕсли;
КонецПроцедуры
Обратите внимание, что для поля текстового документа используется метод УстановитьТекст(), а не прямое присвоение реквизиту.
Если ваш общий макет представляет собой сложную структуру (таблицу, включающую текст и картинки), которая обычно используется для печати, то ее можно отобразить на форме с помощью элемента Табличный документ.
Создание элемента формы "ТабличныйДокумент":
Создайте на форме элемент с типом Табличный документ. Например, назовем его ТабДокИнструкция. Это не реквизит формы, а непосредственно элемент управления.
Вывод макета в табличный документ:
На сервере получите общий макет, а затем выведите его содержимое в созданный элемент ТабДокИнструкция.
&НаСервере
Процедура ПоказатьИнструкциюНаСервере()
// Получаем общий макет, который может содержать области, текст, картинки
МакетИнструкции = ПолучитьОбщийМакет("МакетПечатнойИнструкции");
// Создаем объект ТабличныйДокумент для вывода на форму
ТабДокДляОтображения = Новый ТабличныйДокумент;
// Предположим, макет состоит из одной области "ОбластьИнструкции"
ОбластьИнструкции = МакетИнструкции.ПолучитьОбласть("ОбластьИнструкции");
ТабДокДляОтображения.Вывести(ОбластьИнструкции);
// Если макет содержит несколько областей, вы можете вывести их последовательно
// ОбластьШапка = МакетИнструкции.ПолучитьОбласть("Шапка");
// ТабДокДляОтображения.Вывести(ОбластьШапка);
// ОбластьТело = МакетИнструкции.ПолучитьОбласть("Тело");
// ТабДокДляОтображения.Вывести(ОбластьТело);
// Передаем заполненный ТабличныйДокумент в элемент формы
Элементы.ТабДокИнструкция.УстановитьДокумент(ТабДокДляОтображения);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьИнструкцию(Команда)
ПоказатьИнструкциюНаСервере();
КонецПроцедуры
Этот метод очень гибкий, так как позволяет использовать все возможности табличного документа, включая динамическое формирование содержимого из различных областей макета. Используйте УстановитьДокумент() для передачи сформированного табличного документа в элемент формы.
Выбрав подходящий метод из рассмотренных выше, вы сможете эффективно выводить двоичные данные на форму 1С, будь то простое изображение, форматированный текст или сложный табличный документ.