ЭлементDOM.КлонироватьУзел

Методы · CloneNode

Копирует (клонирует) данный узел. Для копии не определены родительский узел и пользовательские данные. Копирование узла Элемент копирует все атрибуты и их значения, включая сгенерированные XML процессором значения по умолчанию. Копирование дочерних узлов производится только в случае установленного признака "глубокого" копирования. "Глубокое" копирование включает текст, содержащийся в узле Элемент, если текст содержится как дочерний узел Текст. Копирование узлов Атрибут отличается от копирования их как части узла Элемент тем, что признак явного указания свойства Указан будет установлен в значение Истина. Копирование узлов Атрибут всегда выполняется с копированием дочерних узлов (представляющих значение атрибута), вне зависимости от режима копирования. Копирование узла СсылкаНаСущность автоматически конструирует поддерево, если соответствующий узел Сущность доступен, вне зависимости от режима копирования. Копирование других типов узлов просто возвращает копию данного узла. В случае копирования поддерева в режиме Только для чтения создает редактируемую копию, но дочерние узлы копии узла СсылкаНаСущность останутся в режиме Только для чтения.

Синтаксис

КлонироватьУзел(<ГлубокоеКопирование>)
Полное описание, параметры и ограничения

ЭлементDOM.КлонироватьУзел (DOMElement.CloneNode)

ЭлементDOM (DOMElement)

КлонироватьУзел (CloneNode)

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

Синтаксис:
КлонироватьУзел(<ГлубокоеКопирование>)
Параметры:

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

Копирует (клонирует) данный узел.
Для копии не определены родительский узел и пользовательские данные.
Копирование узла Элемент копирует все атрибуты и их значения, включая сгенерированные XML процессором значения по умолчанию.
Копирование дочерних узлов производится только в случае установленного признака "глубокого" копирования. "Глубокое" копирование включает текст, содержащийся в узле Элемент, если текст содержится как дочерний узел Текст.
Копирование узлов Атрибут отличается от копирования их как части узла Элемент тем, что признак явного указания свойства Указан будет установлен в значение Истина. Копирование узлов Атрибут всегда выполняется с копированием дочерних узлов (представляющих значение атрибута), вне зависимости от режима копирования.
Копирование узла СсылкаНаСущность автоматически конструирует поддерево, если соответствующий узел Сущность доступен, вне зависимости от режима копирования.
Копирование других типов узлов просто возвращает копию данного узла.
В случае копирования поддерева в режиме Только для чтения создает редактируемую копию, но дочерние узлы копии узла СсылкаНаСущность останутся в режиме Только для чтения.

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

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

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

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

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

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

Вставить, заменить и удалить товар в DOM

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

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

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

Подготовка

  1. Выполняйте на сервере. Текст названия записывается непосредственно в product для компактности учебного документа.

  2. Вставляемые и заменяемые узлы созданы одним документом; перенос между документами требует ИмпортироватьУзел.

Документ = Новый ДокументDOM("", "products");
Корень = Документ.ЭлементДокумента;
Первый = Документ.СоздатьЭлемент("product");
Первый.УстановитьАтрибут("code", "A-01");
Первый.ТекстовоеСодержимое = "Книга";
Корень.ДобавитьДочерний(Первый);
Последний = Документ.СоздатьЭлемент("product");
Последний.ТекстовоеСодержимое = "Ручка";
Корень.ДобавитьДочерний(Последний);
Вставленный = Документ.СоздатьЭлемент("product");
Вставленный.ТекстовоеСодержимое = "Тетрадь";
Корень.ВставитьПеред(Вставленный, Последний);
Копия = Первый.КлонироватьУзел(Истина);
Сообщить(Первый.УзелРавен(Копия));
Сообщить(Первый.УзелИдентичен(Копия));
Копия.ТекстовоеСодержимое = "Новая книга";
Удалённый = Корень.ЗаменитьДочерний(Копия, Первый);
Сообщить(Удалённый.РодительскийУзел = Неопределено);
Корень.УдалитьДочерний(Последний);
Вставленный.УстановитьПользовательскиеДанные("Проверено", Истина);
Сообщить(Вставленный.ПолучитьПользовательскиеДанные("Проверено"));
Сообщить(Корень.ПервыйДочерний.ТекстовоеСодержимое);
Сообщить(Корень.ПоследнийДочерний.ТекстовоеСодержимое);
Сообщить(Копия.СледующийСоседний.УзелИдентичен(Вставленный));
Сообщить(Вставленный.ПредыдущийСоседний.УзелИдентичен(Копия));
Сообщить(Вставленный.ДокументВладелец = Документ);
Узлы = Корень.ДочерниеУзлы;
Сообщить(Узлы.Количество());
Для Номер = 0 По Узлы.Количество() - 1 Цикл
    Узел = Узлы.Элемент(Номер);
    Сообщить(Узел.ИмяУзла + ": " + Узел.ТекстовоеСодержимое);
КонецЦикла;

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

  1. Добавляем книгу и ручку, вставляем тетрадь перед ручкой.

  2. Глубокая копия книги имеет одинаковое содержимое, но является другим узлом.

  3. ЗаменитьДочерний возвращает удалённый старый узел; затем отдельно удаляем ручку.

  4. Проверяем связи соседей и обходим оставшийся СписокУзловDOM по индексам.

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

  1. Перед изменением копии УзелРавен даёт Истина, УзелИдентичен — Ложь.

  2. После изменений остаются 2 узла: Новая книга, Тетрадь; у удалённой книги нет родителя.

  3. Проверки соседей, владельца и пользовательской пометки дают Истина.

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

Дерево изменено осмысленно, различие между равенством содержимого и идентичностью узла показано явно.

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

  1. Список дочерних узлов отражает изменения дерева: при удалении во время обхода индексы смещаются.

  2. УстановитьПользовательскиеДанные не создаёт атрибут и не является способом сохранить пометку в XML-файле.

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

Отличить неглубокую копию элемента от полной копии и служебных данных

Клонируем реальный элемент товара и его текст/комментарий/CDATA/инструкцию/атрибут/фрагмент. Копия равна по содержимому, но не идентична и не наследует локальную метку.

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

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

Подготовка

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

  2. Метки source-row и training-tag — локальные учебные значения, не атрибуты XML и не номера строк источника конфигурации.

Документ = Новый ДокументDOM("urn:guide:nodes", "g:guide");
Корень = Документ.ЭлементДокумента;
Корень.УстановитьСоответствиеПространстваИмен("g", "urn:guide:nodes");
Атрибут = Документ.СоздатьАтрибут("code");
Атрибут.Значение = "A-01";
Корень.УстановитьУзелАтрибута(Атрибут);
Текст = Документ.СоздатьТекстовыйУзел("Книга");
Комментарий = Документ.СоздатьКомментарий("учебный комментарий");
CDATA = Документ.СоздатьСекциюCDATA("<данные>");
Инструкция = Документ.СоздатьИнструкциюОбработки("guide", "mode=test");
Корень.ДобавитьДочерний(Текст);
Корень.ДобавитьДочерний(Комментарий);
Корень.ДобавитьДочерний(CDATA);
Корень.ДобавитьДочерний(Инструкция);
Фрагмент = Документ.СоздатьФрагментДокумента();
Фрагмент.ДобавитьДочерний(Документ.СоздатьЭлемент("note"));
Узлы = Новый Массив;
Узлы.Добавить(Документ);
Узлы.Добавить(Корень);
Узлы.Добавить(Атрибут);
Узлы.Добавить(Текст);
Узлы.Добавить(Комментарий);
Узлы.Добавить(CDATA);
Узлы.Добавить(Инструкция);
Узлы.Добавить(Фрагмент);

Корень.УстановитьПользовательскиеДанные("source-row", 7);
НеглубокаяКопия = Корень.КлонироватьУзел(Ложь);
ПолнаяКопия = Корень.КлонироватьУзел(Истина);
Сообщить(НеглубокаяКопия.ДочерниеУзлы.Количество() = 0);
Сообщить(НеглубокаяКопия.ЕстьАтрибут("code"));
Сообщить(ПолнаяКопия.ДочерниеУзлы.Количество() = 4);
Сообщить(ПолнаяКопия.УзелРавен(Корень));
Сообщить(Не ПолнаяКопия.УзелИдентичен(Корень));
Сообщить(ПолнаяКопия.РодительскийУзел = Неопределено);
Сообщить(Корень.ПолучитьПользовательскиеДанные("source-row") = 7);
Сообщить(ПолнаяКопия.ПолучитьПользовательскиеДанные("source-row") = Неопределено);
// Документ не клонируем: остальные семь видов созданы именно в нём.
Узлы.Удалить(0);
Для Каждого Узел Из Узлы Цикл
    Узел.УстановитьПользовательскиеДанные("training-tag", "обработано");
    Копия = Узел.КлонироватьУзел(Истина);
    Сообщить(Узел.ПолучитьПользовательскиеДанные("training-tag") = "обработано");
    Сообщить(Копия.ПолучитьПользовательскиеДанные("training-tag") = Неопределено);
    Сообщить(Копия.УзелРавен(Узел));
    Сообщить(Не Копия.УзелИдентичен(Узел));
КонецЦикла;

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

  1. У элемента неглубокое клонирование сохраняет атрибуты, но не копирует детей. Полное копирует всё поддерево.

  2. УзелРавен сравнивает содержимое по правилам DOM; УзелИдентичен проверяет один и тот же узел.

  3. Копия отсоединена от родителя. Пользовательские данные не переносятся и не участвуют в равенстве.

  4. Отдельно клонируем семь конкретных видов: элемент, атрибут, текст, комментарий, CDATA, инструкцию и фрагмент. Документ из этого цикла исключён.

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

  1. Неглубокий элемент: 0 детей и сохранён code. Полный элемент: 4 ребёнка.

  2. Полная копия равна, не идентична исходному корню и не имеет родителя.

  3. Для всех семи отдельных видов копия не получает training-tag, хотя исходник её имеет.

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

Показаны реальные различия структуры копии, идентичности узла и служебных локальных меток.

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

  1. Клонирование не переносит узел в другой документ: для этого используйте ИмпортироватьУзел.

  2. Изменение копии не следует интерпретировать как изменение исходного элемента.

  3. Служебные данные DOM не сериализуются как XML-атрибуты; если нужен атрибут обмена, задайте его явно.

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

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

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

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

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