Особенности работы с методами Получить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 ошибка форматирование Форматированный Документ

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4547    dsdred    53    

72

Как готовить и есть массивы

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

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

24.01.2024    5298    YA_418728146    25    

63

Планы обмена VS История данных

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

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6412    dsdred    36    

112

1С-ная магия

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

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

06.10.2023    18480    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12094    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8831    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6283    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15989    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. kapustinag 17.01.14 09:54 Сейчас в теме
Тот HTML, который у Вас "на входе" - сформирован Вами же раньше (неважно, вручную или программно), или может быть из произвольных внешних источников?
Если сформирован Вами, то можно было бы проверить, в точном ли соответствии со стандартом HTML он сделан. Например, результат форматирования может зависеть от наличия/отсутствия пробела после символа ";".
2. sikuda 673 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 Сейчас в теме
хотелось бы посмотреть на реализацию Функция "СклеитьДокументы иначе в статье отсутствует решение и получается оно бесполезным.
Оставьте свое сообщение