ОпределениеТипаДокументаDOM.Сущности

Свойства · Entities

Тип: КоллекцияСущностейDOM. Содержит коллекцию нотаций определения типа документа.

Полное описание, параметры и ограничения

ОпределениеТипаДокументаDOM.Сущности (DOMDocumentType.Entities)

ОпределениеТипаДокументаDOM (DOMDocumentType)

Сущности (Entities)

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

Использование:
Только чтение.
Описание:
Тип: КоллекцияСущностейDOM.
Содержит коллекцию нотаций определения типа документа.
Доступность:

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

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

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

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

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

Создать документ с собственным описанием типа без внешнего DTD

Полный конструктор ДокументDOM принимает ОпределениеТипаДокументаDOM. Пустое описание с именем products не является схемой проверки товаров и ничего не скачивает.

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

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

Подготовка

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

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

  3. Описание типа создаётся только из собственного имени и двух пустых идентификаторов. Внешний DTD/URL/файл и внутренние объявления не задаются.

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

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

  1. Создаём ОпределениеТипаДокументаDOM с именем products и пустыми PUBLIC/SYSTEM. В отличие от чтения внешнего DTD это только собственный объект в памяти.

  2. Полный конструктор документа принимает описание третьим аргументом. Два дочерних узла документа — описание типа и корень products.

  3. Коллекции Сущности и Нотации пустые: никаких объявлений в подготовке не было.

  4. Добавляем product без обязательного описания полей. Отсутствие исключения не доказывает валидность товара по DTD: здесь нет определений и проверок схемы.

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

  1. Все десять логических сообщений дают Истина.

  2. У документа есть описание типа products и корень products; в корне один учебный товар A-01.

  3. Добавление товара не заполняет Сущности/Нотации и не загружает внешнюю схему.

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

Разобраны полный конструктор документа и отличие объекта DOCTYPE от фактической валидации XML.

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

  1. ОпределениеТипаДокументаDOM не заменяет НаборСхемXML и не создаёт XSD автоматически.

  2. Не подставляйте недоверенные системные/публичные идентификаторы и не превращайте этот пример в загрузку внешних DTD.

  3. Сущности и нотации — объявления типа документа, не товарные строки и не XML-элементы product.

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

Клонировать объявление и отделить равенство от идентичности

Своя служебная пометка связана с узлом, не с XML-текстом. Копия похожа по структуре, но не является тем же объектом и не наследует пользовательские данные.

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

Полный серверный общий модуль своей учебной базы. Внутренний DTD только известной собственной строки, не вход произвольного API.

Подготовка

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

  2. XML содержит только собственный внутренний DTD. Внешнего подмножества DOCTYPE нет, SYSTEM/PUBLIC в двух объявлениях — учебные URN, не пути и не HTTP-адреса.

  3. guideIcon — неразбираемая сущность NDATA; она объявлена, но не используется как &guideIcon; в тексте. Её ресурс не загружается. Нотация описывает формат, не изображение.

  4. Параметры и построитель создаются заново для этой известной строки. Никогда не переносите разрешение DTD на произвольный XML из интернета или API.

  5. Вызовите УчебныеЗадачи.ВыполнитьПример() из серверной учебной команды. Нет записи базы, файлов или сетевых соединений; поведение DOM 1С ещё требует контрольного запуска в учебной базе.

Процедура ВыполнитьПример() Экспорт
    Параметры = Новый ПараметрыЧтенияXML(, , , , , Ложь);
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку("<?xml version=""1.0""?>
    |<!DOCTYPE products [
    |<!NOTATION guideMark PUBLIC ""guide-marker"" ""urn:guide:marker-format"">
    |<!ENTITY guideIcon SYSTEM ""urn:guide:marker-payload"" NDATA guideMark>
    |]>
    |<products xmlns:g=""urn:guide:dtd""><product>Книга</product></products>", Параметры);
    Построитель = Новый ПостроительDOM;
    Настройки = Построитель.КонфигурацияDOM;
    Если НЕ Настройки.ВозможноУстановитьПараметр("disallow-doctype", Ложь) Тогда
        Чтение.Закрыть();
        ВызватьИсключение "Построитель не разрешает собственный внутренний DTD";
    КонецЕсли;
    Настройки.УстановитьПараметр("disallow-doctype", Ложь);
    Попытка
        Документ = Построитель.Прочитать(Чтение);
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Чтение.Закрыть();
    ОписаниеТипа = Документ.ОпределениеТипаДокумента;
    Если ОписаниеТипа = Неопределено Тогда
        ВызватьИсключение "Включите чтение типа документа, не подменяйте его пустым новым DOCTYPE";
    КонецЕсли;
    Сущность = ОписаниеТипа.Сущности.ПолучитьИменованныйЭлемент("guideIcon");
    Нотация = ОписаниеТипа.Нотации.ПолучитьИменованныйЭлемент("guideMark");
    Если ТипЗнч(Сущность) <> Тип("СущностьDOM") ИЛИ ТипЗнч(Нотация) <> Тип("НотацияDOM") Тогда
        ВызватьИсключение "Построитель не сохранил ожидаемые собственные объявления DTD";
    КонецЕсли;
    Узлы = Новый Массив;
    Узлы.Добавить(Сущность);
    Узлы.Добавить(Нотация);
    Для Каждого Узел Из Узлы Цикл
        Прежнее = Узел.УстановитьПользовательскиеДанные("guide-task", "Учебная проверка");
        Сообщить(Прежнее = Неопределено);
        Сообщить(Узел.ПолучитьПользовательскиеДанные("guide-task") = "Учебная проверка");
        Копия = Узел.КлонироватьУзел(Истина);
        Сообщить(Узел.УзелИдентичен(Узел));
        Сообщить(НЕ Узел.УзелИдентичен(Копия));
        Сообщить(Узел.УзелРавен(Копия));
        Сообщить(Копия.ПолучитьПользовательскиеДанные("guide-task") = Неопределено);
        Сообщить(Копия.РодительскийУзел = Неопределено);
        Положение = Узел.СравнитьПозициюВДокументе(Копия);
        Сообщить("Положение отдельной копии: " + Строка(Положение));
        Копия.Нормализовать();
        Сообщить(Копия.ДочерниеУзлы.Количество() = 0);
        Снятое = Узел.УстановитьПользовательскиеДанные("guide-task", Неопределено);
        Сообщить(Снятое = "Учебная проверка");
        Сообщить(Узел.ПолучитьПользовательскиеДанные("guide-task") = Неопределено);
    КонецЦикла;
КонецПроцедуры

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

  1. УстановитьПользовательскиеДанные возвращает прежнее значение. Первый вызов связывает свою пометку с реально полученным узлом.

  2. КлонироватьУзел(Истина) создаёт отдельный узел. По локальной справке у копии не определены родитель и пользовательские данные.

  3. УзелИдентичен сравнивает идентичность, УзелРавен структуру. Оба сравнения проверяются и не подменяют друг друга.

  4. СравнитьПозициюВДокументе только диагностируется: отдельная копия не имеет гарантированного порядка до/после в дереве.

  5. Нормализовать у листа не создаёт детей или загружает содержимое SYSTEM. В конце собственная пометка снимается передачей Неопределено, прежняя строка проверяется.

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

  1. По десять Истина для каждого узла и диагностическое положение копии.

  2. Копии не помещаются в корень или коллекции DTD, исходные объявления не удаляются.

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

Различие структуры, идентичности и служебных данных показано на настоящем объявлении.

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

  1. Пользовательская пометка — не атрибут XML и не постоянная запись.

  2. Положение отдельной копии не используйте как индекс коллекции объявлений.

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

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

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

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

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