Собрать товары во фрагмент и перенести его детей в корень

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

ФрагментДокументаDOM позволяет подготовить группу узлов. При добавлении фрагмента в дерево перемещаются его дети, а сам фрагмент не становится XML-тегом.

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

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

Подготовка

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

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


Документ = Новый ДокументDOM("", "products");
Корень = Документ.ЭлементДокумента;
Фрагмент = Документ.СоздатьФрагментДокумента();
Для Номер = 1 По 2 Цикл
    Товар = Документ.СоздатьЭлемент("product");
    Товар.УстановитьАтрибут("code", ?(Номер = 1, "A-01", "B-02"));
    Товар.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел(?(Номер = 1, "Книга", "Ручка")));
    Фрагмент.ДобавитьДочерний(Товар);
КонецЦикла;
Сообщить(Фрагмент.ДокументВладелец = Документ);
Сообщить(Фрагмент.РодительскийУзел = Неопределено);
Сообщить(Фрагмент.ЕстьДочерниеУзлы());
Сообщить(Фрагмент.ДочерниеУзлы.Количество() = 2);
ПервыйТовар = Фрагмент.ПервыйДочерний;
ПоследнийТовар = Фрагмент.ПоследнийДочерний;
Сообщить(ПервыйТовар <> ПоследнийТовар);
Корень.ДобавитьДочерний(Фрагмент);
Сообщить(Фрагмент.ДочерниеУзлы.Количество() = 0);
Сообщить(Не Фрагмент.ЕстьДочерниеУзлы());
Сообщить(Корень.ДочерниеУзлы.Количество() = 2);
Сообщить(ПервыйТовар.РодительскийУзел = Корень);
Сообщить(Корень.ПервыйДочерний = ПервыйТовар);

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

  1. Фабрика документа создаёт фрагмент того же документа; перенос между разными документами требует другого API.

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

  3. ДобавитьДочерний с фрагментом переносит его дочерние узлы в корень. После этого фрагмент пустой.

  4. Родитель первого товара теперь products; идентичность самого узла сохраняется.

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

  1. До переноса у фрагмента 2 ребёнка, после — 0; у корня после переноса 2 ребёнка.

  2. ПервыйТовар.РодительскийУзел равен Корень; последний контроль также Истина.

  3. Повторное добавление уже пустого фрагмента не создаёт ещё два товара.

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

Группа подготовленных узлов перемещена в документ без выдуманного тега fragment.

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

  1. Фрагмент не является независимым документом с собственным корневым тегом.

  2. Это перемещение, не копирование: исходный фрагмент лишается своих детей.

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

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

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

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

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