При автоматизации предметных областей со специфическим текстовым наполнением (например, медицина, юриспруденция или технические описания) часто возникает необходимость хранить, редактировать и выводить на печать текст с форматированием (подстрочные и надстрочные символы, цвета, шрифты, выделения). В 1С:Предприятие 8 стандартная реквизитная строка не поддерживает внутренние стили. Рассмотрим, какие механизмы платформы позволяют решить задачи работы с formatted/rich text.
Наиболее удобным и штатным способом работы с обогащенным текстом на управляемой форме является использование специального типа данных ФорматированныйДокумент.
Для реализации этого подхода выполним следующие шаги:
ХранилищеЗначения. Именно в нем будет бинарно сохраняться объект ФорматированныйДокумент.ФорматированныйДокумент.Разберем, как программно прочитать и сохранить данные при работе с формой:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Прочитываем объект из хранилища значения при открытии формы
ФорматированныйТекст = Объект.ХранилищеТекста.Получить();
Если ТипЗнч(ФорматированныйТекст) = Тип("ФорматированныйДокумент") Тогда
РеквизитФормыТекст = ФорматированныйТекст;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Сохраняем объект в хранилище перед записью в базу данных
ТекущийОбъект.ХранилищеТекста = Новый ХранилищеЗначения(РеквизитФормыТекст);
КонецПроцедуры
Если данные изначально приходят в формате HTML-строки с CSS-стилями, для их визуализации на форме используется элемент типа Поле HTML документа. Однако по умолчанию это поле работает в режиме просмотра. Посмотрим, как включить редактирование разметки напрямую внутри браузерного элемента.
Для включения возможности редактирования текста достаточно прописать атрибут contenteditable="true" в теге <body> загружаемой страницы. Проанализируем пример манипуляции DOM-моделью документа на клиенте:
&НаКлиенте
Процедура ПолучитьСодержимоеHTML()
// Получение редактируемой HTML-строки с форматированием
HTMLТекст = Элементы.ПолеHTML.Документ.body.innerHTML;
// Получение чистого текста без HTML-тегов
ОбычныйТекст = Элементы.ПолеHTML.Документ.body.innerText;
КонецПроцедуры
Важно: Данный подход отлично подходит для быстрого просмотра и мелкой правки готовых разметок, но для построения полнофункционального WYSIWYG-редактора в тонком и веб-клиенте рекомендуется подключать специализированные библиотеки JavaScript (например, TinyMCE или CKEditor).
Выясним, как быстро избавиться от HTML-разметки или управляющих тегов и получить чистый текст без оформления.
Если текст загружен в объект ФорматированныйДокумент, получение неразмеченной строки выполняется с помощью метода ПолучитьТекст():
// Извлекаем чистую строку без тегов и оформления
ЧистыйТекст = ОбъектФорматированныйДокумент.ПолучитьТекст();
Если необходимо перегнать форматированный документ в строку HTML или наоборот, используются методы ПолучитьHTML() и УстановитьHTML():
&НаКлиенте
Процедура ПреобразоватьВHTML()
Перем СтрокаHTML, СтруктураКартинок;
// Экспортируем данные из объекта в HTML-строку
ОбъектФорматированныйДокумент.ПолучитьHTML(СтрокаHTML, СтруктураКартинок);
// Сохраняем полученную строку в текстовый файл при необходимости
ТекстовыйДок = Новый ТекстовыйДокумент;
ТекстовыйДок.УстановитьТекст(СтрокаHTML);
ТекстовыйДок.Записать("C:\temp\document.html");
КонецПроцедуры
Проанализируем варианты вывода отформатированных данных в печатную продукцию:
ФорматированнаяСтрока. Вы можете сформировать объект типа ФорматированнаяСтрока с нужными шрифтами и цветами отдельных слов и присвоить его параметру ячейки.altChunk при формировании структуры DOCX или программный импорт через COM-объект Word путем вставки предварительно сохраненных временных HTML-файлов.