Как вывести данные из ФорматированногоДокумента в печатную форму 1С с сохранением оформления?

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

При разработке конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача предоставить пользователю возможность расширенного редактирования текста. Для этих целей идеально подходит объект ФорматированныйДокумент. Он позволяет изменять шрифты, цвета, начертания и даже вставлять картинки. Однако, когда дело доходит до вывода этой информации в печатную форму (объект ТабличныйДокумент), разработчики сталкиваются с серьезной проблемой: оформление пропадает, и выводится лишь обычный неформатированный текст.

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

Анализ проблемы: почему обычный вывод параметров не помогает

Рассмотрим ситуацию, с которой столкнулся автор темы. В справочнике Номенклатура создан реквизит типа ХранилищеЗначения, в котором сохраняется объект ФорматированныйДокумент. При попытке вывода в печатную форму автор использовал следующий код:


ФорматированныйДокумент = Стр.ОписаниеФ.Получить();
ЭлементыФорматированногоДокумента = ФорматированныйДокумент.ПолучитьЭлементы();
Для Каждого Элемент ИЗ ЭлементыФорматированногоДокумента Цикл
    Если ТипЗнч(Элемент) = Тип("ТекстФорматированногоДокумента") Тогда
        ОбластьСтрокаТаблицы.Параметры.ОписаниеФ = Элемент.Текст;
    КонецЕсли;
КонецЦикла;

Проанализируем этот фрагмент. Здесь происходит перебор элементов коллекции документа. Проблема заключается в том, что свойство Элемент.Текст возвращает исключительно строковое содержимое без каких-либо признаков форматирования (тегов, стилей, ссылок на шрифты). В итоге в параметр ОписаниеФ области макета попадает «чистый» текст. Более того, если в документе было несколько абзацев или картинок, такой цикл может работать некорректно, перезаписывая параметр или игнорируя нетекстовые объекты.

Способ 1: Использование типа ФорматированнаяСтрока

Первый путь, который мы можем рассмотреть, — это использование объекта ФорматированнаяСтрока. В отличие от простого текста, ТабличныйДокумент умеет отображать объект типа ФорматированнаяСтрока непосредственно в ячейке, сохраняя базовое оформление (жирный, курсив, цвет, шрифт).

Однако у ФорматированныйДокумент нет прямого метода ПолучитьФорматированнуюСтроку(). Нам придется выполнить преобразование. Если документ содержит только текст с выделениями, мы можем программно сформировать такую строку, обходя элементы, но это трудоемко. Этот способ не подходит, если в описании присутствуют картинки или сложные таблицы, так как ФорматированнаяСтрока их не поддерживает в полной мере при выводе в ячейку макета.

Способ 2: Вывод через HTML-документ в макете (Рекомендуемый)

Наиболее универсальный и правильный метод — использование возможности вставки HTML-контента прямо в табличный документ. Давайте разберем этот алгоритм по шагам.

Шаг 1. Подготовка макета.
Вместо того чтобы назначать текст обычной ячейке, мы воспользуемся объектом типа Рисунок. Рассмотрим подробнее:

  1. Откроем макет печатной формы.
  2. В нужном месте (например, в области строки) выберем в меню: «Таблица» — «Рисунки» — «Вставить объект».
  3. В появившемся окне выберем «Документ HTML».
  4. Разместим рамку рисунка в границах ячеек, где должно отображаться описание. Дадим этому рисунку имя, например, РисунокОписание.

Шаг 2. Программное заполнение.
Теперь нам нужно получить HTML-код из нашего реквизита и передать его в объект рисунка в макете. Выясним, как это сделать правильно, используя методы объекта ФорматированныйДокумент.


// 1. Извлекаем объект из хранилища
ФормДок = Выборка.ОписаниеФ.Получить(); 

// 2. Получаем HTML-представление
ТекстHTML = "";
СтруктураВложений = Новый Структура;
ФормДок.ПолучитьHTML(ТекстHTML, СтруктураВложений);

// 3. Получаем область макета
Область = Макет.ПолучитьОбласть("Строка");

// 4. Обращаемся к рисунку как к объекту HTML-документа
РисунокHTML = Область.Рисунки.РисунокОписание;
// Устанавливаем текст напрямую в объект рисунка
РисунокHTML.Объект.УстановитьТекст(ТекстHTML);

// 5. Выводим область в итоговый табличный документ
ТабДок.Вывести(Область);

Важное замечание по вложениям (картинкам):
Метод ПолучитьHTML возвращает не только строку с тегами, но и структуру Вложения. Если в тексте были картинки, в переменной ТекстHTML ссылки на них будут иметь вид src="cid:image001...". Чтобы они отобразились в печатной форме, их нужно предварительно обработать. Один из вариантов — сохранить картинки во временные файлы и заменить пути в HTML-строке на локальные пути к файлам. Однако объект Документ HTML внутри рисунка 1С иногда требует специфической обработки ссылок или использования метода Base64 для внедрения изображений прямо в код тега img.

Разберем нюансы работы с картинками через Base64

Чтобы картинки гарантированно отобразились без сохранения временных файлов, проанализируем ситуацию с конвертацией в Base64. Мы можем обойти структуру вложений и заменить идентификаторы cid на реальные данные:


Для Каждого Вложение Из СтруктураВложений Цикл
    ДанныеКартинки = Base64Строка(Вложение.Значение);
    // Определяем тип (например, png или jpeg)
    ТипКартинки = "png"; 
    
    СсылкаBase64 = "data:image/" + ТипКартинки + ";base64," + ДанныеКартинки;
    ТекстHTML = СтрЗаменить(ТекстHTML, "cid:" + Вложение.Ключ, СсылкаBase64);
КонецЦикла;

После такой замены переменная ТекстHTML будет содержать самодостаточный код, который корректно отобразится в объекте «Рисунок» макета со всеми изображениями и стилями шрифтов.

Выясним причины возможных ошибок

Если после выполнения кода текст все равно не отображается или выглядит «криво», проверим следующие моменты:

  1. Свойство «Выводить на печать»: Убедимся, что у созданного рисунка в макете установлено свойство «Выводить на печать».
  2. Размеры рисунка: В отличие от ячеек с автовысотой, рисунок имеет фиксированный размер. Если текст длинный, его нужно либо программно растягивать, либо заранее предусматривать большую область в макете.
  3. Версия платформы: Работа с объектом Документ HTML в макетах наиболее стабильна в версиях платформы 8.3.10 и выше.

Заключение

Мы рассмотрели процесс трансформации данных из ФорматированногоДокумента в печатную форму. Ключевой вывод заключается в том, что нельзя просто передавать текст элемента в параметр ячейки. Для сохранения оформления необходимо использовать HTML-представление и внедрять его в макет через объект «Рисунок» с типом Документ HTML. Это позволяет добиться 100% идентичности того, что пользователь видит на экране в карточке номенклатуры, и того, что он получит в печатном документе или при сохранении в PDF.

← На главную