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

17.01.14

Разработка - Механизмы платформы 1С

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

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

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

Специфика выполняемой задачи предполагала использование объекта который бы хранил в себе форматированный текст с картинками и предоставлял пользователю инструменты для правки. Мои сомнения насчет стандартных возможностей 1С 8.2.11 (с этой версии начинается история "ФорматированногоДокумента") развеяла статья //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, и дописывается остаток текста болльшего из них).

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

 

ФорматированныйДокумент ПолучитьHTML УстановитьHTML ошибка форматирование Форматированный Документ

См. также

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    5764    dsdred    40    

91

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    10006    bayselonarrend    21    

161

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    7192    dsdred    18    

81

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    23216    YA_418728146    29    

73

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    25346    SeiOkami    48    

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