УдалитьПоФильтру меняет дерево и не возвращает очищенный текст. После удаления проверяем copy/original отдельно.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Используйте учебную базу платформы 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-документ";
КонецЕсли;
Копия = Документ.КлонироватьУзел(Истина);
Если ТипЗнч(Копия) <> Тип("ДокументHTML") Тогда
ВызватьИсключение "Удалять разрешено только из собственной копии документа";
КонецЕсли;
Фильтр = "{""type"":""elementname"",""value"":{""value"":""img"",""operation"":""equals""}}";
Сообщить(Копия.НайтиПоФильтру(Фильтр).Количество() = 1);
Копия.УдалитьПоФильтру(Фильтр);
Сообщить(Копия.НайтиПоФильтру(Фильтр).Количество() = 0);
Сообщить(Документ.НайтиПоФильтру(Фильтр).Количество() = 1);
Сообщить(Копия.Формы.Количество() = 1);Разбор по шагам
Глубоко клонируем только своё дерево, проверяя тип копии до удаления.
Сначала оцениваем число подходящих узлов; здесь заранее известна одна пустая картинка.
УдалитьПоФильтру вызывается как операция; текст затем можно получить через ЗаписьDOM и ЗаписьHTML.
Как проверить результат
Четыре сравнения Истина: один img до удаления, ноль после, один у оригинала, одна форма у копии.
Исходное описание заказа, покупатель и таблица не должны исчезнуть.
Ожидаемый результат
Из копии удалён только выбранный вид элементов.
На что обратить внимание
Этот фильтр не является полной очисткой XSS или проверкой безопасности чужого HTML.
Удаление DOM-узла не удаляет файл изображения с диска.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.