Тип: ТекстHTML, Неопределено. Родительский узел узла HTML или Неопределено, в случае отсутствия такового. Все узлы, за исключением Атрибут, Документ, ФрагментДокумента, могут иметь родительский узел. Если узел только что был создан и еще не добавлен в дерево или был уже удален из него, родительский узел отсутствует.
Полное описание, параметры и ограничения
ТекстHTML.РодительскийУзел (HTMLText.ParentNode)
ТекстHTML (HTMLText)
РодительскийУзел (ParentNode)
Доступен, начиная с версии 8.2.
Использование:
Только чтение.
Описание:
Тип: ТекстHTML, Неопределено.
Родительский узел узла HTML или Неопределено, в случае отсутствия такового.
Все узлы, за исключением Атрибут, Документ, ФрагментДокумента, могут иметь родительский узел.
Если узел только что был создан и еще не добавлен в дерево или был уже удален из него, родительский узел отсутствует.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Изменить три отделённые HTML-копии и сохранить настоящие оригиналы
Настоящие атрибут, текст и комментарий из своей строки копируются с проверкой реальных типов, паспорта, отдельных границ и пользовательских отметок. Меняем только копии на B-02, повторно читаем неизменные оригиналы A-01 и вычисляем сумму отметок 6.
Где и как запускать
Сервер; полный неглобальный непривилегированный общий модуль HTMLПаспорт85. Только собственная строка и память.
Подготовка
Будущий ручной опыт выполняйте в своей новой пустой учебной конфигурации на платформе 8.5.1.1343, в толстом управляемом клиенте. Здесь создаётся только собственное дерево из фиксированной строки в памяти; файлы, Интернет и объекты рабочей базы не используются.
Общие → Общие модули → создать HTMLПаспорт85. Сервер=Да; Глобальный=Нет; Привилегированный=Нет; Вызов сервера=Нет; оба клиентских флага=Нет; Внешнее соединение=Нет; повторное использование возвращаемых значений — Не использовать. Основной блок вставьте целиком в пустой модуль.
Общие → Общие формы → создать управляемую форму HTMLПаспорт85. Добавьте реквизит Результат85: Строка неограниченной длины; выведите многострочным полем только для чтения. Создайте команду Проверить85, Действие=Проверить85, выведите её кнопку.
У формы задайте АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать и СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Это два различных перечисления, не Булево. Не создавайте обработчики сохранения.
Второй блок — целый модуль формы HTMLПаспорт85. Третий — целый модуль общей команды ОткрытьHTMLПаспорт85 без параметра. Общую команду включите в командный интерфейс собственной учебной подсистемы. Штатные параметры обоих обработчиков передаёт платформа; вручную их не вызывайте.
Обновите конфигурацию собственной учебной базы, откройте форму общей командой и нажмите Проверить85. Разбор и изменения своих узлов выполняются на сервере; клиент получает только строку проверенного результата.
Специальные HTML-классы старого DOM и часть операций не рекомендуются начиная с 8.2. Это узкий урок сопровождения старого кода, не способ управлять браузером и не рекомендация для нового веб-интерфейса.
Этот код в 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("<html><head><title>Свои три узла</title></head><body><div id='triplet85' data-guide='A-01'>A-01<!--A-01--></div></body></html>");
Блок85 = НайтиСвойБлок85(Документ, "triplet85");
Атрибут85 = Блок85.ПолучитьУзелАтрибута("data-guide");
Если ТипЗнч(Атрибут85) <> Тип("АтрибутHTML")
Или ТипЗнч(Атрибут85.Значение) <> Тип("Строка") Или Атрибут85.Значение <> "A-01" Тогда
ВызватьИсключение "Не получен настоящий собственный атрибут";
КонецЕсли;
Владелец85 = Атрибут85.ЭлементВладелец;
Если ТипЗнч(Владелец85) <> Тип("ЭлементБлокHTML") Или Владелец85 <> Блок85 Тогда
ВызватьИсключение "Не подтверждён фактический владелец своего атрибута";
КонецЕсли;
Узлы85 = Блок85.ДочерниеУзлы;
Если ТипЗнч(Узлы85) <> Тип("СписокУзловHTML") Или Узлы85.Количество() <> 2 Тогда
ВызватьИсключение "Нужны собственные текст и комментарий, а не атрибут в списке детей";
КонецЕсли;
Текст85 = Узлы85.Элемент(0);
Пометка85 = Узлы85.Элемент(1);
Если ТипЗнч(Текст85) <> Тип("ТекстHTML")
Или ТипЗнч(Пометка85) <> Тип("КомментарийHTML")
Или Текст85.ЗначениеУзла <> "A-01" Или Пометка85.Данные <> "A-01"
Или Блок85.ТекстовоеСодержимое <> "A-01" Тогда
ВызватьИсключение "Не получена собственная типизированная тройка A-01";
КонецЕсли;
Отчет185 = ПроверитьКопию85(Атрибут85, Документ, 1);
Отчет285 = ПроверитьКопию85(Текст85, Документ, 2);
Отчет385 = ПроверитьКопию85(Пометка85, Документ, 3);
Отметка185 = Атрибут85.ПолучитьПользовательскиеДанные("own-html85-passport");
Отметка285 = Текст85.ПолучитьПользовательскиеДанные("own-html85-passport");
Отметка385 = Пометка85.ПолучитьПользовательскиеДанные("own-html85-passport");
Если ТипЗнч(Отметка185) <> Тип("Число") Или Отметка185 <> 1
Или ТипЗнч(Отметка285) <> Тип("Число") Или Отметка285 <> 2
Или ТипЗнч(Отметка385) <> Тип("Число") Или Отметка385 <> 3 Тогда
ВызватьИсключение "Не прочитаны реальные три отметки обработки";
КонецЕсли;
Итого85 = Отметка185 + Отметка285 + Отметка385;
Если Итого85 <> 6 Или Атрибут85.Значение <> "A-01"
Или Текст85.ЗначениеУзла <> "A-01" Или Пометка85.Данные <> "A-01"
Или Блок85.ТекстовоеСодержимое <> "A-01"
Или Блок85.ДочерниеУзлы.Количество() <> 2 Тогда
ВызватьИсключение "Копии изменили собственные оригиналы или итог отметок";
КонецЕсли;
Возврат Отчет185 + Символы.ПС + Отчет285 + Символы.ПС + Отчет385 + Символы.ПС
+ "Оригиналы A-01 сохранены; копии B-02 проверены; сумма отметок: " + Строка(Итого85);
КонецФункции
Функция ПроверитьКопию85(Узел85, Документ, Номер85)
Если ТипЗнч(Узел85) <> Тип("АтрибутHTML")
И ТипЗнч(Узел85) <> Тип("ТекстHTML")
И ТипЗнч(Узел85) <> Тип("КомментарийHTML") Тогда
ВызватьИсключение "Нужен один из трёх настоящих собственных видов узла";
КонецЕсли;
Имя85 = Узел85.ИмяУзла;
ТипУзла85 = Узел85.ТипУзла;
Значение85 = Узел85.ЗначениеУзла;
Содержимое85 = Узел85.ТекстовоеСодержимое;
ЛокальноеИмя85 = Узел85.ЛокальноеИмя;
Префикс85 = Узел85.Префикс;
Дети85 = Узел85.ДочерниеУзлы;
ЧислоДетей85 = Дети85.Количество();
ЕстьДети85 = Узел85.ЕстьДочерниеУзлы();
ЕстьАтрибуты85 = Узел85.ЕстьАтрибуты();
Если ТипЗнч(Имя85) <> Тип("Строка") Или ТипЗнч(Значение85) <> Тип("Строка")
Или Значение85 <> "A-01" Или ТипЗнч(Содержимое85) <> Тип("Строка")
Или ТипЗнч(Дети85) <> Тип("СписокУзловHTML")
Или ТипЗнч(ЧислоДетей85) <> Тип("Число")
Или ТипЗнч(ЕстьДети85) <> Тип("Булево") Или ЕстьДети85 <> (ЧислоДетей85 > 0)
Или ТипЗнч(ЕстьАтрибуты85) <> Тип("Булево") Или ЕстьАтрибуты85
Или Узел85.Атрибуты <> Неопределено Или Узел85.ДокументВладелец <> Документ Тогда
ВызватьИсключение "Исходный фактический паспорт не соответствует своему узлу";
КонецЕсли;
Если ТипЗнч(Узел85) = Тип("АтрибутHTML") Тогда
Если ЧислоДетей85 < 0 Или ЧислоДетей85 > 1 Тогда
ВызватьИсключение "Не поддержана фактическая форма значения атрибута";
КонецЕсли;
Если ЧислоДетей85 = 1 Тогда
Ребенок85 = Дети85.Элемент(0);
Если ТипЗнч(Ребенок85) <> Тип("ТекстHTML") Или Ребенок85.ЗначениеУзла <> "A-01" Тогда
ВызватьИсключение "Не прочитан настоящий текстовый ребёнок атрибута";
КонецЕсли;
КонецЕсли;
Иначе
Если ЧислоДетей85 <> 0 Или Префикс85 <> Неопределено Тогда
ВызватьИсключение "Текст и комментарий должны быть листовыми узлами без префикса";
КонецЕсли;
КонецЕсли;
СтарыеДанные85 = Узел85.УстановитьПользовательскиеДанные("own-html85-passport", Номер85);
Если СтарыеДанные85 <> Неопределено
Или Узел85.ПолучитьПользовательскиеДанные("own-html85-passport") <> Номер85 Тогда
ВызватьИсключение "Собственная новая отметка не установлена";
КонецЕсли;
Копия85 = Узел85.КлонироватьУзел(Истина);
Если ТипЗнч(Копия85) <> ТипЗнч(Узел85) Тогда
ВызватьИсключение "Копия не имеет фактический исходный тип HTML";
КонецЕсли;
РавенДо85 = Узел85.УзелРавен(Копия85);
Идентичен85 = Узел85.УзелИдентичен(Копия85);
Если ТипЗнч(РавенДо85) <> Тип("Булево") Или Не РавенДо85
Или ТипЗнч(Идентичен85) <> Тип("Булево") Или Идентичен85
Или Копия85.РодительскийУзел <> Неопределено
Или Копия85.ПредыдущийСоседний <> Неопределено
Или Копия85.СледующийСоседний <> Неопределено
Или Копия85.ПолучитьПользовательскиеДанные("own-html85-passport") <> Неопределено Тогда
ВызватьИсключение "Не подтверждена настоящая отдельная копия без отметок";
КонецЕсли;
Если Копия85.ИмяУзла <> Имя85 Или Копия85.ТипУзла <> ТипУзла85
Или Копия85.ЗначениеУзла <> Значение85 Или Копия85.ТекстовоеСодержимое <> Содержимое85
Или Копия85.ЛокальноеИмя <> ЛокальноеИмя85 Или Копия85.Префикс <> Префикс85
Или Копия85.Атрибуты <> Неопределено Или Копия85.ДокументВладелец <> Документ
Или Копия85.ДочерниеУзлы.Количество() <> ЧислоДетей85
Или Копия85.ЕстьДочерниеУзлы() <> ЕстьДети85 Или Копия85.ЕстьАтрибуты() <> ЕстьАтрибуты85 Тогда
ВызватьИсключение "Повторное чтение копии не совпало с фактическим паспортом";
КонецЕсли;
Дополнение85 = "";
Если ТипЗнч(Копия85) = Тип("АтрибутHTML") Тогда
АтрибутКопия85 = Копия85;
АтрибутКопия85.Значение = "B-02";
НовыеДети85 = АтрибутКопия85.ДочерниеУзлы;
Если ТипЗнч(НовыеДети85) <> Тип("СписокУзловHTML") Или НовыеДети85.Количество() <> 1 Тогда
ВызватьИсключение "Запись значения копии не создала один настоящий текстовый узел";
КонецЕсли;
НовыйТекст85 = НовыеДети85.Элемент(0);
Если ТипЗнч(НовыйТекст85) <> Тип("ТекстHTML") Или НовыйТекст85.ЗначениеУзла <> "B-02"
Или АтрибутКопия85.Значение <> "B-02" Тогда
ВызватьИсключение "Не подтверждено новое значение только копии атрибута";
КонецЕсли;
Дополнение85 = "Детей атрибута до: " + Строка(ЧислоДетей85)
+ "; после изменения копии: " + Строка(НовыеДети85.Количество());
Иначе
ЛистоваяКопия85 = Копия85;
Если ЛистоваяКопия85.ДочерниеУзлы.Количество() <> 0
Или ЛистоваяКопия85.ПервыйДочерний <> Неопределено
Или ЛистоваяКопия85.ПоследнийДочерний <> Неопределено Тогда
ВызватьИсключение "Листовая копия неожиданно имеет детей";
КонецЕсли;
ЛистоваяКопия85.ЗначениеУзла = "B-02";
Пробелы85 = ЛистоваяКопия85.ЭтоПробельныеСимволыЭлемента;
Если ТипЗнч(Пробелы85) <> Тип("Булево") Тогда
ВызватьИсключение "Не получен фактический признак пробельного текста";
КонецЕсли;
Дополнение85 = "Признак пробелов: " + Строка(Пробелы85);
Если ТипЗнч(ЛистоваяКопия85) = Тип("КомментарийHTML") Тогда
КопияПометки85 = ЛистоваяКопия85;
ПолныйПометки85 = КопияПометки85.ПолныйТекст;
Если ТипЗнч(ПолныйПометки85) <> Тип("Строка") Тогда
ВызватьИсключение "Не прочитан фактический полный текст копии комментария";
КонецЕсли;
Дополнение85 = Дополнение85 + "; фактический полный текст: " + ПолныйПометки85;
КонецЕсли;
КонецЕсли;
РавенПосле85 = Узел85.УзелРавен(Копия85);
Если ТипЗнч(РавенПосле85) <> Тип("Булево") Или РавенПосле85
Или Копия85.ЗначениеУзла <> "B-02" Или Узел85.ЗначениеУзла <> Значение85
Или Узел85.ИмяУзла <> Имя85 Или Узел85.ТипУзла <> ТипУзла85
Или Узел85.ТекстовоеСодержимое <> Содержимое85
Или Узел85.ЛокальноеИмя <> ЛокальноеИмя85 Или Узел85.Префикс <> Префикс85
Или Узел85.ДочерниеУзлы.Количество() <> ЧислоДетей85
Или Узел85.ПолучитьПользовательскиеДанные("own-html85-passport") <> Номер85 Тогда
ВызватьИсключение "Независимость изменённой копии от оригинала не подтверждена";
КонецЕсли;
Возврат "Узел " + Строка(Номер85) + ": имя=" + Имя85 + "; тип=" + Строка(ТипУзла85)
+ "; оригинал=" + Узел85.ЗначениеУзла + "; копия=" + Копия85.ЗначениеУзла
+ "; локальное имя=" + Строка(ЛокальноеИмя85) + "; префикс=" + Строка(Префикс85)
+ "; текст до=" + Содержимое85 + "; отметка=" + Строка(Узел85.ПолучитьПользовательскиеДанные("own-html85-passport"))
+ "; " + Дополнение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");
#Иначе
ВызватьИсключение "Нужен толстый управляемый клиент";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Своя строка содержит атрибут data-guide, видимый текст и комментарий со значением A-01. Атрибут получается через ПолучитьУзелАтрибута, а два ребёнка — из настоящего ограниченного списка; каждый специальный тип проверяется до его свойств.
Паспорт читает реальные имена, тип узла, значения, текст, локальное имя, префикс, число детей и признаки атрибутов. Эти данные сравниваются с копией и выводятся, а не подменяются именами #text/#comment или выдуманными пустыми пространствами имён.
Три настоящие отметки 1, 2 и 3 устанавливаются на исходных узлах. КлонироватьУзел(Истина) возвращает общий набор HTML-типов: у каждой фактической копии проверяется исходный тип, равенство содержания и отсутствие идентичности.
Копии не вставляются в дерево. Их фактические родитель, предыдущий и следующий сосед должны быть Неопределено; пользовательская отметка не копируется. Так изучаются отдельные копии, а не спорные соседние объекты разных классов.
Меняется только копия: Значение атрибута либо ЗначениеУзла текста/комментария становится B-02. У атрибута настоящий setter создаёт текстового ребёнка, который заново читается через широкий СписокУзловHTML и проверяется как ТекстHTML.
ПервыйДочерний и ПоследнийДочерний используются только у фактических листовых копий текста/комментария. У атрибута эти два свойства не демонстрируются: их объявленный тип АтрибутHTML не подтверждает текстового ребёнка.
После изменения родные узлы повторно читаются как A-01; копия уже не равна оригиналу, но это не повреждает исходную страницу. Отдельно читаются реальные три числовые отметки и вычисляется их сумма 6.
ПолныйТекст комментария и признак пробелов выводятся как фактические устаревшие наблюдения без обещания заранее известного значения. На клиент не передаются узлы, списки, перечисления или служебные данные — только строковый протокол.
Как проверить результат
Первый будущий запуск: три строки паспорта показывают реальные имена/типы; оригиналы остаются A-01, отдельные копии прочитаны как B-02, фактическая сумма отметок равна 6.
Проследите настоящие три типа до КлонироватьУзел, затем отдельный фактический тип каждой копии. До изменения равенство Истина, идентичность Ложь; после изменения равенство Ложь.
В отладчике у настоящих отделённых копий проверьте фактические Неопределено у родителя и соседей и отсутствие скопированных пользовательских отметок. Не прикрепляйте копии для искусственного исправления проверки.
У исходного атрибута допускается только измеренная форма 0/1 ребёнок. После записи значения копии должен быть один настоящий текстовый ребёнок B-02; исходный атрибут и страница не меняются.
Только в собственной копии уберите одну из проверок типа или подставьте прежний узел вместо результата клонирования: это отрицательный опыт, который не должен проходить контроль содержания и идентичности.
При неподдержанной фактической форме дерева или исключении нет успешного протокола. Состояние предыдущего отчёта очищается; ошибочный вызов не повторяется автоматически.
Ожидаемый результат
При полном успешном контроле: три реальные отдельные копии B-02, неизменные оригиналы A-01 и сумма трёх реально прочитанных отметок 6. Конкретные имена/полный текст устаревших свойств показываются как наблюдения.
На что обратить внимание
Модель создаётся только из собственной фиксированной строки. Нельзя подставлять внешний документ, объект пользователя, файл, URL или рабочие данные и считать этот пример проверкой их безопасности.
Установленная 8.5.1.1343 объявляет СоздатьКомментарий → КомментарийDOM и СоздатьТекстовыйУзел → ТекстDOM. Они не служат доказательством специальных HTML-получателей. Здесь реальные специальные узлы происходят из собственного HTMLReader/DOMBuilder и проверяются.
Общий возвращаемый HTML-тип не обещает конкретный класс в любой среде. Несовпадение фактического типа/формы означает остановку и неподтверждённый опыт, не успешный обход ошибки.
Не переносите правила имён, соседей и пространств имён из W3C по памяти. Сохраняются точные объявленные локальные контракты и реальные наблюдения; данные узлов не приводятся к другому классу.
Чтение закрывается на нормальном пути и в обработчике ошибки; исключение повторно вызывается. Ошибка самого закрытия тоже останавливает опыт: успешная очистка при любом отказе не обещается.
Нативные тексты справки и существующие конфигурационные образцы не исправлялись. Компилятор и 1С во время подготовки не запускались; статические проверки не являются выполнением примера.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Удалить временное пояснение из дерева, не потерять сохранённый объект
УдалитьДочерний возвращает удалённый узел. Он перестаёт быть ребёнком, но данные доступны через собственную ссылку.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Используйте учебную базу платформы 8.5.1.1343 и серверную процедуру учебного общего модуля. Каждый пример выполняйте отдельно.
Все данные заказа вымышлены и находятся в строке. ЧтениеHTML разбирает данные, но не является браузером: форма не отправляется, ссылки не открываются, картинки не скачиваются.
Никакие файлы, адреса сайтов, токены и документы информационной базы не нужны. Не заменяйте учебную строку произвольным внешним HTML без отдельной проверки безопасности.
Индексы коллекций начинаются с нуля. Перед обращением к найденному узлу проверяйте Неопределено; перед специальными свойствами элемента проверяйте его тип.
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";
КонецЕсли;
Форма.ДобавитьДочерний(Блок);
Текст = Документ.СоздатьТекстовыйУзел("Не сохранять");
Блок.ДобавитьДочерний(Текст);
Удалённый = Блок.УдалитьДочерний(Текст);
Сообщить(Удалённый.УзелИдентичен(Текст));
Сообщить(Удалённый.РодительскийУзел = Неопределено);
Сообщить(Удалённый.ДокументВладелец = Документ);
Сообщить(Удалённый.Данные = "Не сохранять");
Сообщить(Не Блок.ЕстьДочерниеУзлы());Разбор по шагам
Удаляем только собственный текст из собственного контейнера памяти.
Результат метода сохраняем как ссылку, не путаем с булевой успешностью.
Проверяем отсутствие родителя и сохранение документа-владельца.
Удаление DOM-ребёнка не является удалением файла или документа базы.
Как проверить результат
Пять сравнений дают Истина; контейнер пуст, а данные удалённого узла ещё читаются.
Таблица товаров и поля формы не удалены.
Ожидаемый результат
Разделены исключение из дерева и существование объекта в памяти.
На что обратить внимание
Не вызывайте удаление повторно на том же родителе: узел уже не является его ребёнком.
Этот урок не авторизует удаление пользовательских данных.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.