Узел атрибута HTML.
Полное описание, параметры и ограничения
АтрибутHTML (HTMLAttribute)
АтрибутHTML (HTMLAttribute)
Доступен, начиная с версии 8.2.
Свойства:
Атрибуты (Attributes)
ДокументВладелец (OwnerDocument)
ДочерниеУзлы (ChildNodes)
ЗначениеУзла (NodeValue)
ИмяУзла (NodeName)
ЛокальноеИмя (LocalName)
ПервыйДочерний (FirstChild)
ПоследнийДочерний (LastChild)
ПредыдущийСоседний (PreviousSibling)
Префикс (Prefix)
РодительскийУзел (ParentNode)
СледующийСоседний (NextSibling)
ТекстовоеСодержимое (TextContent)
ТипУзла (NodeType)
Значение (Value)
Имя (Name)
Указан (Specified)
ЭлементВладелец (OwnerElement)
ЯвляетсяИдентификатором (IsId)
Методы:
ВставитьПеред (InsertBefore)
ДобавитьДочерний (AppendChild)
ЕстьАтрибуты (HasAttributes)
ЕстьДочерниеУзлы (HasChildNodes)
ЗаменитьДочерний (ReplaceChild)
КлонироватьУзел (CloneNode)
Нормализовать (Normalize)
ПолучитьПользовательскиеДанные (GetUserData)
СравнитьПозициюВДокументе (CompareDocumentPosition)
УдалитьДочерний (RemoveChild)
УзелИдентичен (IsSameNode)
УзелРавен (IsEqualNode)
УстановитьПользовательскиеДанные (SetUserData)
Описание:
Узел атрибута HTML.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
См. также:
ЭлементHTML, метод УдалитьУзелАтрибута
ЭлементHTML, метод УстановитьУзелАтрибута
ЭлементHTML, метод УстановитьУзелАтрибутаИдентификатора
КоллекцияАтрибутовHTML, метод ПолучитьИменованныйЭлемент
КоллекцияАтрибутовHTML, метод УстановитьИменованныйЭлемент
КоллекцияАтрибутовHTML, метод УдалитьИменованныйЭлемент
КоллекцияАтрибутовHTML, метод Элемент
ДокументHTML, метод СоздатьАтрибут
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Переименовать собственный атрибут, используя результат операции
Переименовываем data-old в data-guide. Справка допускает замену исходного узла новым, поэтому не полагаемся на старую ссылку.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Используйте учебную базу платформы 8.5.1.1343 и серверную процедуру учебного общего модуля. Каждый пример выполняйте отдельно.
Все данные заказа вымышлены и находятся в строке. ЧтениеHTML разбирает данные, но не является браузером: форма не отправляется, ссылки не открываются, картинки не скачиваются.
Никакие файлы, адреса сайтов, токены и документы информационной базы не нужны. Не заменяйте учебную строку произвольным внешним HTML без отдельной проверки безопасности.
Индексы коллекций начинаются с нуля. Перед обращением к найденному узлу проверяйте Неопределено; перед специальными свойствами элемента проверяйте его тип.
HTML = "<html><head><title>Учебный заказ</title><meta id='meta' name='description' content='Вымышленный заказ'></head>
|<body id='body'><p id='note'>Заказ существует только в памяти</p><pre id='code'>A-01: 3
|B-02: 1</pre>
|<form id='order' name='order' action='' method='get'>
|<input id='customer' name='customer' type='text' value='Учебный покупатель'>
|<input id='accepted' name='accepted' type='checkbox' value='yes'>
|<button id='preview' name='preview' type='button' value='preview'>Предпросмотр</button></form>
|<table id='items' summary='Книга и ручка'><caption id='caption'>Товары</caption><colgroup><col id='column'></colgroup><tbody>
|<tr id='book'><td id='book-name'>Книга</td><td>3</td></tr><tr id='pen'><td>Ручка</td><td>1</td></tr>
|</tbody></table><a id='help' name='help' href='#note'>Пояснение</a><img id='logo' alt='Учебная картинка без источника'>
|</body></html>";
Чтение = Новый ЧтениеHTML;
Чтение.УстановитьСтроку(HTML);
Попытка
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если ТипЗнч(Документ) <> Тип("ДокументHTML") Тогда
ВызватьИсключение "Ожидался ДокументHTML, а не XML-документ";
КонецЕсли;
Форма = Документ.ПолучитьЭлементПоИдентификатору("order");
Если Форма = Неопределено Тогда
ВызватьИсключение "Не найден учебный элемент order";
КонецЕсли;
Если ТипЗнч(Форма) <> Тип("ЭлементФормаHTML") Тогда
ВызватьИсключение "Неожиданный тип учебного элемента order";
КонецЕсли;
Блок = Документ.СоздатьЭлемент("guide-section");
Если ТипЗнч(Блок) <> Тип("ЭлементHTML") Тогда
ВызватьИсключение "Учебный контейнер должен иметь общий тип ЭлементHTML";
КонецЕсли;
Форма.ДобавитьДочерний(Блок);
Атрибут = Документ.СоздатьАтрибут("data-old");
Атрибут.Значение = "A-01";
Блок.УстановитьУзелАтрибута(Атрибут);
Результат = Документ.ПереименоватьУзел(Атрибут, "data-guide");
Если Результат = Неопределено Тогда
ВызватьИсключение "После переименования ожидается актуальный узел";
КонецЕсли;
Сообщить(Результат.ИмяУзла = "data-guide");
Сообщить(Блок.ЕстьАтрибут("data-guide"));
Сообщить(Не Блок.ЕстьАтрибут("data-old"));
Сообщить(Блок.ПолучитьАтрибут("data-guide") = "A-01");Разбор по шагам
Создаём и прикрепляем только собственный атрибут с допустимым XML-именем.
Результат метода — актуальный узел; исходный объект мог быть заменён.
Проверяем новое имя, отсутствие старого и сохранённое строковое значение.
Как проверить результат
Четыре сравнения Истина: новое имя, наличие нового, отсутствие старого и значение A-01.
Текст заказа и исходные id не должны измениться.
Ожидаемый результат
Переименование проверено по актуальному дереву, не по предположению об идентичности.
На что обратить внимание
Не переименовывайте исходный id внешнего документа без проверки ссылок на него.
Общий возвращаемый DOM-интерфейс не позволяет без проверки вызывать специальные свойства атрибута результата.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Изменить три отделённые HTML-копии и сохранить настоящие оригиналы
Настоящие атрибут, текст и комментарий из своей строки копируются с проверкой реальных типов, паспорта, отдельных границ и пользовательских отметок. Меняем только копии на B-02, повторно читаем неизменные оригиналы A-01 и вычисляем сумму отметок 6.
Где и как запускать
Сервер; полный неглобальный непривилегированный общий модуль HTMLПаспорт85. Только собственная строка и память.
Подготовка
Будущий ручной опыт выполняйте в своей новой пустой учебной конфигурации на платформе 8.5.1.1343, в толстом управляемом клиенте. Здесь создаётся только собственное дерево из фиксированной строки в памяти; файлы, Интернет и объекты рабочей базы не используются.
Общие → Общие модули → создать HTMLПаспорт85. Сервер=Да; Глобальный=Нет; Привилегированный=Нет; Вызов сервера=Нет; оба клиентских флага=Нет; Внешнее соединение=Нет; повторное использование возвращаемых значений — Не использовать. Основной блок вставьте целиком в пустой модуль.
Общие → Общие формы → создать управляемую форму HTMLПаспорт85. Добавьте реквизит Результат85: Строка неограниченной длины; выведите многострочным полем только для чтения. Создайте команду Проверить85, Действие=Проверить85, выведите её кнопку.
У формы задайте АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать и СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Это два различных перечисления, не Булево. Не создавайте обработчики сохранения.
Второй блок — целый модуль формы HTMLПаспорт85. Третий — целый модуль общей команды ОткрытьHTMLПаспорт85 без параметра. Общую команду включите в командный интерфейс собственной учебной подсистемы. Штатные параметры обоих обработчиков передаёт платформа; вручную их не вызывайте.
Обновите конфигурацию собственной учебной базы, откройте форму общей командой и нажмите Проверить85. Разбор и изменения своих узлов выполняются на сервере; клиент получает только строку проверенного результата.
Специальные HTML-классы старого DOM и часть операций не рекомендуются начиная с 8.2. Это узкий урок сопровождения старого кода, не способ управлять браузером и не рекомендация для нового веб-интерфейса.
Этот код в 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");
#Иначе
ВызватьИсключение "Нужен толстый управляемый клиент";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Своя строка содержит атрибут data-guide, видимый текст и комментарий со значением A-01. Атрибут получается через ПолучитьУзелАтрибута, а два ребёнка — из настоящего ограниченного списка; каждый специальный тип проверяется до его свойств.
Паспорт читает реальные имена, тип узла, значения, текст, локальное имя, префикс, число детей и признаки атрибутов. Эти данные сравниваются с копией и выводятся, а не подменяются именами #text/#comment или выдуманными пустыми пространствами имён.
Три настоящие отметки 1, 2 и 3 устанавливаются на исходных узлах. КлонироватьУзел(Истина) возвращает общий набор HTML-типов: у каждой фактической копии проверяется исходный тип, равенство содержания и отсутствие идентичности.
Копии не вставляются в дерево. Их фактические родитель, предыдущий и следующий сосед должны быть Неопределено; пользовательская отметка не копируется. Так изучаются отдельные копии, а не спорные соседние объекты разных классов.
Меняется только копия: Значение атрибута либо ЗначениеУзла текста/комментария становится B-02. У атрибута настоящий setter создаёт текстового ребёнка, который заново читается через широкий СписокУзловHTML и проверяется как ТекстHTML.
ПервыйДочерний и ПоследнийДочерний используются только у фактических листовых копий текста/комментария. У атрибута эти два свойства не демонстрируются: их объявленный тип АтрибутHTML не подтверждает текстового ребёнка.
После изменения родные узлы повторно читаются как A-01; копия уже не равна оригиналу, но это не повреждает исходную страницу. Отдельно читаются реальные три числовые отметки и вычисляется их сумма 6.
ПолныйТекст комментария и признак пробелов выводятся как фактические устаревшие наблюдения без обещания заранее известного значения. На клиент не передаются узлы, списки, перечисления или служебные данные — только строковый протокол.
Как проверить результат
Первый будущий запуск: три строки паспорта показывают реальные имена/типы; оригиналы остаются A-01, отдельные копии прочитаны как B-02, фактическая сумма отметок равна 6.
Проследите настоящие три типа до КлонироватьУзел, затем отдельный фактический тип каждой копии. До изменения равенство Истина, идентичность Ложь; после изменения равенство Ложь.
В отладчике у настоящих отделённых копий проверьте фактические Неопределено у родителя и соседей и отсутствие скопированных пользовательских отметок. Не прикрепляйте копии для искусственного исправления проверки.
У исходного атрибута допускается только измеренная форма 0/1 ребёнок. После записи значения копии должен быть один настоящий текстовый ребёнок B-02; исходный атрибут и страница не меняются.
Только в собственной копии уберите одну из проверок типа или подставьте прежний узел вместо результата клонирования: это отрицательный опыт, который не должен проходить контроль содержания и идентичности.
При неподдержанной фактической форме дерева или исключении нет успешного протокола. Состояние предыдущего отчёта очищается; ошибочный вызов не повторяется автоматически.
Ожидаемый результат
При полном успешном контроле: три реальные отдельные копии B-02, неизменные оригиналы A-01 и сумма трёх реально прочитанных отметок 6. Конкретные имена/полный текст устаревших свойств показываются как наблюдения.
На что обратить внимание
Модель создаётся только из собственной фиксированной строки. Нельзя подставлять внешний документ, объект пользователя, файл, URL или рабочие данные и считать этот пример проверкой их безопасности.
Установленная 8.5.1.1343 объявляет СоздатьКомментарий → КомментарийDOM и СоздатьТекстовыйУзел → ТекстDOM. Они не служат доказательством специальных HTML-получателей. Здесь реальные специальные узлы происходят из собственного HTMLReader/DOMBuilder и проверяются.
Общий возвращаемый HTML-тип не обещает конкретный класс в любой среде. Несовпадение фактического типа/формы означает остановку и неподтверждённый опыт, не успешный обход ошибки.
Не переносите правила имён, соседей и пространств имён из W3C по памяти. Сохраняются точные объявленные локальные контракты и реальные наблюдения; данные узлов не приводятся к другому классу.
Чтение закрывается на нормальном пути и в обработчике ошибки; исключение повторно вызывается. Ошибка самого закрытия тоже останавливает опыт: успешная очистка при любом отказе не обещается.
Нативные тексты справки и существующие конфигурационные образцы не исправлялись. Компилятор и 1С во время подготовки не запускались; статические проверки не являются выполнением примера.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.