ОпределениеПростогоТипаXS.ОбновитьЭлементDOM

Методы · UpdateDOMElement

Производит синхронизацию свойств компонента и структуры элемента DOM.

Синтаксис

ОбновитьЭлементDOM()
Полное описание, параметры и ограничения

ОпределениеПростогоТипаXS.ОбновитьЭлементDOM (XSSimpleTypeDefinition.UpdateDOMElement)

ОпределениеПростогоТипаXS (XSSimpleTypeDefinition)

ОбновитьЭлементDOM (UpdateDOMElement)

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

Синтаксис:
ОбновитьЭлементDOM()
Описание:

Производит синхронизацию свойств компонента и структуры элемента DOM.

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

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

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

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

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

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

Создать ограничения собственного контракта: скидка, описание и статус

Из шести видов новых фасетов строим восемь действующих ограничений для трёх собственных типов XML Schema. Проверяем не только созданные объекты, но и 13 допустимых и недопустимых входных значений через собственную фабрику XDTO.

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

Полный серверный общий модуль УчебныеОграничения своей новой пустой конфигурации УчебныеФасеты85 и полный отдельный модуль формы. В1С не запускался.

Подготовка

  1. НОВАЯ пустая отдельная учебная база точно 8.5.1.1343. Имя конфигурации УчебныеФасеты85, совместимость Не использовать. Нет бизнес-объектов, расширений, подписок и фоновых заданий; чужие базы и XML не используются.

  2. Создайте общий модуль УчебныеОграничения: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте полный основной модуль. Создайте свою внешнюю обработку УчебныеФасеты85 с управляемой формой и командой/кнопкой Выполнить, действие Выполнить; отдельный полный модуль формы приведён ниже.

  3. Будущая ручная подготовка: сохранить конфигурацию, Конфигурация → Обновить конфигурацию базы данных (F7), открыть новый собственный клиент и свою обработку. Здесь F7, форма, BSL и XDTO не запускались.

  4. Исходная XML-строка содержит три собственных simpleType без фасетов, только xs:string и xs:decimal. Пространство имён urn:guide:owned-facets — идентификатор, не сетевой адрес. Нет import/include, чтения файлов, настоящей интеграции или изменения метаданных базы.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Схема = ПостроитьСвоюИсходнуюСхему();
    Скидка = ПолучитьСвоеОпределение(Схема, "Discount");
    Описание = ПолучитьСвоеОпределение(Схема, "Description");
    Статус = ПолучитьСвоеОпределение(Схема, "Status");
    МинимальнаяСкидка = Новый ФасетМинимальногоИсключающегоЗначенияXS;
    ПрисоединитьСвойФасет(Скидка, МинимальнаяСкидка, "ФасетМинимальногоИсключающегоЗначенияXS", 0, "0");
    МаксимальнаяСкидка = Новый ФасетМаксимальногоИсключающегоЗначенияXS;
    ПрисоединитьСвойФасет(Скидка, МаксимальнаяСкидка, "ФасетМаксимальногоИсключающегоЗначенияXS", 1, "1");
    МинимальнаяДлина = Новый ФасетМинимальнойДлиныXS;
    ПрисоединитьСвойФасет(Описание, МинимальнаяДлина, "ФасетМинимальнойДлиныXS", 3, "3");
    МаксимальнаяДлина = Новый ФасетМаксимальнойДлиныXS;
    ПрисоединитьСвойФасет(Описание, МаксимальнаяДлина, "ФасетМаксимальнойДлиныXS", 20, "20");
    Пробелы = Новый ФасетПробельныхСимволовXS;
    ПрисоединитьСвойФасет(Статус, Пробелы, "ФасетПробельныхСимволовXS", ОбработкаПробельныхСимволовXS.Сворачивать, "collapse");
    Для Каждого ИмяСтатуса Из СтрРазделить("draft,published,closed", ",") Цикл
        ДопустимыйСтатус = Новый ФасетПеречисленияXS;
        ПрисоединитьСвойФасет(Статус, ДопустимыйСтатус, "ФасетПеречисленияXS", ИмяСтатуса, ИмяСтатуса);
    КонецЦикла;
    Если Скидка.Фасеты.Количество() <> 2 Или Описание.Фасеты.Количество() <> 2 Или Статус.Фасеты.Количество() <> 4 Тогда
        ВызватьИсключение "Не совпало распределение восьми собственных фасетов";
    КонецЕсли;
    Скидка.ОбновитьЭлементDOM();
    Описание.ОбновитьЭлементDOM();
    Статус.ОбновитьЭлементDOM();
    Схема.ОбновитьЭлементDOM();
    Набор = Новый НаборСхемXML;
    Набор.Добавить(Схема);
    Если Не Набор.Проверить() Тогда
        ВызватьИсключение "Собственная схема должна быть корректна до проверки отдельных значений";
    КонецЕсли;
    Фабрика = Новый ФабрикаXDTO(Набор);
    Случаи = Новый Массив;
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Discount", "0", Ложь, Неопределено));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Discount", "0.25", Истина, 0.25));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Discount", "1", Ложь, Неопределено));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Discount", "-0.1", Ложь, Неопределено));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Description", "Аб", Ложь, Неопределено));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Description", "ABC", Истина, "ABC"));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Description", "12345678901234567890", Истина, "12345678901234567890"));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Description", "123456789012345678901", Ложь, Неопределено));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Status", "draft", Истина, "draft"));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Status", "  published  ", Истина, "published"));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Status", "closed", Истина, "closed"));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Status", "deleted", Ложь, Неопределено));
    Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Status", "PUBLISHED", Ложь, Неопределено));
    ПроверитьСвоиСлучаи(Фабрика, Случаи);
КонецПроцедуры

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Функция ПостроитьСвоюИсходнуюСхему()
    XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""urn:guide:owned-facets"">
|<xs:simpleType name=""Discount""><xs:restriction base=""xs:decimal""/></xs:simpleType>
|<xs:simpleType name=""Description""><xs:restriction base=""xs:string""/></xs:simpleType>
|<xs:simpleType name=""Status""><xs:restriction base=""xs:string""/></xs:simpleType>
|</xs:schema>";
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(XSD);
    Попытка
        Построитель = Новый ПостроительDOM;
        DOM = Построитель.Прочитать(Чтение);
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Чтение.Закрыть();
    ПостроительСхемы = Новый ПостроительСхемXML;
    Схема = ПостроительСхемы.СоздатьСхемуXML(DOM.ЭлементДокумента);
    Если ТипЗнч(Схема) <> Тип("СхемаXML") Или Схема.ПространствоИмен <> "urn:guide:owned-facets" Тогда
        ВызватьИсключение "Не построена своя исходная XML-схема";
    КонецЕсли;
    Возврат Схема;
КонецФункции

Функция ПолучитьСвоеОпределение(Схема, Имя)
    Определение = Схема.ОпределенияТипов.Получить(Имя, "urn:guide:owned-facets");
    Если ТипЗнч(Определение) <> Тип("ОпределениеПростогоТипаXS") Или Определение.Имя <> Имя Тогда
        ВызватьИсключение "Не найден свой исходный простой тип " + Имя;
    КонецЕсли;
    Если Определение.Фасеты.Количество() <> 0 Тогда
        ВызватьИсключение "В исходном собственном типе не должно быть уже заданных фасетов";
    КонецЕсли;
    Возврат Определение;
КонецФункции

Процедура ПрисоединитьСвойФасет(Определение, Фасет, ОжидаемыйТип, Значение, Лексическое)
    Если ТипЗнч(Фасет) <> Тип(ОжидаемыйТип) Тогда
        ВызватьИсключение "Не совпал конкретный тип нового собственного фасета";
    КонецЕсли;
    Определение.Фасеты.Добавить(Фасет);
    Фасет.Значение = Значение;
    Фасет.ЛексическоеЗначение = Лексическое;
    Если ТипЗнч(Фасет.Значение) <> ТипЗнч(Значение) Или Фасет.Значение <> Значение
        Или Фасет.ЛексическоеЗначение <> Лексическое Тогда
        ВызватьИсключение "Не совпали типизированное и лексическое значения своего фасета";
    КонецЕсли;
    Если Фасет.ОпределениеПростогоТипа.Имя <> Определение.Имя
        Или Фасет.Схема.ПространствоИмен <> "urn:guide:owned-facets" Тогда
        ВызватьИсключение "Фасет должен принадлежать только своему определению и своей схеме";
    КонецЕсли;
    Фасет.ОбновитьЭлементDOM();
КонецПроцедуры

Процедура ПроверитьСвоиСлучаи(Фабрика, Случаи)
    Если Случаи.Количество() <> 13 Тогда
        ВызватьИсключение "Ожидалось ровно 13 собственных граничных случаев";
    КонецЕсли;
    Для Каждого Случай Из Случаи Цикл
        ТипМодели = Фабрика.Тип("urn:guide:owned-facets", Случай.Имя);
        Если ТипЗнч(ТипМодели) <> Тип("ТипЗначенияXDTO") Тогда
            ВызватьИсключение "Не получен свой тип значения XDTO " + Случай.Имя;
        КонецЕсли;
        Допустимо = Ложь;
        ЗначениеМодели = Неопределено;
        Попытка
            ЗначениеМодели = Фабрика.Создать(ТипМодели, Случай.Вход);
            Допустимо = Истина;
        Исключение
            Сообщить(СтрШаблон("Отклонён собственный пример %1: %2", Случай.Имя, Случай.Вход));
        КонецПопытки;
        Если Допустимо <> Случай.Допустимо Тогда
            ВызватьИсключение СтрШаблон("Не совпало ограничение %1 для [%2]", Случай.Имя, Случай.Вход);
        КонецЕсли;
        Если Допустимо Тогда
            Если ТипЗнч(ЗначениеМодели) <> Тип("ЗначениеXDTO")
                Или ТипЗнч(ЗначениеМодели.Значение) <> ТипЗнч(Случай.Выход)
                Или ЗначениеМодели.Значение <> Случай.Выход Тогда
                ВызватьИсключение "Не совпало полное собственное нормализованное значение";
            КонецЕсли;
        КонецЕсли;
        Сообщить(СтрШаблон("%1 [%2]: допустимо=%3", Случай.Имя, Случай.Вход, Допустимо));
    КонецЦикла;
КонецПроцедуры
УчебныеФасеты85.Форма

Своя внешняя обработка УчебныеФасеты85 → управляемая Форма → Модуль

Полный отдельный модуль своей формы; не выполнялся.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Собственная схема и все 13 граничных случаев проверены");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныеОграничения.ВыполнитьПример();
КонецПроцедуры

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

  1. Прочитать собственную строку как DOM и построить СхемаXML. Сразу проверить тип схемы и её пространство имён; получить Discount, Description, Status по имени и тому же URI. У каждого исходного типа должен быть пустой список явных фасетов.

  2. Конструктор создаёт отдельный компонент, но сам по себе не ограничивает данные. ПрисоединитьСвойФасет добавляет его в список именно подготовленного типа, задаёт типизированное и лексическое значения, сверяет их и проверяет владельца. Readonly-свойства Фасеты, Схема и ОпределениеПростогоТипа не присваиваются.

  3. Для Discount создаём два исключающих ограничения 0 и 1. Условие 0 < скидка < 1 относится к доле: 0.25 означает 25 процентов, а не число25. Обе границы недопустимы.

  4. Для Description два компонента задают длины 3 и 20 включительно. Используем короткие простые строки без эмодзи и составных Unicode-символов, чтобы задача не подменялась подсчётом байтов или визуальных знаков.

  5. Для Status фасет пробелов получает настоящее значение enum ОбработкаПробельныхСимволовXS.Сворачивать, лексически collapse. Три отдельных новых ФасетПеречисленияXS задают draft, published, closed. Это перечисление XML-схемы, не менеджер Перечисления конфигурации.

  6. Проверяем распределение восьми фасетов: 2/2/4. Синхронизируем DOM каждого нового компонента, определений и схемы; проверяем набор схем ДО создания фабрики. Фабрика создаётся после добавления ограничений, а не до них.

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

  8. Для всех принятых входов проверяются полный нормализованный результат и его точный тип. Строка с крайними пробелами восстанавливается как published, а скидка0.25 — как число. Все 13 случаев должны совпасть с независимыми эталонами.

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

  1. Будущий результат: 6 входов приняты и 7 отклонены, без исключения о несовпадении. Discount: 0.25 принят; 0, 1, -0.1 отклонены. Description: длины3 и20 приняты, 2 и21 отклонены.

  2. Status: draft, closed и строка с крайними пробелами published приняты; deleted и PUBLISHED отклонены. Нормализованный результат published не содержит крайних пробелов.

  3. Будущий отрицательный контроль: только в вызове для МаксимальнаяДлина замените оба значения 20/"20" на19/"19", не меняя эталон случая с20 символами. Корректная схема будет построена, но положительный случай должен вызвать несовпадение. После опыта восстановите полный исходный модуль.

  4. runtimeVerifiedScenarios=0. Сигнатуры конструкторов, свойства и доступность проверены по установленной справке. Результаты XDTO приведены как ожидаемые: в1С не получены, обратные ссылки владельцев и синхронизация DOM не выполнялись. Пример не отправляет скидки, статусы или описания во внешние системы.

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

Шесть разных конструкторов участвуют в одном действующем учебном контракте, проверяемом на всех 13 граничных случаях, а не только в чтении свойств новых пустых объектов.

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

  1. Новый фасет вне определения типа — ещё не правило проверки. Не пропускайте добавление в Фасеты и не присваивайте readonly-обратные ссылки вручную.

  2. Значение и ЛексическоеЗначение имеют разные типы. У фасета пробелов значение — enum платформы, не строка collapse; у числовых границ в нашей xs:decimal-модели — число, а лексическая запись использует точку.

  3. Свернуть крайние и повторяющиеся XML-пробелы не означает изменить регистр: PUBLISHED не входит в перечисление. Для Description xs:string пробелы этим контрактом не удаляются.

  4. Любая ошибка создания значения будет зафиксирована как отказ, но прежде схема и конкретный тип обязаны пройти подготовительные проверки. Для реального внешнего ввода нужны отдельные диагностика ошибок, ограничения размера и защита XML-парсера; данный урок работает только с собственными постоянными строками.

  5. Схему после построения фабрики не меняем: не рассчитывайте на автоматическое обновление уже построенной модели XDTO. Для другой версии контракта нужен новый проверенный набор и новая фабрика.

  6. Это собственный учебный контракт, не схема Avito и не правила скидок выбранной конфигурации. Нет подтверждения запуска, прав доступа или поведения рабочей базы.

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

Обойти дерево компонентов собственной схемы и связать его с XML DOM

У схемы, типа, фасета, объявления и аннотации есть общие связи. Обходим конкретный контракт товара с защитой от циклов и показываем владельца компонента, не передаём неизвестную схему.

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

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

Подготовка

  1. Вставьте обе процедуры полностью на уровне серверного общего модуля. ВыполнитьПример создаёт XSD из собственной короткой строки.

  2. Не подменяйте XSD внешней схемой: ограничение 200 компонентов и глубины 20 рассчитано на этот учебный контракт.

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

Процедура ВыполнитьПример() Экспорт
    XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema""
    | xmlns:g=""urn:guide:product"" targetNamespace=""urn:guide:product""
    | elementFormDefault=""qualified"" version=""1.0"" xml:lang=""ru"">
    | <xs:annotation><xs:documentation>Учебный товар, не контракт внешнего API</xs:documentation></xs:annotation>
    | <xs:simpleType name=""Sku""><xs:restriction base=""xs:string"">
    |  <xs:length value=""4""/><xs:pattern value=""[A-Z][0-9]{3}""/>
    | </xs:restriction></xs:simpleType>
    | <xs:complexType name=""Product""><xs:sequence>
    |  <xs:element name=""name"" type=""xs:string""/>
    |  <xs:element name=""quantity"" type=""xs:nonNegativeInteger""/>
    |  <xs:element name=""note"" type=""xs:string"" minOccurs=""0""/>
    | </xs:sequence><xs:attribute name=""code"" type=""g:Sku"" use=""required""/>
    | </xs:complexType>
    | <xs:element name=""product"" type=""g:Product""/>
    |</xs:schema>";
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(XSD);
    Попытка
        ЧтениеДерева = Новый ПостроительDOM;
        ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
        Чтение.Закрыть();
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Построитель = Новый ПостроительСхемXML;
    Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Если Схема = Неопределено Тогда
        ВызватьИсключение "Не удалось построить учебную схему";
    КонецЕсли;
    Набор = Новый НаборСхемXML;
    Набор.Добавить(Схема);
    Если Не Набор.Проверить() Тогда
        ВызватьИсключение "Учебная XSD не прошла проверку";
    КонецЕсли;
    Просмотренные = Новый Массив;
    Виды = Новый Соответствие;
    ПоказатьКомпонентСхемы(Схема, 0, Просмотренные, Виды);
    Сообщить("Просмотрено компонентов: " + Строка(Просмотренные.Количество()));
    Для Каждого Вид Из Виды Цикл
        Сообщить(Вид.Ключ + ": " + Строка(Вид.Значение));
    КонецЦикла;
    Сообщить(Просмотренные.Количество() > 10);
КонецПроцедуры

Процедура ПоказатьКомпонентСхемы(Компонент, Глубина, Просмотренные, Виды)
    Если Глубина > 20 Или Просмотренные.Количество() >= 200 Тогда
        ВызватьИсключение "Превышен размер собственного учебного дерева схемы";
    КонецЕсли;
    Если Просмотренные.Найти(Компонент) <> Неопределено Тогда
        Возврат;
    КонецЕсли;
    Просмотренные.Добавить(Компонент);
    ИмяВида = Строка(ТипЗнч(Компонент));
    КоличествоВида = Виды.Получить(ИмяВида);
    Если КоличествоВида = Неопределено Тогда
        КоличествоВида = 0;
    КонецЕсли;
    Виды.Вставить(ИмяВида, КоличествоВида + 1);
    Сообщить(СтрШаблон("Глубина %1: %2; тип компоненты %3", Глубина, ИмяВида, Компонент.ТипКомпоненты));
    Если Компонент.Контейнер <> Неопределено Тогда
        Сообщить("Контейнер: " + Строка(ТипЗнч(Компонент.Контейнер)));
    КонецЕсли;
    Если Компонент.КорневойКонтейнер <> Неопределено Тогда
        Сообщить("Корневой контейнер: " + Строка(ТипЗнч(Компонент.КорневойКонтейнер)));
    КонецЕсли;
    Если Компонент.Схема <> Неопределено Тогда
        Сообщить("Схема: " + Компонент.Схема.ПространствоИмен);
    КонецЕсли;
    Если Компонент.Аннотация <> Неопределено Тогда
        Сообщить("Есть отдельная аннотация компонента");
    КонецЕсли;
    // Синхронизируем только своё дерево в памяти, не конфигурацию и не файл.
    Компонент.ОбновитьЭлементDOM();
    Если Компонент.ЭлементDOM <> Неопределено Тогда
        Сообщить("Тег DOM: " + Компонент.ЭлементDOM.ИмяЭлемента);
    КонецЕсли;
    Дочерние = Компонент.Компоненты;
    Для Каждого Дочерний Из Дочерние Цикл
        ПоказатьКомпонентСхемы(Дочерний, Глубина + 1, Просмотренные, Виды);
    КонецЦикла;
КонецПроцедуры

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

  1. Построитель создаёт конкретное дерево компонентов из нашей XSD. Начальная точка обхода — сама СхемаXML.

  2. Компоненты возвращает только компоненты, которыми владеет текущий компонент. Цикл рекурсивно проходит структуру типов, объявлений и ограничений.

  3. Контейнер и КорневойКонтейнер описывают связи владения. Схема связывает компонент с описанием пространства имён, а Аннотация с пояснением.

  4. Массив Просмотренные предотвращает повторный обход одной ссылки; два ограничителя защищают учебный обработчик от неожиданно большой структуры.

  5. ОбновитьЭлементDOM синхронизирует описание компонента с его XML DOM. ЭлементDOM после синхронизации показывает соответствующий тег.

  6. Итоговая карта Виды показывает реальные классы дерева, а не число товаров. Все изменения происходят только в собственной схеме в памяти.

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

  1. Появляются компоненты схемы, типов Sku/Product, объявлений, фасетов length/pattern и аннотации с документацией.

  2. Теги DOM соответствуют видам: schema, simpleType, complexType, length, pattern, element и другие части данного контракта.

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

  4. Модули конфигурации, справочники и файлы после обхода не изменяются.

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

Построена читаемая карта структуры собственной схемы с её владельцами и DOM-представлением.

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

  1. Компоненты схемы и ДочерниеУзлы XML DOM — разные коллекции с разной моделью владения.

  2. Нельзя переносить этот обход на произвольные внешние схемы без отдельной проверки размера и импортов.

  3. ОбновитьЭлементDOM синхронизирует представление, но не выполняет публикацию, обновление конфигурации или запись товара.

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

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

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

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

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