Импортировать товар в другой DOM-документ без изменения оригинала

Учебные задачи

Узел связан с документом-владельцем. Глубокий импорт создаёт узел для другого документа; сравниваем содержимое и идентичность.

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

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

Подготовка

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

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


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

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

  1. Создаём товар в документе Источник и прикрепляем его к исходному корню.

  2. ИмпортироватьУзел с Истина копирует дочерние узлы в документ Приёмник, но ещё не прикрепляет результат к его корню.

  3. УзелРавен сравнивает содержимое, УзелИдентичен — является ли это тем же узлом. Равная копия не идентична оригиналу.

  4. Пользовательские данные DOM не переносятся импортом. После изменения текста копии исходный товар остаётся неизменным.

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

  1. Копия до вставки принадлежит Приёмнику и не имеет родителя.

  2. Содержимое до изменения равно, идентичность различна; после изменения содержимое уже не равно.

  3. Оригинал сохраняет Книга и прежнего родителя; source у копии отсутствует.

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

Товар перенесён в другой документ через независимую копию с явной проверкой владельца и данных.

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

  1. Нельзя просто добавить исходный узел другого документа как свой: используйте импорт.

  2. ТекстовоеСодержимое заменяет содержимое элемента, а не только визуальную подпись; вложенная структура при этом меняется.

  3. Пользовательские данные — не XML-атрибуты и не часть сериализованного контракта.

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

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

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

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

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