ТекстDOM.ВставитьПеред

Методы · InsertBefore

Вставляет узел в список дочерних перед существующим дочерним узлом, заданным параметром <Узел>. Если вставляемый узел является узлом ФрагментДокумента, то все его дочерние узлы будут вставлены перед узлом, заданным параметром <Узел>, в том же порядке. Если узел, заданный параметром <НовыйУзел>, уже содержится в дереве документа, то он сначала удаляется из дочерних узлов прежнего родителя и вставляется в список дочерних узлов нового родителя.

Синтаксис

ВставитьПеред(<НовыйУзел>, <Узел>)
Полное описание, параметры и ограничения

ТекстDOM.ВставитьПеред (DOMText.InsertBefore)

ТекстDOM (DOMText)

ВставитьПеред (InsertBefore)

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

Синтаксис:
ВставитьПеред(<НовыйУзел>, <Узел>)
Параметры:

<НовыйУзел> (обязательный)
Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath.
Вставляемый узел DOM.

<Узел> (обязательный)
Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath.
Узел, перед которым необходимо вставить узел, заданный в параметре <НовыйУзел>.
Если параметр не задан, то узел добавляется к концу списка дочерних узлов.
Возвращаемое значение:
Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath.

Описание:

Вставляет узел в список дочерних перед существующим дочерним узлом, заданным параметром <Узел>.
Если вставляемый узел является узлом ФрагментДокумента, то все его дочерние узлы будут вставлены перед узлом, заданным параметром <Узел>, в том же порядке. Если узел, заданный параметром <НовыйУзел>, уже содержится в дереве документа, то он сначала удаляется из дочерних узлов прежнего родителя и вставляется в список дочерних узлов нового родителя.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

Примечание:
Причины вызова исключения:
данный узел не допускает в качестве дочерних добавляемый узел или добавляемый узел является одним из предков данного или узел добавляется сам в себя или данный узел Документ и добавляется второй узел ОпределениеТипаДокумента или Элемент;

добавляемый узел был создан документом отличным от создавшего данный узел;

данный узел в режиме Только для чтения или если предыдущий родитель добавляемого узла в режиме Только для чтения;

узел, перед которым осуществляется вставка, не найден.

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

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

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

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

Понять, почему у текста, CDATA, комментария и инструкции нет дочерних элементов

Наличие общих методов DOM у листового узла не означает, что он может содержать element. Проверяем отказы и сохраняем значения четырёх реальных видов узлов.

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

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

Подготовка

  1. Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.

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

  3. Преобразования выполняются только над собственным XML в памяти. Примеры не читают файлы, внешние DTD, URL или данные информационной базы.

  4. У методов DOM возвращаемый узел сохраняйте в переменную: исходная ссылка и результат операции не всегда обозначают один объект.

Документ = Новый ДокументDOM("", "product");
Листья = Новый Массив;
Листья.Добавить(Документ.СоздатьТекстовыйУзел("Книга"));
Листья.Добавить(Документ.СоздатьСекциюCDATA("<описание>"));
Листья.Добавить(Документ.СоздатьКомментарий("Учебный товар"));
Листья.Добавить(Документ.СоздатьИнструкциюОбработки("guide", "mode=test"));
Для Каждого Лист Из Листья Цикл
    ПрежнееЗначение = Лист.ЗначениеУзла;
    Кандидат = Документ.СоздатьЭлемент("note");
    Отказов = 0;
    Попытка
        Лист.ДобавитьДочерний(Кандидат);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Попытка
        Лист.ВставитьПеред(Кандидат, Неопределено);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Попытка
        Лист.ЗаменитьДочерний(Кандидат, Кандидат);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Попытка
        Лист.УдалитьДочерний(Кандидат);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Если Отказов <> 4 Тогда
        ВызватьИсключение "Неожиданно принята недопустимая операция над листовым узлом";
    КонецЕсли;
    Лист.Нормализовать();
    Сообщить(СтрШаблон("%1: ожидаемых отказов %2", ТипЗнч(Лист), Отказов));
    Сообщить(Лист.ДочерниеУзлы.Количество() = 0);
    Сообщить(Лист.ЗначениеУзла = ПрежнееЗначение);
    Сообщить(Кандидат.РодительскийУзел = Неопределено);
КонецЦикла;

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

  1. Создаём четыре листовых узла. Ни один не содержит детей; candidate note тоже принадлежит тому же документу, чтобы не спутать ошибку иерархии с другим владельцем.

  2. Добавление и вставка элемента запрещены для этих видов узлов. Замена/удаление также не находят существующего ребёнка: candidate не находится у листа.

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

  4. Нормализовать допустим как общий метод, но у листа нечего объединять. Значение и пустой список детей не меняются.

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

  1. Для каждого из четырёх видов выводится ожидаемых отказов 4.

  2. Для каждого вида три логические проверки дают Истина: нет детей, значение прежнее, candidate отсоединён.

  3. Всего 16 ожидаемых отказов. Ни один не подавляет неожиданное успешное изменение: оно вызовет контрольную ошибку.

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

Объяснено поведение общих методов на листовых узлах вместо фиктивного примера добавления невозможных детей.

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

  1. Этот пример намеренно демонстрирует ошибки на собственных данных; в рабочем алгоритме проверяйте вид узла заранее.

  2. Для описания с вложенными тегами создавайте ЭлементDOM-контейнер и помещайте в него текст/элементы. ТекстDOM сам контейнером не является.

  3. Не переносите правило на АтрибутDOM: его представление значения может включать текстовые дочерние узлы, это другой вид DOM-узла.

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

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

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

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

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