ТекстHTML.ПолныйТекст

Свойства · WholeText

Тип: Строка. Содержит текст логически смежных текстовых узлов. Текст формируется из текстовых узлов, смежных с данным, в порядке следования в документе.

Полное описание, параметры и ограничения

ТекстHTML.ПолныйТекст (HTMLText.WholeText)

ТекстHTML (HTMLText)

ПолныйТекст (WholeText)

Не рекомендуется использовать, начиная с версии 8.2.

Доступен, начиная с версии 8.2.

Использование:
Только чтение.
Описание:
Тип: Строка.
Содержит текст логически смежных текстовых узлов.
Текст формируется из текстовых узлов, смежных с данным, в порядке следования в документе.
Доступность:

Тонкий клиент, сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.2.

Не рекомендуется использовать, начиная с версии 8.2.

Методическая информация

Практические примеры

Удалить своё связанное HTML-пояснение и проверить пустой результат

Два настоящих ТекстHTML получаются из своей строки, переносятся в собственный контейнер и удаляются документированной пустой заменой. Повторное чтение подтверждает удаление пояснения и неизменный контроль заказа.

Где и как запускать

Сервер; полный неглобальный непривилегированный общий модуль HTMLТекст85. Только собственная строка и память.

Подготовка

  1. Будущий ручной опыт выполняйте в своей новой пустой учебной конфигурации на платформе 8.5.1.1343, в толстом управляемом клиенте. Здесь создаётся только собственное дерево из фиксированной строки в памяти; файлы, Интернет и объекты рабочей базы не используются.

  2. Общие → Общие модули → создать HTMLТекст85. Сервер=Да; Глобальный=Нет; Привилегированный=Нет; Вызов сервера=Нет; оба клиентских флага=Нет; Внешнее соединение=Нет; повторное использование возвращаемых значений — Не использовать. Основной блок вставьте целиком в пустой модуль.

  3. Общие → Общие формы → создать управляемую форму HTMLТекст85. Добавьте реквизит Результат85: Строка неограниченной длины; выведите многострочным полем только для чтения. Создайте команду Проверить85, Действие=Проверить85, выведите её кнопку.

  4. У формы задайте АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать и СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Это два различных перечисления, не Булево. Не создавайте обработчики сохранения.

  5. Второй блок — целый модуль формы HTMLТекст85. Третий — целый модуль общей команды ОткрытьHTMLТекст85 без параметра. Общую команду включите в командный интерфейс собственной учебной подсистемы. Штатные параметры обоих обработчиков передаёт платформа; вручную их не вызывайте.

  6. Обновите конфигурацию собственной учебной базы, откройте форму общей командой и нажмите Проверить85. Разбор и изменения своих узлов выполняются на сервере; клиент получает только строку проверенного результата.

  7. Специальные HTML-классы старого DOM и часть операций не рекомендуются начиная с 8.2. Это узкий урок сопровождения старого кода, не способ управлять браузером и не рекомендация для нового веб-интерфейса.

  8. Этот код в 1С ещё не компилировался и не выполнялся. Неверный фактический тип, форма дерева, отказ операции или исключение означают остановку; сообщение об остановке не является успешным примером.

Функция ПрочитатьСвоюСтроку85(СтрокаHTML85)
    Чтение = Новый ЧтениеHTML;
    Если ТипЗнч(Чтение) <> Тип("ЧтениеHTML") Тогда
        ВызватьИсключение "Не создано настоящее ЧтениеHTML";
    КонецЕсли;
    Попытка
        Чтение.УстановитьСтроку(СтрокаHTML85);
        Построитель = Новый ПостроительDOM;
        Если ТипЗнч(Построитель) <> Тип("ПостроительDOM") Тогда
            ВызватьИсключение "Не создан настоящий ПостроительDOM";
        КонецЕсли;
        Документ = Построитель.Прочитать(Чтение);
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Чтение.Закрыть();
    Если ТипЗнч(Документ) <> Тип("ДокументHTML") Тогда
        ВызватьИсключение "Не получен настоящий ДокументHTML";
    КонецЕсли;
    Возврат Документ;
КонецФункции

Функция НайтиСвойБлок85(Документ, Идентификатор85)
    Блок85 = Документ.ПолучитьЭлементПоИдентификатору(Идентификатор85);
    Если Блок85 = Неопределено Тогда
        ВызватьИсключение "В своей строке не найден нужный div";
    КонецЕсли;
    Если ТипЗнч(Блок85) <> Тип("ЭлементБлокHTML")
        Или Блок85.ДокументВладелец <> Документ Тогда
        ВызватьИсключение "Нужен настоящий собственный ЭлементБлокHTML";
    КонецЕсли;
    Возврат Блок85;
КонецФункции

Функция ПрочитатьСвойТекст85(Блок85, ОжидаемаяСтрока85)
    Узлы85 = Блок85.ДочерниеУзлы;
    Если ТипЗнч(Узлы85) <> Тип("СписокУзловHTML")
        Или ТипЗнч(Узлы85.Количество()) <> Тип("Число")
        Или Узлы85.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен список с одним настоящим текстовым узлом";
    КонецЕсли;
    Текст85 = Узлы85.Элемент(0);
    Если ТипЗнч(Текст85) <> Тип("ТекстHTML")
        Или ТипЗнч(Текст85.ЗначениеУзла) <> Тип("Строка")
        Или Текст85.ЗначениеУзла <> ОжидаемаяСтрока85 Тогда
        ВызватьИсключение "Не получен собственный ТекстHTML с нужной строкой";
    КонецЕсли;
    Возврат Текст85;
КонецФункции
Функция Проверить85() Экспорт
    Документ = ПрочитатьСвоюСтроку85("<html><head><title>Свой текст</title></head><body><div id='textA85'>Книга</div><div id='textB85'>: 3</div><div id='textTarget85'></div><div id='textSentinel85'>Заказ A-01, количество 3</div></body></html>");
    Источник185 = НайтиСвойБлок85(Документ, "textA85");
    Источник285 = НайтиСвойБлок85(Документ, "textB85");
    Цель85 = НайтиСвойБлок85(Документ, "textTarget85");
    Контроль85 = НайтиСвойБлок85(Документ, "textSentinel85");
    Первый85 = ПрочитатьСвойТекст85(Источник185, "Книга");
    Второй85 = ПрочитатьСвойТекст85(Источник285, ": 3");
    Если Первый85.ДокументВладелец <> Документ Или Второй85.ДокументВладелец <> Документ
        Или Цель85.ДочерниеУзлы.Количество() <> 0 Тогда
        ВызватьИсключение "Перед переносом нужна собственная пустая цель";
    КонецЕсли;
    КонтрольДо85 = Контроль85.ТекстовоеСодержимое;
    Если ТипЗнч(КонтрольДо85) <> Тип("Строка")
        Или КонтрольДо85 <> "Заказ A-01, количество 3" Тогда
        ВызватьИсключение "Неверен собственный контрольный текст";
    КонецЕсли;
    Добавлен185 = Цель85.ДобавитьДочерний(Первый85);
    Добавлен285 = Цель85.ДобавитьДочерний(Второй85);
    Если ТипЗнч(Добавлен185) <> Тип("ТекстHTML")
        Или ТипЗнч(Добавлен285) <> Тип("ТекстHTML")
        Или Не Добавлен185.УзелИдентичен(Первый85)
        Или Не Добавлен285.УзелИдентичен(Второй85) Тогда
        ВызватьИсключение "Результаты переноса не подтверждают свои текстовые узлы";
    КонецЕсли;
    Если Источник185.ДочерниеУзлы.Количество() <> 0
        Или Источник285.ДочерниеУзлы.Количество() <> 0
        Или Цель85.ДочерниеУзлы.Количество() <> 2
        Или Цель85.ТекстовоеСодержимое <> "Книга: 3" Тогда
        ВызватьИсключение "Два реальных узла не перенесены в нужном порядке";
    КонецЕсли;
    Текущий = Цель85.ДочерниеУзлы.Элемент(0);
    Если ТипЗнч(Текущий) <> Тип("ТекстHTML") Тогда
        ВызватьИсключение "Перед пустой заменой нужен актуальный ТекстHTML";
    КонецЕсли;
    ПолныйДо85 = Текущий.ПолныйТекст;
    Если ТипЗнч(ПолныйДо85) <> Тип("Строка") Или ПолныйДо85 <> "Книга: 3" Тогда
        ВызватьИсключение "Не получен реальный связанный текст";
    КонецЕсли;
    ПустойРезультат = Текущий.ЗаменитьПолныйТекст("");
    Если Не (ПустойРезультат = Неопределено) Тогда
        ВызватьИсключение "Пустая замена должна вернуть Неопределено";
    КонецЕсли;
    Если Цель85.ДочерниеУзлы.Количество() <> 0
        Или Цель85.ТекстовоеСодержимое <> ""
        Или Контроль85.ТекстовоеСодержимое <> КонтрольДо85 Тогда
        ВызватьИсключение "Повторное чтение не подтвердило удаление только своего пояснения";
    КонецЕсли;
    Возврат "Удалено пояснение: " + ПолныйДо85 + ". Дочерних узлов: "
        + Строка(Цель85.ДочерниеУзлы.Количество()) + ". Контроль: " + Контроль85.ТекстовоеСодержимое;
КонецФункции
Целый модуль своей управляемой формы HTMLТекст85

Общие → Общие формы → HTMLТекст85 → пустой модуль. Вставить целиком; Результат85 — строка; Действие команды Проверить85 связано с обработчиком.

Клиент — настоящий обработчик команды; сервер — ПолучитьПротокол85НаСервере. По границе передаётся только строка.

&НаКлиенте
Процедура Проверить85(Команда)
    Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "Проверить85" Тогда
        ВызватьИсключение "Нажмите настоящую собственную кнопку проверки";
    КонецЕсли;
    Результат85 = "";
    Попытка
        Получено85 = ПолучитьПротокол85НаСервере();
        Если ТипЗнч(Получено85) <> Тип("Строка") Или Получено85 = "" Тогда
            ВызватьИсключение "Сервер не вернул полный строковый протокол";
        КонецЕсли;
        Результат85 = Получено85;
    Исключение
        Результат85 = "Проверка НЕ завершена. Опыт остановлен.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаСервере
Функция ПолучитьПротокол85НаСервере()
    Если ИмяФормы <> "ОбщаяФорма.HTMLТекст85"
        Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
        Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
        ВызватьИсключение "Нужна своя форма с отключённым сохранением данных";
    КонецЕсли;
    Отчет85 = HTMLТекст85.Проверить85();
    Если ТипЗнч(Отчет85) <> Тип("Строка") Или Отчет85 = "" Тогда
        ВызватьИсключение "Собственный модуль не вернул полный протокол";
    КонецЕсли;
    Возврат Отчет85;
КонецФункции
Целый модуль своей общей команды ОткрытьHTMLТекст85

Общие → Общие команды → ОткрытьHTMLТекст85 → пустой модуль. Без параметра; включить в собственный командный интерфейс.

Толстый управляемый клиент, &НаКлиенте. Настоящий ОбработкаКоманды с двумя штатными параметрами.

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        Если ПараметрКоманды <> Неопределено
            Или ТипЗнч(ПараметрыВыполненияКоманды) <> Тип("ПараметрыВыполненияКоманды") Тогда
            ВызватьИсключение "Откройте свою форму штатной общей командой без параметра";
        КонецЕсли;
        ОткрытьФорму("ОбщаяФорма.HTMLТекст85");
    #Иначе
        ВызватьИсключение "Нужен толстый управляемый клиент";
    #КонецЕсли
КонецПроцедуры

Разбор по шагам

  1. Своя строка содержит два отдельных текста «Книга» и «: 3», пустой целевой div и контрольный текст заказа. Настоящий ЧтениеHTML читает строку, а ПостроительDOM получает ДокументHTML. После чтения reader закрывается.

  2. ПолучитьЭлементПоИдентификатору объявляет общий ЭлементHTML, поэтому каждый фактический div проверяется как ЭлементБлокHTML. ДочерниеУзлы — настоящий СписокУзловHTML: сначала проверяются число детей и тип, затем индекс 0.

  3. ДобавитьДочерний переносит два настоящих ТекстHTML из прежних контейнеров. Возвращённые объекты, пустые прежние списки, два новых ребёнка и видимый текст проверяются; это не создание HTML-текста через фабрику, возвращающую ТекстDOM.

  4. ПолныйТекст актуального первого ребёнка реально объединяет «Книга: 3». Именно эту прочитанную строку используем в протоколе удаления.

  5. ЗаменитьПолныйТекст("") удаляет связанную группу. В этой документированной ветке возвращается Неопределено; у результата не вызываются свойства. Непустая замена в урок не включена из-за объявленного в справке результата ТекстDOM.

  6. После операции заново читаются целевой список, пустое текстовое содержимое и контроль заказа. Клиент видит строку только после всех проверок.

Как проверить результат

  1. Первый будущий запуск: протокол содержит фактически удалённое пояснение «Книга: 3», число детей цели 0 и прежний контроль «Заказ A-01, количество 3».

  2. В собственном отладчике проследите настоящие типы HTML и перенос: прежние списки 1/1 → 0/0, целевой 0 → 2 → 0. Не заменяйте отсутствующий узел вручную.

  3. Повторное нажатие создаёт новый документ из своей строки; исход предыдущего запуска не используется. После ошибочного запуска поле не должно сохранять прежний успешный отчёт.

  4. Только в своей учебной копии измените исходный контроль или число детей: проверка должна остановиться до дальнейшей операции. Отказ или другой фактический тип не засчитывайте как успешную демонстрацию.

Ожидаемый результат

При полном успешном контроле: удалено реально прочитанное пояснение «Книга: 3», целевой список пуст, контроль заказа сохранён. Неопределено не используется как объект.

На что обратить внимание

  1. Модель создаётся только из собственной фиксированной строки. Нельзя подставлять внешний документ, объект пользователя, файл, URL или рабочие данные и считать этот пример проверкой их безопасности.

  2. Установленная 8.5.1.1343 объявляет СоздатьКомментарий → КомментарийDOM и СоздатьТекстовыйУзел → ТекстDOM. Они не служат доказательством специальных HTML-получателей. Здесь реальные специальные узлы происходят из собственного HTMLReader/DOMBuilder и проверяются.

  3. Общий возвращаемый HTML-тип не обещает конкретный класс в любой среде. Несовпадение фактического типа/формы означает остановку и неподтверждённый опыт, не успешный обход ошибки.

  4. Не переносите правила имён, соседей и пространств имён из W3C по памяти. Сохраняются точные объявленные локальные контракты и реальные наблюдения; данные узлов не приводятся к другому классу.

  5. Чтение закрывается на нормальном пути и в обработчике ошибки; исключение повторно вызывается. Ошибка самого закрытия тоже останавливает опыт: успешная очистка при любом отказе не обещается.

  6. Нативные тексты справки и существующие конфигурационные образцы не исправлялись. Компилятор и 1С во время подготовки не запускались; статические проверки не являются выполнением примера.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Разделить текстовый узел и снова объединить его нормализацией

Разделяем КнигаРучка после пятого символа. Новый текст становится соседним узлом того же контейнера.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Используйте учебную базу платформы 8.5.1.1343 и серверную процедуру учебного общего модуля. Каждый пример выполняйте отдельно.

  2. Все данные заказа вымышлены и находятся в строке. ЧтениеHTML разбирает данные, но не является браузером: форма не отправляется, ссылки не открываются, картинки не скачиваются.

  3. Никакие файлы, адреса сайтов, токены и документы информационной базы не нужны. Не заменяйте учебную строку произвольным внешним HTML без отдельной проверки безопасности.

  4. Индексы коллекций начинаются с нуля. Перед обращением к найденному узлу проверяйте Неопределено; перед специальными свойствами элемента проверяйте его тип.

HTML = "<html><head><title>Учебный заказ</title><meta id='meta' name='description' content='Вымышленный заказ'></head>
|<body id='body'><p id='note'>Заказ существует только в памяти</p><pre id='code'>A-01: 3
|B-02: 1</pre>
|<form id='order' name='order' action='' method='get'>
|<input id='customer' name='customer' type='text' value='Учебный покупатель'>
|<input id='accepted' name='accepted' type='checkbox' value='yes'>
|<button id='preview' name='preview' type='button' value='preview'>Предпросмотр</button></form>
|<table id='items' summary='Книга и ручка'><caption id='caption'>Товары</caption><colgroup><col id='column'></colgroup><tbody>
|<tr id='book'><td id='book-name'>Книга</td><td>3</td></tr><tr id='pen'><td>Ручка</td><td>1</td></tr>
|</tbody></table><a id='help' name='help' href='#note'>Пояснение</a><img id='logo' alt='Учебная картинка без источника'>
|</body></html>";
Чтение = Новый ЧтениеHTML;
Чтение.УстановитьСтроку(HTML);
Попытка
    Построитель = Новый ПостроительDOM;
    Документ = Построитель.Прочитать(Чтение);
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если ТипЗнч(Документ) <> Тип("ДокументHTML") Тогда
    ВызватьИсключение "Ожидался ДокументHTML, а не XML-документ";
КонецЕсли;
Форма = Документ.ПолучитьЭлементПоИдентификатору("order");
Если Форма = Неопределено Тогда
    ВызватьИсключение "Не найден учебный элемент order";
КонецЕсли;
Если ТипЗнч(Форма) <> Тип("ЭлементФормаHTML") Тогда
    ВызватьИсключение "Неожиданный тип учебного элемента order";
КонецЕсли;
Блок = Документ.СоздатьЭлемент("guide-section");
Если ТипЗнч(Блок) <> Тип("ЭлементHTML") Тогда
    ВызватьИсключение "Учебный контейнер должен иметь общий тип ЭлементHTML";
КонецЕсли;
Форма.ДобавитьДочерний(Блок);
Первый = Документ.СоздатьТекстовыйУзел("КнигаРучка");
Блок.ДобавитьДочерний(Первый);
Второй = Первый.РазделитьТекст(5);
Если Второй = Неопределено Тогда
    ВызватьИсключение "Не получен второй фрагмент текста";
КонецЕсли;
Сообщить(Первый.Данные = "Книга");
Сообщить(Второй.Данные = "Ручка");
Сообщить(Второй.РодительскийУзел = Блок);
Сообщить(Блок.ДочерниеУзлы.Количество() = 2);
Сообщить(Первый.ПолныйТекст = "КнигаРучка");
Блок.Нормализовать();
Сообщить(Блок.ДочерниеУзлы.Количество() = 1);
Сообщить(Блок.ТекстовоеСодержимое = "КнигаРучка");

Разбор по шагам

  1. Исходный текст прикреплён к собственному контейнеру.

  2. РазделитьТекст создаёт второй фрагмент, проверяем его получение.

  3. ПолныйТекст относится к последовательности соседнего текста, Данные — к одному узлу.

  4. Нормализовать снова объединяет соседние фрагменты, сохраняя общую строку.

Как проверить результат

  1. Семь сравнений дают Истина; сначала два фрагмента, затем один, общий текст неизменен.

  2. Никакой разделитель-пробел автоматически не добавлялся.

Ожидаемый результат

Разделены данные одного узла и полный соседний текст.

На что обратить внимание

  1. Не путайте разделение узла с разбиением строки в массив.

  2. После нормализации заново получайте актуальные узлы из контейнера.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.