gifts2017

Особенности работы с методами ПолучитьHTML() и УстановитьHTML() объекта ФорматированныйДокумент

Опубликовал Артур Исламов (realturik) в раздел Программирование - Практика программирования

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

Хотел бы поделиться опытом работы с объектом ФорматированныйДокумент, потому что решение искал довольно долго (несколько часов), а в инете не нашел ничего, кроме описания самой проблемы (http://release.8c1.ru/bugs/341004/8.3.3.658 пост "#### 10124322"). Может кому то будет полезно.

Небольшое предисловие.

Специфика выполняемой задачи предполагала использование объекта который бы хранил в себе форматированный текст с картинками и предоставлял пользователю инструменты для правки. Мои сомнения насчет стандартных возможностей 1С 8.2.11 (с этой версии начинается история "ФорматированногоДокумента") развеяла статья http://infostart.ru/public/74958/. Вдохновленный ею я принялся за работу и вскоре наткнулся на проблему. Мне необходимо было программно соединять и построчно вклеивать друг в друга два форматированных документа, написал необходимые функции, в которых я использовал метод ПолучитьHTML(), менял HTML-код и записывал обратно в объект, используя метод УстановитьHTML(). Но почему то форматирование некоторых блоков терялось. Я решил все проверить, и понял что форматирование теряется, даже если просто ПолучитьHTML() и тут же УстановитьHTML() никак не меняя HTML-код. И я понял что это ошибка платформы... (если бы это было видео, я бы даже вставил здесь какую-нибудь эпичную музыку, потому что шире вселенной было горе мое). Отказываться от использования этого объекта я не хотел и начал искать способ решения данной проблемы.

 

Решение проблемы 

Как оказалось проблема в следующем: если в свойстве style='некое css форматирование'  блока параграфа, который ФорматированныйОбъект использует для хранения текста, последнее css свойство не закрыто символом ";" то метод УстновитьHTML() игнорирует все форматирование. При этом либо метод ПолучитьHTML() иногда читает html не закрывая последнее свойство css точкой с запятой, либо объект ФорматированныйДокумент странным, непонятным образом хранит html-форматирование. Получается, что при вызове метода ПрочитатьHTML и за ним УстановитьHTML, даже никак не меняя текст HTML, можно потерять форматирование некоторых блоков (я проверял).

Например:

Такой код, после применения метода УстановитьHTML(), не будет размещать текст в центре, потому что css-свойство "text-align" блока не было закрыто символом ";":

p style='line-height: 1.15; text-align: center'

Если же добавить символ ";", то метод УстановитьHTML() отработает корректно, и текст будет размещен в центре:

p style='line-height: 1.15; text-align: center;'

 

Для меня важно было сохранить выравнивание текста, поэтому я применил следующий код:

	ТекстХТМЛ=СтрЗаменить (ТекстХТМЛ, "center'", "center;'");
	ТекстХТМЛ=СтрЗаменить (ТекстХТМЛ, "right'", "right;'");
	ТекстХТМЛ=СтрЗаменить (ТекстХТМЛ, "justify'", "justify;'");

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

 

Приложение

Хотел приложить две функции для работы с объектами ФорматированныйДокумент, учитывающие описанные в этой статье особенности (назовем этот баг так). Но как ни пытался экранировать html-теги - все равно неадекватно отображается на странице. Если кому то будет необходимо - можете написать мне на realturik@mail.ru - вышлю текстом.

Функция "СклеитьДокументы (Документ1, Документ2)" возвращает ФорматированныйДокумент содержащий оба документа, следующие друг за другом.

Функция "ВклеитьДокумент (Документ1, Документ2)" возвращает ФорматированныйДокумент содержащий оба документа, соединенные построчно (к каждой строке Документа1 приписывается соответстующая строка Документа2, и дописывается остаток текста болльшего из них).

Спасибо за внимание!

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр Капустин (kapustinag) 17.01.14 09:54
Тот HTML, который у Вас "на входе" - сформирован Вами же раньше (неважно, вручную или программно), или может быть из произвольных внешних источников?
Если сформирован Вами, то можно было бы проверить, в точном ли соответствии со стандартом HTML он сделан. Например, результат форматирования может зависеть от наличия/отсутствия пробела после символа ";".
2. Сергей Кудашкин (sikuda) 17.01.14 18:33
Поддержу за старания, но похоже автор считает что в 1С полноценный браузер. А зря http://infostart.ru/public/171763/
3. Владимир Антонов (vovant) 28.06.16 20:16
Форматированный документ в 1С может и удобный для пользователя объект, но для программирования очень сырой. Особенно если осуществляется конвертация HTML и обратно. Потерь очень много. Я попробовал с ним поработать и решил пока использовать только макет HTML и полеHTMLдокумента. Тут ничего не потеряешь, текст - он и в Африке текст.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа