Особенности работы с методами Получить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С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    26279    TitanLuchs    106    

145

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    14550    bayselonarrend    127    

68

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

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    16005    user2122906    9    

60

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

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

14.01.2025    26481    dsdred    77    

142

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

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

23.06.2024    24416    bayselonarrend    22    

175

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

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

13.03.2024    13426    dsdred    22    

85
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kapustinag 17.01.14 09:54 Сейчас в теме
Тот HTML, который у Вас "на входе" - сформирован Вами же раньше (неважно, вручную или программно), или может быть из произвольных внешних источников?
Если сформирован Вами, то можно было бы проверить, в точном ли соответствии со стандартом HTML он сделан. Например, результат форматирования может зависеть от наличия/отсутствия пробела после символа ";".
2. sikuda 680 17.01.14 18:33 Сейчас в теме
Поддержу за старания, но похоже автор считает что в 1С полноценный браузер. А зря http://infostart.ru/public/171763/
3. vovant 43 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 Сейчас в теме
хотелось бы посмотреть на реализацию Функция "СклеитьДокументы иначе в статье отсутствует решение и получается оно бесполезным.
Для отправки сообщения требуется регистрация/авторизация