КомментарийHTML.Данные

Свойства · Data

Тип: Строка. Содержит данные узла.

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

КомментарийHTML.Данные (HTMLComment.Data)

КомментарийHTML (HTMLComment)

Данные (Data)

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

Использование:
Чтение и запись.
Описание:
Тип: Строка.
Содержит данные узла.
Доступность:

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

Примечание:
При установке значения свойства может возникнуть исключение в случае, если данный узел в режиме Только для чтения.
Использование в версии:

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

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

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

Изменить настоящий HTML-комментарий и проверить все 14 символов

Настоящий КомментарийHTML из своей строки проходит вставку, чтение фрагмента, замену, удаление и добавление данных. Проверяем B-02 проверено, размер 14 и неизменный видимый текст.

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

Сервер; полный неглобальный непривилегированный общий модуль HTMLПометка85. Только собственная строка и память.

Подготовка

  1. Будущий ручной опыт выполняйте в своей новой пустой учебной конфигурации на платформе 8.5.1.1343, в толстом управляемом клиенте. Здесь создаётся только собственное дерево из фиксированной строки в памяти; файлы, Интернет и объекты рабочей базы не используются.

  2. Общие → Общие модули → создать HTMLПометка85. Сервер=Да; Глобальный=Нет; Привилегированный=Нет; Вызов сервера=Нет; оба клиентских флага=Нет; Внешнее соединение=Нет; повторное использование возвращаемых значений — Не использовать. Основной блок вставьте целиком в пустой модуль.

  3. Общие → Общие формы → создать управляемую форму HTMLПометка85. Добавьте реквизит Результат85: Строка неограниченной длины; выведите многострочным полем только для чтения. Создайте команду Проверить85, Действие=Проверить85, выведите её кнопку.

  4. У формы задайте АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать и СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Это два различных перечисления, не Булево. Не создавайте обработчики сохранения.

  5. Второй блок — целый модуль формы HTMLПометка85. Третий — целый модуль общей команды ОткрытьHTMLПометка85 без параметра. Общую команду включите в командный интерфейс собственной учебной подсистемы. Штатные параметры обоих обработчиков передаёт платформа; вручную их не вызывайте.

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

  7. Специальные HTML-классы старого DOM и часть операций не рекомендуются начиная с 8.2. Это узкий урок сопровождения старого кода, не способ управлять браузером и не рекомендация для нового веб-интерфейса.

  8. Этот код в 1С ещё не компилировался и не выполнялся. Неверный фактический тип, форма дерева, отказ операции или исключение означают остановку; сообщение об остановке не является успешным примером.

Функция ПрочитатьСвоюСтроку85(СтрокаHTML85)
    Чтение = Новый ЧтениеHTML;
    Если ТипЗнч(Чтение) <> Тип("ЧтениеHTML") Тогда
        ВызватьИсключение "Не создано настоящее ЧтениеHTML";
    КонецЕсли;
    Попытка
        Чтение.УстановитьСтроку(СтрокаHTML85);
        Построитель = Новый ПостроительDOM;
        Если ТипЗнч(Построитель) <> Тип("ПостроительDOM") Тогда
            ВызватьИсключение "Не создан настоящий ПостроительDOM";
        КонецЕсли;
        Документ = Построитель.Прочитать(Чтение);
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Чтение.Закрыть();
    Если ТипЗнч(Документ) <> Тип("ДокументHTML") Тогда
        ВызватьИсключение "Не получен настоящий ДокументHTML";
    КонецЕсли;
    Возврат Документ;
КонецФункции

Функция НайтиСвойБлок85(Документ, Идентификатор85)
    Блок85 = Документ.ПолучитьЭлементПоИдентификатору(Идентификатор85);
    Если Блок85 = Неопределено Тогда
        ВызватьИсключение "В своей строке не найден нужный div";
    КонецЕсли;
    Если ТипЗнч(Блок85) <> Тип("ЭлементБлокHTML")
        Или Блок85.ДокументВладелец <> Документ Тогда
        ВызватьИсключение "Нужен настоящий собственный ЭлементБлокHTML";
    КонецЕсли;
    Возврат Блок85;
КонецФункции

Функция Проверить85() Экспорт
    Документ = ПрочитатьСвоюСтроку85("<html><head><title>Своя пометка</title></head><body><div id='comment85'><!--A-01--></div><div id='commentSentinel85'>Заказ A-01, количество 3</div></body></html>");
    Блок85 = НайтиСвойБлок85(Документ, "comment85");
    Контроль85 = НайтиСвойБлок85(Документ, "commentSentinel85");
    Узлы85 = Блок85.ДочерниеУзлы;
    Если ТипЗнч(Узлы85) <> Тип("СписокУзловHTML")
        Или ТипЗнч(Узлы85.Количество()) <> Тип("Число")
        Или Узлы85.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен один настоящий дочерний HTML-комментарий";
    КонецЕсли;
    Пометка = Узлы85.Элемент(0);
    Если ТипЗнч(Пометка) <> Тип("КомментарийHTML")
        Или ТипЗнч(Пометка.Данные) <> Тип("Строка") Или Пометка.Данные <> "A-01"
        Или ТипЗнч(Пометка.Размер) <> Тип("Число") Или Пометка.Размер <> 4
        Или Пометка.ДокументВладелец <> Документ Тогда
        ВызватьИсключение "Не получена собственная настоящая пометка A-01";
    КонецЕсли;
    КонтрольДо85 = Контроль85.ТекстовоеСодержимое;
    Если ТипЗнч(КонтрольДо85) <> Тип("Строка") Или КонтрольДо85 <> "Заказ A-01, количество 3" Тогда
        ВызватьИсключение "Не получен контроль видимого текста";
    КонецЕсли;
    Пометка.ВставитьДанные(4, "!");
    Фрагмент85 = Пометка.ВыбратьДанные(0, 4);
    Если ТипЗнч(Фрагмент85) <> Тип("Строка") Или Фрагмент85 <> "A-01"
        Или Пометка.Данные <> "A-01!" Тогда
        ВызватьИсключение "Вставка и реальное чтение фрагмента не подтверждены";
    КонецЕсли;
    Пометка.ЗаменитьДанные(0, 4, "B-02");
    Пометка.УдалитьДанные(4, 1);
    Пометка.ДобавитьДанные(" проверено");
    Если ТипЗнч(Пометка.Данные) <> Тип("Строка") Или Пометка.Данные <> "B-02 проверено"
        Или ТипЗнч(Пометка.Размер) <> Тип("Число") Или Не (Пометка.Размер = 14) Тогда
        ВызватьИсключение "Не получена фактическая пометка из 14 символов";
    КонецЕсли;
    Если Блок85.ДочерниеУзлы.Количество() <> 1
        Или Блок85.ДочерниеУзлы.Элемент(0) <> Пометка
        Или Пометка.ДокументВладелец <> Документ
        Или Контроль85.ТекстовоеСодержимое <> КонтрольДо85 Тогда
        ВызватьИсключение "Изменение пометки затронуло не своё содержимое";
    КонецЕсли;
    Возврат "Пометка: " + Пометка.Данные + "; символов: " + Строка(Пометка.Размер)
        + ". Видимый контроль: " + Контроль85.ТекстовоеСодержимое;
КонецФункции
Целый модуль своей управляемой формы HTMLПометка85

Общие → Общие формы → HTMLПометка85 → пустой модуль. Вставить целиком; Результат85 — строка; Действие команды Проверить85 связано с обработчиком.

Клиент — настоящий обработчик команды; сервер — ПолучитьПротокол85НаСервере. По границе передаётся только строка.

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

&НаСервере
Функция ПолучитьПротокол85НаСервере()
    Если ИмяФормы <> "ОбщаяФорма.HTMLПометка85"
        Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
        Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
        ВызватьИсключение "Нужна своя форма с отключённым сохранением данных";
    КонецЕсли;
    Отчет85 = HTMLПометка85.Проверить85();
    Если ТипЗнч(Отчет85) <> Тип("Строка") Или Отчет85 = "" Тогда
        ВызватьИсключение "Собственный модуль не вернул полный протокол";
    КонецЕсли;
    Возврат Отчет85;
КонецФункции
Целый модуль своей общей команды ОткрытьHTMLПометка85

Общие → Общие команды → ОткрытьHTMLПометка85 → пустой модуль. Без параметра; включить в собственный командный интерфейс.

Толстый управляемый клиент, &НаКлиенте. Настоящий ОбработкаКоманды с двумя штатными параметрами.

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

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

  1. В собственной строке служебная пометка <!--A-01--> — отдельный ребёнок div. Она получается из настоящего HTML-списка, а не из СоздатьКомментарий, у которого установленная справка объявляет КомментарийDOM.

  2. Перед специальными методами проверяются фактический КомментарийHTML, строка A-01, размер 4, число детей и документ-владелец. Отдельно запоминается видимый контроль заказа.

  3. ВставитьДанные(4,"!") добавляет знак после четырёх символов. ВыбратьДанные(0,4) возвращает реальную строку A-01; проверяется и полный промежуточный текст A-01!.

  4. ЗаменитьДанные(0,4,"B-02") заменяет код; УдалитьДанные(4,1) удаляет знак; ДобавитьДанные(" проверено") дописывает собственное слово. Изменяющие методы вызываются как процедуры, без присваивания их результата.

  5. Повторное чтение Данные и Размер подтверждает B-02 проверено и 14 символов. РодительскийУзел прикреплённой пометки с div не сравнивается: объявленный тип этого свойства не доказывает такой переход.

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

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

  1. Первый будущий запуск: прочитан фрагмент A-01, конечные данные B-02 проверено, настоящий размер 14 и неизменный видимый контроль заказа.

  2. В своём отладчике проверьте смещения по символам: позиции начинаются с нуля; 4 означает место после A-01. ВыбратьДанные действительно возвращает строку, остальные четыре операции изменяют объект.

  3. Только в собственной учебной копии замените комментарий текстом или меняйте контроль: ожидается остановка, а не работа методов по объекту другого класса.

  4. Не проверяйте результат визуализацией внешнего сайта: комментарий — данные собственного дерева. Код не открывает браузер, не сохраняет HTML и не меняет бизнес-объекты.

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

При полном успешном контроле: фактическая пометка B-02 проверено, фактический размер 14 и неизменный видимый контроль заказа.

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

  1. Модель создаётся только из собственной фиксированной строки. Нельзя подставлять внешний документ, объект пользователя, файл, URL или рабочие данные и считать этот пример проверкой их безопасности.

  2. Установленная 8.5.1.1343 объявляет СоздатьКомментарий → КомментарийDOM и СоздатьТекстовыйУзел → ТекстDOM. Они не служат доказательством специальных HTML-получателей. Здесь реальные специальные узлы происходят из собственного HTMLReader/DOMBuilder и проверяются.

  3. Общий возвращаемый HTML-тип не обещает конкретный класс в любой среде. Несовпадение фактического типа/формы означает остановку и неподтверждённый опыт, не успешный обход ошибки.

  4. Не переносите правила имён, соседей и пространств имён из W3C по памяти. Сохраняются точные объявленные локальные контракты и реальные наблюдения; данные узлов не приводятся к другому классу.

  5. Чтение закрывается на нормальном пути и в обработчике ошибки; исключение повторно вызывается. Ошибка самого закрытия тоже останавливает опыт: успешная очистка при любом отказе не обещается.

  6. Нативные тексты справки и существующие конфигурационные образцы не исправлялись. Компилятор и 1С во время подготовки не запускались; статические проверки не являются выполнением примера.

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

Изменить три отделённые HTML-копии и сохранить настоящие оригиналы

Настоящие атрибут, текст и комментарий из своей строки копируются с проверкой реальных типов, паспорта, отдельных границ и пользовательских отметок. Меняем только копии на B-02, повторно читаем неизменные оригиналы A-01 и вычисляем сумму отметок 6.

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

Сервер; полный неглобальный непривилегированный общий модуль HTMLПаспорт85. Только собственная строка и память.

Подготовка

  1. Будущий ручной опыт выполняйте в своей новой пустой учебной конфигурации на платформе 8.5.1.1343, в толстом управляемом клиенте. Здесь создаётся только собственное дерево из фиксированной строки в памяти; файлы, Интернет и объекты рабочей базы не используются.

  2. Общие → Общие модули → создать HTMLПаспорт85. Сервер=Да; Глобальный=Нет; Привилегированный=Нет; Вызов сервера=Нет; оба клиентских флага=Нет; Внешнее соединение=Нет; повторное использование возвращаемых значений — Не использовать. Основной блок вставьте целиком в пустой модуль.

  3. Общие → Общие формы → создать управляемую форму HTMLПаспорт85. Добавьте реквизит Результат85: Строка неограниченной длины; выведите многострочным полем только для чтения. Создайте команду Проверить85, Действие=Проверить85, выведите её кнопку.

  4. У формы задайте АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать и СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Это два различных перечисления, не Булево. Не создавайте обработчики сохранения.

  5. Второй блок — целый модуль формы HTMLПаспорт85. Третий — целый модуль общей команды ОткрытьHTMLПаспорт85 без параметра. Общую команду включите в командный интерфейс собственной учебной подсистемы. Штатные параметры обоих обработчиков передаёт платформа; вручную их не вызывайте.

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

  7. Специальные HTML-классы старого DOM и часть операций не рекомендуются начиная с 8.2. Это узкий урок сопровождения старого кода, не способ управлять браузером и не рекомендация для нового веб-интерфейса.

  8. Этот код в 1С ещё не компилировался и не выполнялся. Неверный фактический тип, форма дерева, отказ операции или исключение означают остановку; сообщение об остановке не является успешным примером.

Функция ПрочитатьСвоюСтроку85(СтрокаHTML85)
    Чтение = Новый ЧтениеHTML;
    Если ТипЗнч(Чтение) <> Тип("ЧтениеHTML") Тогда
        ВызватьИсключение "Не создано настоящее ЧтениеHTML";
    КонецЕсли;
    Попытка
        Чтение.УстановитьСтроку(СтрокаHTML85);
        Построитель = Новый ПостроительDOM;
        Если ТипЗнч(Построитель) <> Тип("ПостроительDOM") Тогда
            ВызватьИсключение "Не создан настоящий ПостроительDOM";
        КонецЕсли;
        Документ = Построитель.Прочитать(Чтение);
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Чтение.Закрыть();
    Если ТипЗнч(Документ) <> Тип("ДокументHTML") Тогда
        ВызватьИсключение "Не получен настоящий ДокументHTML";
    КонецЕсли;
    Возврат Документ;
КонецФункции

Функция НайтиСвойБлок85(Документ, Идентификатор85)
    Блок85 = Документ.ПолучитьЭлементПоИдентификатору(Идентификатор85);
    Если Блок85 = Неопределено Тогда
        ВызватьИсключение "В своей строке не найден нужный div";
    КонецЕсли;
    Если ТипЗнч(Блок85) <> Тип("ЭлементБлокHTML")
        Или Блок85.ДокументВладелец <> Документ Тогда
        ВызватьИсключение "Нужен настоящий собственный ЭлементБлокHTML";
    КонецЕсли;
    Возврат Блок85;
КонецФункции

Функция Проверить85() Экспорт
    Документ = ПрочитатьСвоюСтроку85("<html><head><title>Свои три узла</title></head><body><div id='triplet85' data-guide='A-01'>A-01<!--A-01--></div></body></html>");
    Блок85 = НайтиСвойБлок85(Документ, "triplet85");
    Атрибут85 = Блок85.ПолучитьУзелАтрибута("data-guide");
    Если ТипЗнч(Атрибут85) <> Тип("АтрибутHTML")
        Или ТипЗнч(Атрибут85.Значение) <> Тип("Строка") Или Атрибут85.Значение <> "A-01" Тогда
        ВызватьИсключение "Не получен настоящий собственный атрибут";
    КонецЕсли;
    Владелец85 = Атрибут85.ЭлементВладелец;
    Если ТипЗнч(Владелец85) <> Тип("ЭлементБлокHTML") Или Владелец85 <> Блок85 Тогда
        ВызватьИсключение "Не подтверждён фактический владелец своего атрибута";
    КонецЕсли;
    Узлы85 = Блок85.ДочерниеУзлы;
    Если ТипЗнч(Узлы85) <> Тип("СписокУзловHTML") Или Узлы85.Количество() <> 2 Тогда
        ВызватьИсключение "Нужны собственные текст и комментарий, а не атрибут в списке детей";
    КонецЕсли;
    Текст85 = Узлы85.Элемент(0);
    Пометка85 = Узлы85.Элемент(1);
    Если ТипЗнч(Текст85) <> Тип("ТекстHTML")
        Или ТипЗнч(Пометка85) <> Тип("КомментарийHTML")
        Или Текст85.ЗначениеУзла <> "A-01" Или Пометка85.Данные <> "A-01"
        Или Блок85.ТекстовоеСодержимое <> "A-01" Тогда
        ВызватьИсключение "Не получена собственная типизированная тройка A-01";
    КонецЕсли;
    Отчет185 = ПроверитьКопию85(Атрибут85, Документ, 1);
    Отчет285 = ПроверитьКопию85(Текст85, Документ, 2);
    Отчет385 = ПроверитьКопию85(Пометка85, Документ, 3);
    Отметка185 = Атрибут85.ПолучитьПользовательскиеДанные("own-html85-passport");
    Отметка285 = Текст85.ПолучитьПользовательскиеДанные("own-html85-passport");
    Отметка385 = Пометка85.ПолучитьПользовательскиеДанные("own-html85-passport");
    Если ТипЗнч(Отметка185) <> Тип("Число") Или Отметка185 <> 1
        Или ТипЗнч(Отметка285) <> Тип("Число") Или Отметка285 <> 2
        Или ТипЗнч(Отметка385) <> Тип("Число") Или Отметка385 <> 3 Тогда
        ВызватьИсключение "Не прочитаны реальные три отметки обработки";
    КонецЕсли;
    Итого85 = Отметка185 + Отметка285 + Отметка385;
    Если Итого85 <> 6 Или Атрибут85.Значение <> "A-01"
        Или Текст85.ЗначениеУзла <> "A-01" Или Пометка85.Данные <> "A-01"
        Или Блок85.ТекстовоеСодержимое <> "A-01"
        Или Блок85.ДочерниеУзлы.Количество() <> 2 Тогда
        ВызватьИсключение "Копии изменили собственные оригиналы или итог отметок";
    КонецЕсли;
    Возврат Отчет185 + Символы.ПС + Отчет285 + Символы.ПС + Отчет385 + Символы.ПС
        + "Оригиналы A-01 сохранены; копии B-02 проверены; сумма отметок: " + Строка(Итого85);
КонецФункции

Функция ПроверитьКопию85(Узел85, Документ, Номер85)
    Если ТипЗнч(Узел85) <> Тип("АтрибутHTML")
        И ТипЗнч(Узел85) <> Тип("ТекстHTML")
        И ТипЗнч(Узел85) <> Тип("КомментарийHTML") Тогда
        ВызватьИсключение "Нужен один из трёх настоящих собственных видов узла";
    КонецЕсли;
    Имя85 = Узел85.ИмяУзла;
    ТипУзла85 = Узел85.ТипУзла;
    Значение85 = Узел85.ЗначениеУзла;
    Содержимое85 = Узел85.ТекстовоеСодержимое;
    ЛокальноеИмя85 = Узел85.ЛокальноеИмя;
    Префикс85 = Узел85.Префикс;
    Дети85 = Узел85.ДочерниеУзлы;
    ЧислоДетей85 = Дети85.Количество();
    ЕстьДети85 = Узел85.ЕстьДочерниеУзлы();
    ЕстьАтрибуты85 = Узел85.ЕстьАтрибуты();
    Если ТипЗнч(Имя85) <> Тип("Строка") Или ТипЗнч(Значение85) <> Тип("Строка")
        Или Значение85 <> "A-01" Или ТипЗнч(Содержимое85) <> Тип("Строка")
        Или ТипЗнч(Дети85) <> Тип("СписокУзловHTML")
        Или ТипЗнч(ЧислоДетей85) <> Тип("Число")
        Или ТипЗнч(ЕстьДети85) <> Тип("Булево") Или ЕстьДети85 <> (ЧислоДетей85 > 0)
        Или ТипЗнч(ЕстьАтрибуты85) <> Тип("Булево") Или ЕстьАтрибуты85
        Или Узел85.Атрибуты <> Неопределено Или Узел85.ДокументВладелец <> Документ Тогда
        ВызватьИсключение "Исходный фактический паспорт не соответствует своему узлу";
    КонецЕсли;
    Если ТипЗнч(Узел85) = Тип("АтрибутHTML") Тогда
        Если ЧислоДетей85 < 0 Или ЧислоДетей85 > 1 Тогда
            ВызватьИсключение "Не поддержана фактическая форма значения атрибута";
        КонецЕсли;
        Если ЧислоДетей85 = 1 Тогда
            Ребенок85 = Дети85.Элемент(0);
            Если ТипЗнч(Ребенок85) <> Тип("ТекстHTML") Или Ребенок85.ЗначениеУзла <> "A-01" Тогда
                ВызватьИсключение "Не прочитан настоящий текстовый ребёнок атрибута";
            КонецЕсли;
        КонецЕсли;
    Иначе
        Если ЧислоДетей85 <> 0 Или Префикс85 <> Неопределено Тогда
            ВызватьИсключение "Текст и комментарий должны быть листовыми узлами без префикса";
        КонецЕсли;
    КонецЕсли;
    СтарыеДанные85 = Узел85.УстановитьПользовательскиеДанные("own-html85-passport", Номер85);
    Если СтарыеДанные85 <> Неопределено
        Или Узел85.ПолучитьПользовательскиеДанные("own-html85-passport") <> Номер85 Тогда
        ВызватьИсключение "Собственная новая отметка не установлена";
    КонецЕсли;
    Копия85 = Узел85.КлонироватьУзел(Истина);
    Если ТипЗнч(Копия85) <> ТипЗнч(Узел85) Тогда
        ВызватьИсключение "Копия не имеет фактический исходный тип HTML";
    КонецЕсли;
    РавенДо85 = Узел85.УзелРавен(Копия85);
    Идентичен85 = Узел85.УзелИдентичен(Копия85);
    Если ТипЗнч(РавенДо85) <> Тип("Булево") Или Не РавенДо85
        Или ТипЗнч(Идентичен85) <> Тип("Булево") Или Идентичен85
        Или Копия85.РодительскийУзел <> Неопределено
        Или Копия85.ПредыдущийСоседний <> Неопределено
        Или Копия85.СледующийСоседний <> Неопределено
        Или Копия85.ПолучитьПользовательскиеДанные("own-html85-passport") <> Неопределено Тогда
        ВызватьИсключение "Не подтверждена настоящая отдельная копия без отметок";
    КонецЕсли;
    Если Копия85.ИмяУзла <> Имя85 Или Копия85.ТипУзла <> ТипУзла85
        Или Копия85.ЗначениеУзла <> Значение85 Или Копия85.ТекстовоеСодержимое <> Содержимое85
        Или Копия85.ЛокальноеИмя <> ЛокальноеИмя85 Или Копия85.Префикс <> Префикс85
        Или Копия85.Атрибуты <> Неопределено Или Копия85.ДокументВладелец <> Документ
        Или Копия85.ДочерниеУзлы.Количество() <> ЧислоДетей85
        Или Копия85.ЕстьДочерниеУзлы() <> ЕстьДети85 Или Копия85.ЕстьАтрибуты() <> ЕстьАтрибуты85 Тогда
        ВызватьИсключение "Повторное чтение копии не совпало с фактическим паспортом";
    КонецЕсли;
    Дополнение85 = "";
    Если ТипЗнч(Копия85) = Тип("АтрибутHTML") Тогда
        АтрибутКопия85 = Копия85;
        АтрибутКопия85.Значение = "B-02";
        НовыеДети85 = АтрибутКопия85.ДочерниеУзлы;
        Если ТипЗнч(НовыеДети85) <> Тип("СписокУзловHTML") Или НовыеДети85.Количество() <> 1 Тогда
            ВызватьИсключение "Запись значения копии не создала один настоящий текстовый узел";
        КонецЕсли;
        НовыйТекст85 = НовыеДети85.Элемент(0);
        Если ТипЗнч(НовыйТекст85) <> Тип("ТекстHTML") Или НовыйТекст85.ЗначениеУзла <> "B-02"
            Или АтрибутКопия85.Значение <> "B-02" Тогда
            ВызватьИсключение "Не подтверждено новое значение только копии атрибута";
        КонецЕсли;
        Дополнение85 = "Детей атрибута до: " + Строка(ЧислоДетей85)
            + "; после изменения копии: " + Строка(НовыеДети85.Количество());
    Иначе
        ЛистоваяКопия85 = Копия85;
        Если ЛистоваяКопия85.ДочерниеУзлы.Количество() <> 0
            Или ЛистоваяКопия85.ПервыйДочерний <> Неопределено
            Или ЛистоваяКопия85.ПоследнийДочерний <> Неопределено Тогда
            ВызватьИсключение "Листовая копия неожиданно имеет детей";
        КонецЕсли;
        ЛистоваяКопия85.ЗначениеУзла = "B-02";
        Пробелы85 = ЛистоваяКопия85.ЭтоПробельныеСимволыЭлемента;
        Если ТипЗнч(Пробелы85) <> Тип("Булево") Тогда
            ВызватьИсключение "Не получен фактический признак пробельного текста";
        КонецЕсли;
        Дополнение85 = "Признак пробелов: " + Строка(Пробелы85);
        Если ТипЗнч(ЛистоваяКопия85) = Тип("КомментарийHTML") Тогда
            КопияПометки85 = ЛистоваяКопия85;
            ПолныйПометки85 = КопияПометки85.ПолныйТекст;
            Если ТипЗнч(ПолныйПометки85) <> Тип("Строка") Тогда
                ВызватьИсключение "Не прочитан фактический полный текст копии комментария";
            КонецЕсли;
            Дополнение85 = Дополнение85 + "; фактический полный текст: " + ПолныйПометки85;
        КонецЕсли;
    КонецЕсли;
    РавенПосле85 = Узел85.УзелРавен(Копия85);
    Если ТипЗнч(РавенПосле85) <> Тип("Булево") Или РавенПосле85
        Или Копия85.ЗначениеУзла <> "B-02" Или Узел85.ЗначениеУзла <> Значение85
        Или Узел85.ИмяУзла <> Имя85 Или Узел85.ТипУзла <> ТипУзла85
        Или Узел85.ТекстовоеСодержимое <> Содержимое85
        Или Узел85.ЛокальноеИмя <> ЛокальноеИмя85 Или Узел85.Префикс <> Префикс85
        Или Узел85.ДочерниеУзлы.Количество() <> ЧислоДетей85
        Или Узел85.ПолучитьПользовательскиеДанные("own-html85-passport") <> Номер85 Тогда
        ВызватьИсключение "Независимость изменённой копии от оригинала не подтверждена";
    КонецЕсли;
    Возврат "Узел " + Строка(Номер85) + ": имя=" + Имя85 + "; тип=" + Строка(ТипУзла85)
        + "; оригинал=" + Узел85.ЗначениеУзла + "; копия=" + Копия85.ЗначениеУзла
        + "; локальное имя=" + Строка(ЛокальноеИмя85) + "; префикс=" + Строка(Префикс85)
        + "; текст до=" + Содержимое85 + "; отметка=" + Строка(Узел85.ПолучитьПользовательскиеДанные("own-html85-passport"))
        + "; " + Дополнение85;
КонецФункции
Целый модуль своей управляемой формы HTMLПаспорт85

Общие → Общие формы → HTMLПаспорт85 → пустой модуль. Вставить целиком; Результат85 — строка; Действие команды Проверить85 связано с обработчиком.

Клиент — настоящий обработчик команды; сервер — ПолучитьПротокол85НаСервере. По границе передаётся только строка.

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

&НаСервере
Функция ПолучитьПротокол85НаСервере()
    Если ИмяФормы <> "ОбщаяФорма.HTMLПаспорт85"
        Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
        Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
        ВызватьИсключение "Нужна своя форма с отключённым сохранением данных";
    КонецЕсли;
    Отчет85 = HTMLПаспорт85.Проверить85();
    Если ТипЗнч(Отчет85) <> Тип("Строка") Или Отчет85 = "" Тогда
        ВызватьИсключение "Собственный модуль не вернул полный протокол";
    КонецЕсли;
    Возврат Отчет85;
КонецФункции
Целый модуль своей общей команды ОткрытьHTMLПаспорт85

Общие → Общие команды → ОткрытьHTMLПаспорт85 → пустой модуль. Без параметра; включить в собственный командный интерфейс.

Толстый управляемый клиент, &НаКлиенте. Настоящий ОбработкаКоманды с двумя штатными параметрами.

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

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

  1. Своя строка содержит атрибут data-guide, видимый текст и комментарий со значением A-01. Атрибут получается через ПолучитьУзелАтрибута, а два ребёнка — из настоящего ограниченного списка; каждый специальный тип проверяется до его свойств.

  2. Паспорт читает реальные имена, тип узла, значения, текст, локальное имя, префикс, число детей и признаки атрибутов. Эти данные сравниваются с копией и выводятся, а не подменяются именами #text/#comment или выдуманными пустыми пространствами имён.

  3. Три настоящие отметки 1, 2 и 3 устанавливаются на исходных узлах. КлонироватьУзел(Истина) возвращает общий набор HTML-типов: у каждой фактической копии проверяется исходный тип, равенство содержания и отсутствие идентичности.

  4. Копии не вставляются в дерево. Их фактические родитель, предыдущий и следующий сосед должны быть Неопределено; пользовательская отметка не копируется. Так изучаются отдельные копии, а не спорные соседние объекты разных классов.

  5. Меняется только копия: Значение атрибута либо ЗначениеУзла текста/комментария становится B-02. У атрибута настоящий setter создаёт текстового ребёнка, который заново читается через широкий СписокУзловHTML и проверяется как ТекстHTML.

  6. ПервыйДочерний и ПоследнийДочерний используются только у фактических листовых копий текста/комментария. У атрибута эти два свойства не демонстрируются: их объявленный тип АтрибутHTML не подтверждает текстового ребёнка.

  7. После изменения родные узлы повторно читаются как A-01; копия уже не равна оригиналу, но это не повреждает исходную страницу. Отдельно читаются реальные три числовые отметки и вычисляется их сумма 6.

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

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

  1. Первый будущий запуск: три строки паспорта показывают реальные имена/типы; оригиналы остаются A-01, отдельные копии прочитаны как B-02, фактическая сумма отметок равна 6.

  2. Проследите настоящие три типа до КлонироватьУзел, затем отдельный фактический тип каждой копии. До изменения равенство Истина, идентичность Ложь; после изменения равенство Ложь.

  3. В отладчике у настоящих отделённых копий проверьте фактические Неопределено у родителя и соседей и отсутствие скопированных пользовательских отметок. Не прикрепляйте копии для искусственного исправления проверки.

  4. У исходного атрибута допускается только измеренная форма 0/1 ребёнок. После записи значения копии должен быть один настоящий текстовый ребёнок B-02; исходный атрибут и страница не меняются.

  5. Только в собственной копии уберите одну из проверок типа или подставьте прежний узел вместо результата клонирования: это отрицательный опыт, который не должен проходить контроль содержания и идентичности.

  6. При неподдержанной фактической форме дерева или исключении нет успешного протокола. Состояние предыдущего отчёта очищается; ошибочный вызов не повторяется автоматически.

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

При полном успешном контроле: три реальные отдельные копии B-02, неизменные оригиналы A-01 и сумма трёх реально прочитанных отметок 6. Конкретные имена/полный текст устаревших свойств показываются как наблюдения.

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

  1. Модель создаётся только из собственной фиксированной строки. Нельзя подставлять внешний документ, объект пользователя, файл, URL или рабочие данные и считать этот пример проверкой их безопасности.

  2. Установленная 8.5.1.1343 объявляет СоздатьКомментарий → КомментарийDOM и СоздатьТекстовыйУзел → ТекстDOM. Они не служат доказательством специальных HTML-получателей. Здесь реальные специальные узлы происходят из собственного HTMLReader/DOMBuilder и проверяются.

  3. Общий возвращаемый HTML-тип не обещает конкретный класс в любой среде. Несовпадение фактического типа/формы означает остановку и неподтверждённый опыт, не успешный обход ошибки.

  4. Не переносите правила имён, соседей и пространств имён из W3C по памяти. Сохраняются точные объявленные локальные контракты и реальные наблюдения; данные узлов не приводятся к другому классу.

  5. Чтение закрывается на нормальном пути и в обработчике ошибки; исключение повторно вызывается. Ошибка самого закрытия тоже останавливает опыт: успешная очистка при любом отказе не обещается.

  6. Нативные тексты справки и существующие конфигурационные образцы не исправлялись. Компилятор и 1С во время подготовки не запускались; статические проверки не являются выполнением примера.

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

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

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

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

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