ЧтениеУзловDOM.ПервоеОбъявление

Методы · FirstDeclaration

Осуществляет переход к первому определению DTD. В случае, если текущий узел является ОпределениеТипаДокумента (DTD), текущий узел позиционируется на первое объявление DTD. Вызов метода ЧтениеУзловDOM.Прочитать прерывает процесс чтения DTD и позиционирует текущий узел на следующий после DTD.

Синтаксис

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

ЧтениеУзловDOM.ПервоеОбъявление (DOMNodeReader.FirstDeclaration)

ЧтениеУзловDOM (DOMNodeReader)

ПервоеОбъявление (FirstDeclaration)

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

Синтаксис:
ПервоеОбъявление()
Возвращаемое значение:
Тип: Булево.
Истина - позиционирование на объявление прошло удачно, Ложь - в противном случае.
Описание:

Осуществляет переход к первому определению DTD.
В случае, если текущий узел является ОпределениеТипаДокумента (DTD), текущий узел позиционируется на первое объявление DTD.
Вызов метода ЧтениеУзловDOM.Прочитать прерывает процесс чтения DTD и позиционирует текущий узел на следующий после DTD.

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

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

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

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

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

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

Свой XML-заказ: внутренние сущности, отдельный DOM-фрагмент и настоящий обход DTD

Собрать свой пакет 300 × 6 = 1800 через native-писатель, явно перенести фрагмент, перечитать фактические числа и отдельно перечислить настоящие объявления своего DTD. Только ограниченные данные в памяти.

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

Серверный неглобальный непривилегированный общий модуль своей новой файловой базы 8.5.1.1343; толстый управляемый клиент через серверную часть формы. Native-прогон не выполнен.

Подготовка

  1. Задача: собрать свой XML-пакет заказа в памяти. Цена 300 и количество 6 объявлены двумя короткими внутренними сущностями DTD; писатель создаёт ссылки на них. Сумма 1800 добавляется собственным фиксированным XML-фрагментом. После переноса фрагмента настоящий результат перечитывается и проверяется расчётом; отдельно перечисляются фактические объявления DTD.

  2. Вручную создайте НОВУЮ собственную пустую файловую базу, не копию УТ, КА2, УНФ или БП: C:\1c-labs\OwnDOMFragment85_82cbc678-1a9b-4392-ab56-677a43aaf57d\IB. Платформа 8.5.1.1343, Windows, русский встроенный язык, толстый управляемый клиент. Точная строка соединения: File="C:\1c-labs\OwnDOMFragment85_82cbc678-1a9b-4392-ab56-677a43aaf57d\IB";. Другая строка остановит пример.

  3. Свойства конфигурации: Имя = УчебныйDOMФрагмент85; Версия = 82cbc678-1a9b-4392-ab56-677a43aaf57d; ОсновнойРежимЗапуска = УправляемоеПриложение; РежимСовместимости = НеИспользовать. Путь и UUID-маркер — предохранители от ошибочного запуска, не доказательство владения и не полноценная авторизация. Новизну и принадлежность стенда обеспечьте вручную.

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

  5. Общие → Общие модули → УчебныйDOMФрагмент85 → Модуль: вставьте основной блок ЦЕЛИКОМ. Сервер = Да; Глобальный, ВызовСервера, КлиентОбычноеПриложение, КлиентУправляемоеПриложение, ВнешнееСоединение и Привилегированный = Нет; ПовторноеИспользованиеВозвращаемыхЗначений = НеИспользовать. Единственная экспортная функция не принимает XML пользователя. Вспомогательные процедуры/функции входят в тот же целый модуль и не экспортируются.

  6. Общие → Общие формы → ПроверкаDOMФрагмента85: управляемая форма. Создайте реквизит Протокол85 — Строка неограниченной длины; добавьте многострочное поле: ПутьКДанным = Протокол85, ТолькоПросмотр = Да. Создайте команду формы ПроверитьDOM85, Действие = ПроверитьDOM85, добавьте её кнопку. Вставьте полный нижний модуль формы. ПриОткрытии и ПриСозданииНаСервере не подключаются: проверка запускается только кнопкой.

  7. Общие → Общие команды → ОткрытьПроверкуDOM85: общая команда без типа параметра команды и без режима использования параметра. Вставьте полный отдельный модуль команды, включите команду в свой учебный раздел и разрешите своей роли. Настоящее событие ОбработкаКоманды открывает только свою форму, не запускает вычисления автоматически.

  8. Не заменяйте литералы XML пользовательским вводом, файлом, URL, запросом или ответом интеграции. Свой DTD содержит только две короткие внутренние сущности; нет SYSTEM, PUBLIC, NDATA, внешних, параметрических или рекурсивных сущностей. Не добавляйте схемы, резолверы или недокументированные флаги DOM. Raw-метод получает только фиксированный собственный элемент суммы.

  9. Вручную обновите только свою новую конфигурацию, проверьте компиляцию трёх модулей, запустите толстый управляемый клиент. Откройте свою общую команду и нажмите ПроверитьDOM85. При создании урока 1С и база не запускались: компиляция, сохранение DTD, материализация объявлений и раскрытие ссылок ещё не проверены. При несовпадении фактической формы данных — STOP, без ручной подмены результата.

Процедура ПроверитьСвойСтенд85()
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnDOMFragment85_82cbc678-1a9b-4392-ab56-677a43aaf57d\IB"";" Или Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Или Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Откройте только собственную новую файловую учебную базу 8.5.1.1343";
    КонецЕсли;
    Если Метаданные.ОбщиеМодули.Количество() <> 1
        Или Метаданные.ОбщиеФормы.Количество() <> 1
        Или Метаданные.ОбщиеКоманды.Количество() <> 1 Тогда
        ВызватьИсключение "В стенде нужны только один собственный модуль, одна форма и одна общая команда";
    КонецЕсли;
    Модуль = Метаданные.ОбщиеМодули.Найти("УчебныйDOMФрагмент85");
    Если Модуль = Неопределено
        Или Метаданные.ОбщиеФормы.Найти("ПроверкаDOMФрагмента85") = Неопределено
        Или Метаданные.ОбщиеКоманды.Найти("ОткрытьПроверкуDOM85") = Неопределено Тогда
        ВызватьИсключение "Подготовьте собственные объекты из инструкции";
    КонецЕсли;
    Если Не Модуль.Сервер Или Модуль.Глобальный Или Модуль.ВызовСервера
        Или Модуль.КлиентОбычноеПриложение Или Модуль.КлиентУправляемоеПриложение
        Или Модуль.ВнешнееСоединение Или Модуль.Привилегированный
        Или Модуль.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
        ВызватьИсключение "Общий модуль нужен серверный, неглобальный и непривилегированный, без повторного использования результатов";
    КонецЕсли;
КонецПроцедуры

Функция ПрочитатьСвойDOM85(СвойXML, Параметры)
    Если ТипЗнч(СвойXML) <> Тип("Строка") Или СтрДлина(СвойXML) > 8192
        Или ТипЗнч(Параметры) <> Тип("ПараметрыЧтенияXML") Тогда
        ВызватьИсключение "Нужны только собственная ограниченная XML-строка и реальные параметры чтения";
    КонецЕсли;
    Построитель = Новый ПостроительDOM;
    Конфигурация = Построитель.КонфигурацияDOM;
    Если ТипЗнч(Конфигурация) <> Тип("КонфигурацияПостроителяDOM") Тогда
        ВызватьИсключение "Не получена реальная конфигурация своего построителя";
    КонецЕсли;
    Возможно = Конфигурация.ВозможноУстановитьПараметр("disallow-doctype", Ложь);
    Если ТипЗнч(Возможно) <> Тип("Булево") Тогда
        ВызватьИсключение "Неожиданный тип результата проверки параметра";
    КонецЕсли;
    Если Не Возможно Тогда
        ВызватьИсключение "Подготовка не завершена: свой построитель не разрешил внутренний DTD";
    КонецЕсли;
    Конфигурация.УстановитьПараметр("disallow-doctype", Ложь);
    Читатель = Новый ЧтениеXML;
    Читатель.УстановитьСтроку(СвойXML, Параметры);
    Документ = Построитель.Прочитать(Читатель);
    Читатель.Закрыть();
    Возврат Документ;
КонецФункции

Функция ПроверитьСвойДокумент85(Документ)
    Если ТипЗнч(Документ) <> Тип("ДокументDOM") Тогда
        ВызватьИсключение "Построитель должен вернуть настоящий ДокументDOM";
    КонецЕсли;
    Корень = Документ.ЭлементДокумента;
    DTD = Документ.ОпределениеТипаДокумента;
    Если ТипЗнч(Корень) <> Тип("ЭлементDOM")
        Или ТипЗнч(DTD) <> Тип("ОпределениеТипаДокументаDOM") Тогда
        ВызватьИсключение "Подготовка не завершена: фактический DOM не сохранил свой корень и DTD";
    КонецЕсли;
    Если Корень.ИмяУзла <> "ownPacket85" Или DTD.Имя <> "ownPacket85"
        Или DTD.ПубличныйИдентификатор <> "" Или DTD.СистемныйИдентификатор <> "" Тогда
        ВызватьИсключение "Допустим только собственный корень и внутренний DTD без внешних идентификаторов";
    КонецЕсли;
    Сущности = DTD.Сущности;
    Если ТипЗнч(Сущности) <> Тип("КоллекцияСущностейDOM") Тогда
        ВызватьИсключение "Не получена настоящая коллекция сущностей своего DTD";
    КонецЕсли;
    Если Сущности.Количество() <> 2 Тогда
        ВызватьИсключение "Подготовка не завершена: нужны фактически сохранённые две собственные сущности";
    КонецЕсли;
    Для Каждого ИмяСущности Из СтрРазделить("ownPrice85,ownQty85", ",") Цикл
        Сущность = Сущности.ПолучитьИменованныйЭлемент(ИмяСущности);
        Если ТипЗнч(Сущность) <> Тип("СущностьDOM") Тогда
            ВызватьИсключение "Подготовка не завершена: собственная объявленная сущность не материализована";
        КонецЕсли;
        Если Сущность.ИмяУзла <> ИмяСущности
            Или Сущность.ПубличныйИдентификатор <> "" Или Сущность.СистемныйИдентификатор <> "" Тогда
            ВызватьИсключение "Нужна только соответствующая собственная внутренняя сущность";
        КонецЕсли;
    КонецЦикла;
    Возврат Корень;
КонецФункции

Процедура ПроверитьТриЭлемента85(Узел)
    Если ТипЗнч(Узел) <> Тип("ЭлементDOM") И ТипЗнч(Узел) <> Тип("ФрагментДокументаDOM") Тогда
        ВызватьИсключение "Нужен собственный реальный корень или фрагмент DOM";
    КонецЕсли;
    Узлы = Узел.ДочерниеУзлы;
    Если Узлы.Количество() <> 3 Тогда
        ВызватьИсключение "Подготовка не завершена: не получены три собственных элемента";
    КонецЕсли;
    Имена = СтрРазделить("ownPriceValue85,ownQtyValue85,ownSubtotal85", ",");
    Для Индекс = 0 По 2 Цикл
        Элемент = Узлы.Элемент(Индекс);
        Если ТипЗнч(Элемент) <> Тип("ЭлементDOM") Тогда
            ВызватьИсключение "Собственный фрагмент должен содержать реальные элементы, не сырой текст разметки";
        КонецЕсли;
        Если Элемент.ИмяУзла <> Имена[Индекс] Тогда
            ВызватьИсключение "Нарушен точный состав собственных элементов";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Функция ПолучитьОтчетDOM85() Экспорт
    ПроверитьСвойСтенд85();
    Параметры = Новый ПараметрыЧтенияXML("1.0", , , , , Ложь);
    СвойXML = "<!DOCTYPE ownPacket85 [<!ENTITY ownPrice85 ""300""><!ENTITY ownQty85 ""6"">]><ownPacket85/>";
    Документ = ПрочитатьСвойDOM85(СвойXML, Параметры);
    Корень = ПроверитьСвойДокумент85(Документ);
    Если Корень.ДочерниеУзлы.Количество() <> 0 Тогда
        ВызватьИсключение "Первоначальный собственный корень должен быть пустым";
    КонецЕсли;
    Писатель = Новый ЗаписьУзловDOM;
    Писатель.Открыть(Документ);
    Писатель.ЗаписатьНачалоЭлемента("ownPriceValue85");
    Писатель.ЗаписатьСсылкуНаСущность("ownPrice85");
    Писатель.ЗаписатьКонецЭлемента();
    Писатель.ЗаписатьНачалоЭлемента("ownQtyValue85");
    Писатель.ЗаписатьСсылкуНаСущность("ownQty85");
    Писатель.ЗаписатьКонецЭлемента();
    Писатель.ЗаписатьБезОбработки("<ownSubtotal85>1800</ownSubtotal85>");
    Фрагмент = Писатель.УзелDOM;
    Если ТипЗнч(Фрагмент) <> Тип("ФрагментДокументаDOM") Тогда
        ВызватьИсключение "Не получен настоящий фрагмент собственного писателя";
    КонецЕсли;
    Владелец = Фрагмент.ДокументВладелец;
    Если ТипЗнч(Владелец) <> Тип("ДокументDOM") Тогда
        ВызватьИсключение "У фрагмента должен быть настоящий документ-владелец";
    КонецЕсли;
    Если Не Владелец.УзелИдентичен(Документ) Тогда
        ВызватьИсключение "Фрагмент должен принадлежать тому же собственному документу";
    КонецЕсли;
    ПроверитьТриЭлемента85(Фрагмент);
    Писатель.Закрыть();
    Если Корень.ДочерниеУзлы.Количество() <> 0 Тогда
        ВызватьИсключение "Писатель не должен сам присоединять фрагмент к корню";
    КонецЕсли;
    Корень.ДобавитьДочерний(Фрагмент);
    ПроверитьТриЭлемента85(Корень);
    Если Фрагмент.ДочерниеУзлы.Количество() <> 0 Тогда
        ВызватьИсключение "Дочерние узлы должны перейти из фрагмента в собственный корень";
    КонецЕсли;
    ВыводXML = Новый ЗаписьXML;
    ВыводXML.УстановитьСтроку();
    Сериализатор = Новый ЗаписьDOM;
    Сериализатор.Записать(Документ, ВыводXML);
    РезультатXML = ВыводXML.Закрыть();
    Если ТипЗнч(РезультатXML) <> Тип("Строка") Тогда
        ВызватьИсключение "Получить XML нужно только как настоящую строку из памяти";
    КонецЕсли;
    Если РезультатXML = "" Или СтрДлина(РезультатXML) > 8192 Тогда
        ВызватьИсключение "Не получена собственная ограниченная результирующая строка XML";
    КонецЕсли;
    ПеречитанныйДокумент = ПрочитатьСвойDOM85(РезультатXML, Параметры);
    ПеречитанныйКорень = ПроверитьСвойДокумент85(ПеречитанныйДокумент);
    ПроверитьТриЭлемента85(ПеречитанныйКорень);
    ЦенаТекст = ПеречитанныйКорень.ДочерниеУзлы.Элемент(0).ТекстовоеСодержимое;
    КоличествоТекст = ПеречитанныйКорень.ДочерниеУзлы.Элемент(1).ТекстовоеСодержимое;
    СуммаТекст = ПеречитанныйКорень.ДочерниеУзлы.Элемент(2).ТекстовоеСодержимое;
    Если ТипЗнч(ЦенаТекст) <> Тип("Строка") Или ТипЗнч(КоличествоТекст) <> Тип("Строка")
        Или ТипЗнч(СуммаТекст) <> Тип("Строка") Тогда
        ВызватьИсключение "Перечитанные элементы должны дать реальные текстовые значения";
    КонецЕсли;
    Если ЦенаТекст <> "300" Или КоличествоТекст <> "6" Или СуммаТекст <> "1800" Тогда
        ВызватьИсключение "Подготовка не завершена: собственные ссылки на сущности или raw-элемент не дали ожидаемых декодированных значений. Подмены и повторов нет";
    КонецЕсли;
    Цена = Число(ЦенаТекст);
    Количество = Число(КоличествоТекст);
    Сумма = Число(СуммаТекст);
    Если Цена * Количество <> Сумма Тогда
        ВызватьИсключение "Реально перечитанные числа не прошли контроль расчёта";
    КонецЕсли;
    ЧтениеDTD = Новый ЧтениеУзловDOM;
    ЧтениеDTD.Открыть(ПеречитанныйДокумент);
    НайденDTD = Ложь;
    Пока ЧтениеDTD.Прочитать() Цикл
        Если ЧтениеDTD.ТипУзла = ТипУзлаXML.ОпределениеТипаДокумента Тогда
            НайденDTD = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    Если Не НайденDTD Или ЧтениеDTD.Имя <> "ownPacket85" Тогда
        ВызватьИсключение "Подготовка не завершена: перечитанный собственный DTD не найден реальным reader";
    КонецЕсли;
    Первое = ЧтениеDTD.ПервоеОбъявление();
    Если ТипЗнч(Первое) <> Тип("Булево") Тогда
        ВызватьИсключение "ПервоеОбъявление должно вернуть настоящее Булево";
    КонецЕсли;
    Если Не Первое Тогда
        ВызватьИсключение "Подготовка не завершена: настоящих объявлений своего DTD нет";
    КонецЕсли;
    ЕстьОбъявление = Первое;
    ЧислоОбъявлений = 0;
    Наблюдения = "";
    Пока ЕстьОбъявление Цикл
        Если ТипЗнч(ЧтениеDTD.ТипУзла) <> Тип("ТипУзлаXML")
            Или ЧтениеDTD.ТипУзла <> ТипУзлаXML.Сущность
            Или ТипЗнч(ЧтениеDTD.Имя) <> Тип("Строка") Или ТипЗнч(ЧтениеDTD.Значение) <> Тип("Строка") Тогда
            ВызватьИсключение "Подготовка не завершена: нужен фактический курсор объявления собственной сущности";
        КонецЕсли;
        ЧислоОбъявлений = ЧислоОбъявлений + 1;
        Если ЧислоОбъявлений > 2 Тогда
            ВызватьИсключение "Найдены лишние объявления: ожидается только собственный ограниченный DTD";
        КонецЕсли;
        Наблюдения = Наблюдения + "Объявление " + Строка(ЧислоОбъявлений)
            + ": тип = Сущность; фактическое Имя = [" + ЧтениеDTD.Имя
            + "]; фактическое Значение = [" + ЧтениеDTD.Значение + "]" + Символы.ПС;
        ЕстьОбъявление = ЧтениеDTD.СледующееОбъявление();
        Если ТипЗнч(ЕстьОбъявление) <> Тип("Булево") Тогда
            ВызватьИсключение "СледующееОбъявление должно вернуть настоящее Булево";
        КонецЕсли;
    КонецЦикла;
    ЧтениеDTD.Закрыть();
    Если ЧислоОбъявлений <> 2 Тогда
        ВызватьИсключение "Подготовка не завершена: реальный reader не перечислил два собственных объявления";
    КонецЕсли;
    Возврат "Проверка DOM завершена: реальные значения " + Строка(Цена) + " × " + Строка(Количество)
        + " = " + Строка(Сумма) + Символы.ПС
        + "Три элемента перенесены из отдельного фрагмента явным ДобавитьДочерний; фрагмент пуст." + Символы.ПС
        + "Коллекция DOM содержит две свои именованные СущностьDOM; reader перечислил "
        + Строка(ЧислоОбъявлений) + " объявления." + Символы.ПС + Наблюдения
        + "Имя/Значение курсора — наблюдения, не обещание имени и replacement text сущности. Числа взяты из перечитанных элементов." + Символы.ПС
        + "Результирующий собственный XML:" + Символы.ПС + РезультатXML;
КонецФункции
Полный модуль своей формы: кнопка, серверный маршрут и строковый протокол

Общие → Общие формы → ПроверкаDOMФрагмента85 → Модуль

Клиентская команда своей управляемой формы и &НаСервереБезКонтекста; через RPC только Строка отчёта

&НаКлиенте
Процедура ПроверитьDOM85(Команда)
    Протокол85 = "";
    Если ТипЗнч(Команда) <> Тип("КомандаФормы") Тогда
        ВызватьИсключение "Используйте настоящую кнопку своей учебной формы";
    КонецЕсли;
    Если Команда.Имя <> "ПроверитьDOM85" Тогда
        ВызватьИсключение "Нужна собственная команда ПроверитьDOM85";
    КонецЕсли;
    Попытка
        Отчет = ПолучитьОтчетНаСервере85();
        Если ТипЗнч(Отчет) <> Тип("Строка") Тогда
            ВызватьИсключение "Через RPC разрешён только строковый протокол, не DOM и не enum";
        КонецЕсли;
        Если Отчет = "" Или СтрДлина(Отчет) > 16384 Тогда
            ВызватьИсключение "Не получен полный ограниченный протокол";
        КонецЕсли;
        Протокол85 = Отчет;
    Исключение
        Протокол85 = "Проверка НЕ завершена. Успех не подтверждён. Проверьте собственную новую базу и фактическое сохранение DTD, сущностей, фрагмента и декодированных чисел. Отсутствие этих данных означает STOP, а не успешный пример. Файлы, сеть и база не изменяются; автоматического повтора нет.";
    КонецПопытки;
КонецПроцедуры

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

Общие → Общие команды → ОткрытьПроверкуDOM85 → Модуль

Настоящее клиентское событие своей общей команды в толстом управляемом приложении

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        Если ПараметрКоманды <> Неопределено
            Или ТипЗнч(ПараметрыВыполненияКоманды) <> Тип("ПараметрыВыполненияКоманды") Тогда
            ВызватьИсключение "Используйте свою общую команду без параметра";
        КонецЕсли;
        ОткрытьФорму("ОбщаяФорма.ПроверкаDOMФрагмента85");
    #Иначе
        ВызватьИсключение "Этот урок предназначен только для толстого управляемого клиента";
    #КонецЕсли
КонецПроцедуры

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

  1. Сервер сначала ограничивает запуск своим новым файловым стендом, точной платформой, именем и UUID-маркером версии, режимами и серверными свойствами модуля. Никакого чтения бизнес-данных, пользователей или изменения конфигурации при выполнении нет.

  2. В конструктор ПараметрыЧтенияXML явно передано Ложь в шестой позиции: ИгнорироватьТипДокумента. По умолчанию там Истина. Это readonly-параметры, поэтому нельзя присваивать свойство после создания. Остальные пропущенные параметры остаются документированными defaults, включая НетПроверки; DTD не выдаётся за схему проверки правильности.

  3. Своя конфигурация построителя получена из настоящего ПостроительDOM.КонфигурацияDOM. Проверяется ВозможноУстановитьПараметр, затем изменяется только документированный Boolean disallow-doctype у собственного memory-построителя. Новый построитель создаётся и при повторном чтении: его настройки не объявляются перенесёнными в документ.

  4. После настоящего Прочитать код проверяет фактические ДокументDOM, корень ownPacket85, внутренний DTD и ровно две СущностьDOM из реальной коллекции по именам ownPrice85/ownQty85. Отсутствие любого объекта означает незавершённую подготовку. Новый СущностьDOM и фиктивный объект вызывающего кода не используются.

  5. Писатель открыт с тем же собственным документом как владельцем создаваемых узлов. ЗаписатьСсылкуНаСущность вызывается дважды внутри разных собственных элементов; ЗаписатьБезОбработки добавляет только свой готовый элемент ownSubtotal85. Сумма проверяется как реальный третий элемент, не строка с угловыми скобками.

  6. УзелDOM писателя — ФрагментДокументаDOM, не полный документ. Он захватывается до Закрыть, проверяются настоящий владелец через УзелИдентичен и три собственных элемента. Исходный корень всё ещё пуст. Явный ДобавитьДочерний переносит содержимое фрагмента в свой корень; после этого фрагмент должен быть пуст, а корень содержать все три элемента.

  7. ЗаписьDOM сериализует именно полный собственный документ, включая фактически сохранённый DTD, в ЗаписьXML с УстановитьСтроку. XML берётся из настоящего Закрыть и ограничивается длиной. Новый реальный parse проверяет DTD, сущности и три элемента. Только реально полученные ТекстовоеСодержимое 300/6/1800 преобразуются в числа и проверяются: 300 × 6 = 1800. Пустые или нераскрытые ссылки не заменяются ожиданиями.

  8. Отдельный ЧтениеУзловDOM открывает фактический перечитанный документ. Прочитать используется только до собственного узла DTD. После успешного ПервоеОбъявление объявления обходятся исключительно СледующееОбъявление с реальными Булево. Внутри этого цикла нет Прочитать: он прервал бы обход DTD. Порядок сущностей не угадывается.

  9. Счётчик двух фактических курсоров типа Сущность и настоящие поля Имя/Значение выводятся в протокол как наблюдения. Пустые поля допустимы по native-описанию: они не объявляются именем или replacement text сущности. Именованные сущности доказаны отдельным lookup DOM, а декодированные числа — отдельным чтением элементов. Клиент получает только Строку отчёта; DOM и enum не передаются через RPC.

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

  1. Ожидаемый будущий положительный протокол: реальные значения 300 × 6 = 1800; из отдельного фрагмента перенесены три элемента, сам фрагмент пуст; фактическая коллекция DOM содержит две собственные именованные сущности; настоящий reader перечислил два объявления. Поля курсора показаны как получены, без требования порядка или replacement text.

  2. В результирующем собственном XML должны фактически сохраниться внутренний DTD, свой корень и три собственных элемента. Способ сериализации ссылки или текста не фиксируется: решающая проверка — реальные декодированные значения после свежего чтения. Это ожидаемый результат, не выполненный прогон.

  3. Неверные File, платформа, имя/маркер версии или свойства модуля останавливают выполнение. Нет materialized DTD/сущностей, невозможен параметр, raw-элемент оказался текстом, нет раскрытых чисел или native-объявлений — проверка НЕ завершена. Исключение или STOP не считается успешным примером любого из четырёх методов.

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

  5. Статические проверки проверяют реальные producers/consumers, arity/обязательные позиции, readonly, отдельные server/client contexts, полный исходный урок и два точных штампа, все BSL-блоки и негативные подмены. Они не доказывают компиляцию, DTD processing или native runtime: ручной запуск ещё требуется.

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

Ожидается протокол фактических 300 × 6 = 1800, переноса трёх элементов из отдельного фрагмента, двух своих DOM-сущностей и двух настоящих объявлений DTD. При отсутствии сохранения/материализации/раскрытия — STOP, не успешный пример; запуск в 1С не проверен.

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

  1. ПостроительDOM.Прочитать прямо сообщает: обработка схемы Document Type Definition (DTD) не выполняется; настройки DOM не переносятся в созданный документ. Разрешение doctype не гарантирует материализацию, сохранение или раскрытие сущностей во всех средах. Код требует фактического положительного пути и иначе останавливается.

  2. ЗаписатьБезОбработки не проверяет вставляемую разметку. Это не средство экранирования, не безопасный способ вставлять произвольный пользовательский текст и не аналог обычного ЗаписатьТекст. Здесь разрешён только собственный фиксированный корректный элемент; поведение Fast Infoset не относится к этому уроку.

  3. Фрагмент не присоединяется автоматически. Его документ-владелец должен совпасть с документом корня; узлы другого документа нельзя просто добавлять. Не создавайте второй корень, не удаляйте первый и не помещайте XML-объявление или DOCTYPE внутрь фрагмента. Эти две неоднозначные операции писателя не включены в учебный credit.

  4. ПервоеОбъявление нужно вызывать на текущем DTD. СледующееОбъявление до Первое имеет другое native-поведение; Прочитать внутри enumeration прерывает её. Нельзя заменить обход списком заранее известных имён или условием, которое никогда не допускает положительного native-пути.

  5. У reader Имя и Значение описаны не для всех разновидностей объявления. Пустое значение не доказывает пустую сущность, а текст курсора не объявляется её replacement text. Не переносите 300/6 из ожидаемых литералов в результат; они должны прийти из перечитанных реальных элементов.

  6. Урок работает только со своим ограниченным memory-XML. Не расширяйте его до чтения произвольных XML/DTD, файлов, URL или внешних сущностей: такой парсер требует отдельной политики безопасности и лимитов. Вспомогательная функция чтения не экспортируется и вызывается только двумя собственными строками.

  7. Неглобальный серверный модуль без ВызовСервера не вызывается клиентом напрямую. Маршрут — своя клиентская кнопка, &НаСервереБезКонтекста своей формы, собственный общий модуль и скалярный протокол. Переименованная копия рабочей базы с похожим UUID не становится новой собственной лабораторией.

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

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

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

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

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