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

Методы · UpdateDOMElement

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

Синтаксис

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

ПереопределениеXS.ОбновитьЭлементDOM (XSRedefine.UpdateDOMElement)

ПереопределениеXS (XSRedefine)

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

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

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

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

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

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

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

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

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

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

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

Базовый Code допускает длину 1..8. Переопределение с тем же именем ограничивает его тремя символами и шаблоном A01.

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

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

Подготовка

  1. Каждый урок выполните отдельно в учебной базе. Две XSD включены строками: основная схема и её собственная часть.

  2. urn:guide:owned-xsd-part — условное расположение собственной части. РазрешеннаяСхема присваивается непосредственно, дополнительно передаётся собственный НаборСхемXML как разыменователь.

  3. В коде нет файлового чтения, http URL, DTD или загрузки внешней XSD. Не заменяйте URN рабочими URL и не используйте непроверенную внешнюю схему.

  4. Проверить проверяет схемы. Он не проверяет XML с фактической ценой или кодом; проверку экземпляра выполняйте отдельно.

Процедура ВыполнитьПример() Экспорт
    ОсновнаяXSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:directives"" targetNamespace=""urn:guide:directives""><xs:element name=""code"" type=""xs:string""/></xs:schema>";
    ЧастьXSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""urn:guide:directives""><xs:simpleType name=""Code""><xs:restriction base=""xs:string""><xs:minLength value=""1""/><xs:maxLength value=""8""/></xs:restriction></xs:simpleType></xs:schema>";
    Основная = ПрочитатьСвоюСхему(ОсновнаяXSD);
    Часть = ПрочитатьСвоюСхему(ЧастьXSD);
    Часть.РасположениеСхемы = "urn:guide:owned-xsd-part";
    Директива = Новый ПереопределениеXS;
    Директива.РасположениеСхемы = "urn:guide:owned-xsd-part";
    Директива.РазрешеннаяСхема = Часть;
    Если Основная.ПространствоИмен <> Часть.ПространствоИмен Тогда
        ВызватьИсключение "Для переопределения нужны одинаковые namespace";
    КонецЕсли;
    НовыйКод = Новый ОпределениеПростогоТипаXS;
    НовыйКод.Имя = "Code";
    НовыйКод.Вариант = ВариантПростогоТипаXS.Атомарная;
    НовыйКод.ИмяБазовогоТипа = Новый РасширенноеИмяXML("urn:guide:directives", "Code");
    Длина = Новый ФасетДлиныXS;
    Длина.Значение = 3;
    Образец = Новый ФасетОбразцаXS;
    Образец.Значение = "[A-Z][0-9]{2}";
    НовыйКод.Фасеты.Добавить(Длина);
    НовыйКод.Фасеты.Добавить(Образец);
    Директива.Содержимое.Добавить(НовыйКод);
    Сообщить(Директива.Содержимое.Количество() = 1);
    Сообщить(Директива.Содержит(НовыйКод));
    Аннотация = Новый АннотацияXS;
    Пояснение = Новый ДокументацияXS;
    Пояснение.Источник = "urn:guide:directive-note";
    Пояснение.Язык = "ru";
    Аннотация.Состав.Добавить(Пояснение);
    Директива.Аннотация = Аннотация;
    Основная.Содержимое.Вставить(0, Директива);
    Корень = Основная.ОбъявленияЭлементов.Получить("code", "urn:guide:directives");
    Если Корень = Неопределено Тогда
        ВызватьИсключение "Не найден собственный корень code";
    КонецЕсли;
    Корень.ИмяТипа = Новый РасширенноеИмяXML("urn:guide:directives", "Code");
    Директива.ОбновитьЭлементDOM();
    Основная.ОбновитьЭлементDOM();
    Разыменователь = Новый НаборСхемXML;
    Разыменователь.Добавить(Часть);
    Набор = Новый НаборСхемXML;
    Набор.Добавить(Основная);
    Если Не Набор.Проверить(Разыменователь) Тогда
        ВызватьИсключение "Собственные связанные XSD не прошли проверку";
    КонецЕсли;
    Сообщить(Основная.Директивы.Количество() = 1);
    Сообщить(Директива.Контейнер = Основная);
    Сообщить(Директива.КорневойКонтейнер = Основная);
    Сообщить(Директива.Схема = Основная);
    Сообщить(Директива.ТипКомпоненты = ТипКомпонентыXS.Переопределение);
    Сообщить(Директива.ЭлементDOM <> Неопределено);
    Сообщить(Директива.Содержит(Директива.Аннотация));
    Сообщить(Директива.Компоненты.Количество() > 0);
    Сообщить(Директива.РазрешеннаяСхема = Часть);
    Сообщить(Директива.РасположениеСхемы = "urn:guide:owned-xsd-part");
    Сообщить(Корень.ИмяТипа.URIПространстваИмен = "urn:guide:directives" И Корень.ИмяТипа.ЛокальноеИмя = "Code");
    ИсходныйТип = Часть.ОпределенияТипов.Получить("Code", "urn:guide:directives");
    Если ИсходныйТип = Неопределено Тогда
        ВызватьИсключение "Не найден тип в собственной части";
    КонецЕсли;
    Копия = Директива.КлонироватьКомпоненту(Истина);
    Если ТипЗнч(Копия) <> Тип("ПереопределениеXS") Или Копия.Аннотация = Неопределено Тогда
        ВызватьИсключение "Не скопирована директива с аннотацией";
    КонецЕсли;
    Если Копия.Аннотация.Состав.Количество() <> 1 Тогда
        ВызватьИсключение "В копии должна быть одна собственная документация";
    КонецЕсли;
    ПояснениеКопии = Копия.Аннотация.Состав.Получить(0);
    Если ТипЗнч(ПояснениеКопии) <> Тип("ДокументацияXS") Тогда
        ВызватьИсключение "В копии получен не тот компонент";
    КонецЕсли;
    ПояснениеКопии.Источник = "urn:guide:directive-note:copy";
    ПояснениеКопии.Язык = "en";
    Сообщить(Пояснение.Источник = "urn:guide:directive-note" И Пояснение.Язык = "ru");
    Сообщить(ПояснениеКопии.Источник = "urn:guide:directive-note:copy" И ПояснениеКопии.Язык = "en");
    Сообщить(Основная.Директивы.Количество() = 1);
КонецПроцедуры

Функция ПрочитатьСвоюСхему(ТекстXSD)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(ТекстXSD);
    Попытка
        ПостроительДерева = Новый ПостроительDOM;
        ДокументСхемы = ПостроительДерева.Прочитать(Чтение);
        Чтение.Закрыть();
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    ПостроительСхем = Новый ПостроительСхемXML;
    Результат = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Если Результат = Неопределено Тогда
        ВызватьИсключение "Не построена собственная схема";
    КонецЕсли;
    Возврат Результат;
КонецФункции

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

  1. Базовая собственная схема содержит Code с minLength=1 и maxLength=8, основная — корень code.

  2. ПереопределениеXS имеет изменяемое Содержимое, хотя само свойство коллекции только для чтения.

  3. Новое определение тоже называется Code. В xs:redefine ссылка restriction на то же имя обозначает прежнее определение из подключаемой схемы, а не произвольную циклическую ссылку.

  4. Два фасета сужают допустимые значения: длина 3 и шаблон заглавная буква плюс две цифры.

  5. Содержимое.Добавить присоединяет новый тип директиве, сама директива вставляется первой в основную схему.

  6. Проверить получает собственную базовую часть. Рекурсивная копия документации не присоединяется вторым redefine.

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

  1. Если проверки проходят, все шестнадцать сообщений Истина; Содержимое директивы содержит один новый тип.

  2. В отдельной проверке экземпляра A01 проходит; A1, A001 и a01 не проходят новый тип. В базовой части ограничения остаются 1..8.

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

Переопределён конкретный собственный тип, с сохранением базовой части и без внешнего источника.

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

  1. Переопределение требует правил стандарта XSD, это не простое добавление второго одноимённого типа.

  2. Нельзя ослаблять базовые ограничения произвольным фасетом.

  3. Не присваивайте новый список свойству Содержимое: изменяйте полученную коллекцию.

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

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

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

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

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