Как вывести двоичные данные (изображение или инструкцию) на форму 1С?

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

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

Отображение двоичных данных как изображения на форме

Если ваши двоичные данные представляют собой изображение (например, из общего макета "Картинка"), то наиболее распространенный и эффективный способ его вывода на управляемую форму заключается в использовании временного хранилища. Этот подход позволяет отобразить изображение, не загружая его полностью в оперативную память клиентского приложения, что особенно важно для больших файлов.

  1. Создание реквизита формы для хранения адреса картинки:

    Начнем с создания специального реквизита на вашей форме. Этот реквизит будет служить контейнером для адреса изображения во временном хранилище, а не для самих двоичных данных. Создадим реквизит с именем, например, АдресКартинки.

    • Тип: Установим тип данных для этого реквизита как Строка.
    • Длина: Обязательно выберем Неограниченная, так как адрес временного хранилища может быть длинной строкой.

    Почему строка, а не сами двоичные данные? Потому что на форме мы будем отображать не сами двоичные данные, а ссылку на них, хранящуюся во временном хранилище. Платформа 1С самостоятельно "подтянет" изображение по этой ссылке.

  2. Размещение реквизита на форме и выбор вида отображения:

    После создания реквизита АдресКартинки, перенесем его на форму. На форме он должен отображаться как картинка. Для этого:

    • Найдём созданный элемент формы, соответствующий реквизиту АдресКартинки.
    • В свойствах этого элемента установим Вид: Поле картинки формы.

    Теперь элемент формы готов к приему адреса картинки.

  3. Получение двоичных данных на сервере:

    Двоичные данные необходимо получить на сервере. Это может быть общий макет, реквизит объекта типа "Двоичные данные", или данные, полученные из файла. Рассмотрим эти варианты:

    • Из общего макета: Если ваша инструкция хранится в общем макете, который представляет собой изображение, то получить его можно так:

      ТекущиеДвоичныеДанные = ПолучитьОбщийМакет("ИмяВашегоМакетаСКартинкой");

      Здесь ИмяВашегоМакетаСКартинкой — это название вашего общего макета, который содержит изображение.

    • Из реквизита объекта: Если двоичные данные хранятся в реквизите объекта базы данных (например, в справочнике или документе) с типом Двоичные данные, то доступ к ним будет таким:

      ТекущиеДвоичныеДанные = ТекущийОбъект.ДанныеКартинки;

      Где ТекущийОбъект — это объект формы (например, ссылка на элемент справочника), а ДанныеКартинки — имя реквизита объекта, хранящего двоичные данные.

    • Из переменной: Если двоичные данные уже находятся в какой-либо переменной на сервере:

      ТекущиеДвоичныеДанные = ИмяПеременнойДвоичныеДанные;
  4. Помещение двоичных данных во временное хранилище:

    Теперь, когда у нас есть двоичные данные, мы должны поместить их во временное хранилище на сервере. Это делается с помощью функции ПоместитьВоВременноеХранилище(). Эта функция возвращает уникальный адрес, по которому клиентское приложение сможет получить данные.

    Важно: Всегда выполняйте эту операцию на сервере, например, в обработчике события ПриЧтенииНаСервере или в серверной процедуре, которая заполняет данные формы.

    
    &НаСервере
    Процедура ПриЧтенииНаСервере(ТекущийОбъект)
        // Получаем двоичные данные. Например, из общего макета:
        ТекущиеДвоичныеДанные = ПолучитьОбщийМакет("КартинкаИнструкции");
    
        // Или из реквизита объекта:
        // ТекущиеДвоичныеДанные = ТекущийОбъект.ДанныеКартинки;
    
        // Помещаем двоичные данные во временное хранилище
        АдресКартинки = ПоместитьВоВременноеХранилище(ТекущиеДвоичныеДанные, УникальныйИдентификатор);
    КонецПроцедуры
    

    Второй параметр функции ПоместитьВоВременноеХранилище() – УникальныйИдентификатор – позволяет связать адрес с сессией текущего пользователя. Это гарантирует, что адрес будет уникален и доступен только для текущей сессии.

  5. Присвоение адреса реквизиту формы:

    Последний шаг – присвоить полученный адрес временного хранилища реквизиту формы, который мы создали ранее:

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

    Замените РеквизитФормыАдресКартинки на фактическое имя вашего реквизита формы, который имеет тип "Строка" неограниченной длины и вид "Поле картинки формы". После выполнения этого кода на форме появится изображение. Если исходная картинка сохранена в неподдерживаемом платформой формате WEBP, для её корректного отображения подойдёт инструмент для конвертации изображений WEBP в JPG.

Что делать, если инструкция большая или представляет собой форматированный текст?

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

1. Вывод форматированного текста с помощью "Поля HTML документа"

Если ваша инструкция изначально является HTML-разметкой или может быть преобразована в HTML, то элемент формы Поле HTML документа идеально подходит для ее отображения. Этот элемент позволяет выводить сложный форматированный текст, таблицы, ссылки и даже небольшие изображения, встроенные в HTML. Если требуется не только выводить, но и удобно редактировать такую разметку на форме, можно воспользоваться готовым WYSIWYG-редактором для работы с HTML-разметкой.

  1. Создание реквизита формы:

    Создайте реквизит формы типа Строка с неограниченной длиной. Например, HTMLТекстИнструкции.

  2. Размещение на форме:

    Перенесите этот реквизит на форму и установите Вид: Поле HTML документа.

  3. Преобразование двоичных данных в строку HTML и присвоение реквизиту:

    На сервере необходимо получить двоичные данные, преобразовать их в строку (если они уже не в виде строки HTML) и присвоить реквизиту формы.

    
    &НаСервере
    Процедура ПриЧтенииНаСервере(ТекущийОбъект)
        // Получаем двоичные данные, например, из общего макета:
        ДвоичныеДанныеHTML = ПолучитьОбщийМакет("HTMLИнструкция"); 
    
        // Преобразуем двоичные данные в строку (предполагаем, что макет содержит текст HTML)
        Если ДвоичныеДанныеHTML <> Неопределено Тогда
            ЧтениеТекста = Новый ЧтениеТекста(ДвоичныеДанныеHTML, КодировкаТекста.UTF8); // Выберите подходящую кодировку
            ТекстHTML = ЧтениеТекста.Прочитать();
            ЧтениеТекста.Закрыть();
            
            // Присваиваем полученный HTML-текст реквизиту формы
            HTMLТекстИнструкции = ТекстHTML;
        КонецЕсли;
    КонецПроцедуры
    

    Здесь КодировкаТекста.UTF8 должна соответствовать кодировке, в которой был сохранен ваш HTML-макет.

2. Вывод неформатированного или простого текста с помощью "Поля текстового документа"

Если инструкция является простым текстом без сложного форматирования, то можно использовать Поле текстового документа.

  1. Создание реквизита формы:

    Создайте реквизит формы типа Строка с неограниченной длиной. Например, ТекстИнструкции.

  2. Размещение на форме:

    Перенесите этот реквизит на форму и установите Вид: Поле текстового документа.

  3. Преобразование двоичных данных в строку и присвоение реквизиту:

    Действия аналогичны предыдущему примеру с HTML, но без предположения о HTML-разметке.

    
    &НаСервере
    Процедура ПриЧтенииНаСервере(ТекущийОбъект)
        // Получаем двоичные данные, например, из общего макета:
        ДвоичныеДанныеТекста = ПолучитьОбщийМакет("ТекстоваяИнструкция"); 
    
        // Преобразуем двоичные данные в строку
        Если ДвоичныеДанныеТекста <> Неопределено Тогда
            ЧтениеТекста = Новый ЧтениеТекста(ДвоичныеДанныеТекста, КодировкаТекста.UTF8); // Выберите подходящую кодировку
            ТекстИнструкции = ЧтениеТекста.Прочитать();
            ЧтениеТекста.Закрыть();
            
            // Присваиваем полученный текст реквизиту формы
            Элементы.ТекстИнструкции.УстановитьТекст(ТекстИнструкции); // Для текстового документа используем УстановитьТекст
        КонецЕсли;
    КонецПроцедуры
    

    Обратите внимание, что для поля текстового документа используется метод УстановитьТекст(), а не прямое присвоение реквизиту.

3. Вывод структурированных данных с помощью "Табличного документа"

Если ваш общий макет представляет собой сложную структуру (таблицу, включающую текст и картинки), которая обычно используется для печати, то ее можно отобразить на форме с помощью элемента Табличный документ.

  1. Создание элемента формы "ТабличныйДокумент":

    Создайте на форме элемент с типом Табличный документ. Например, назовем его ТабДокИнструкция. Это не реквизит формы, а непосредственно элемент управления.

  2. Вывод макета в табличный документ:

    На сервере получите общий макет, а затем выведите его содержимое в созданный элемент ТабДокИнструкция.

    
    &НаСервере
    Процедура ПоказатьИнструкциюНаСервере()
        // Получаем общий макет, который может содержать области, текст, картинки
        МакетИнструкции = ПолучитьОбщийМакет("МакетПечатнойИнструкции");
    
        // Создаем объект ТабличныйДокумент для вывода на форму
        ТабДокДляОтображения = Новый ТабличныйДокумент;
    
        // Предположим, макет состоит из одной области "ОбластьИнструкции"
        ОбластьИнструкции = МакетИнструкции.ПолучитьОбласть("ОбластьИнструкции");
        ТабДокДляОтображения.Вывести(ОбластьИнструкции);
    
        // Если макет содержит несколько областей, вы можете вывести их последовательно
        // ОбластьШапка = МакетИнструкции.ПолучитьОбласть("Шапка");
        // ТабДокДляОтображения.Вывести(ОбластьШапка);
        // ОбластьТело = МакетИнструкции.ПолучитьОбласть("Тело");
        // ТабДокДляОтображения.Вывести(ОбластьТело);
    
        // Передаем заполненный ТабличныйДокумент в элемент формы
        Элементы.ТабДокИнструкция.УстановитьДокумент(ТабДокДляОтображения);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПоказатьИнструкцию(Команда)
        ПоказатьИнструкциюНаСервере();
    КонецПроцедуры
    

    Этот метод очень гибкий, так как позволяет использовать все возможности табличного документа, включая динамическое формирование содержимого из различных областей макета. Используйте УстановитьДокумент() для передачи сформированного табличного документа в элемент формы.

Общие рекомендации и важные моменты

Выбрав подходящий метод из рассмотренных выше, вы сможете эффективно выводить двоичные данные на форму 1С, будь то простое изображение, форматированный текст или сложный табличный документ.

← На главную