Привязать свои служебные данные к документу, не меняя HTML

Учебные задачи

Сохраняем собственную структуру о разборе заказа под отдельным ключом пользовательских данных документа. Читаем её обратно и доказываем, что это не атрибут HTML и не изменение текста.

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

Полный серверный общий модуль УчебныйДокументHTML85. Свой HTML создаётся строкой и разбирается в памяти, без браузера и внешних источников.

Подготовка

  1. Используйте отдельную учебную базу 8.5.1.1343. Создайте общий модуль УчебныйДокументHTML85: Сервер — Да, Клиент — Нет, Глобальный — Нет, Вызов сервера — Нет, Привилегированный — Нет.

  2. Вставьте весь приведённый модуль одного урока. В своей управляемой учебной обработке создайте команду и клиентский обработчик, вызывающий свою процедуру с директивой &НаСервереБезКонтекста. В её тело вставьте УчебныйДокументHTML85.ВыполнитьПример();.

  3. Источник HTML полностью записан в коде: свой вымышленный заказ, покупатель, книга, ручка и элементы с явно заданными id. ЧтениеHTML и ПостроительDOM получают строку, а не URL или внешний файл.

  4. Разбор HTML в этом уроке не открывает браузер, не отправляет форму, не загружает картинки и не исполняет JavaScript. Файлы, сеть, печать, рабочие документы и регистры не используются.

  5. Каждый запуск создаёт новый собственный документ в памяти. Поставьте точку останова перед конечными Сообщить и исследуйте Документ, его ЭлементДокумента и указанные переменные урока в серверном отладчике.

  6. ДокументHTML — корневой объект дерева, а его ЭлементДокумента, Тело и отдельный блок — другие узлы. Одинаковые имена методов не означают одинаковые правила допустимых дочерних узлов.

  7. Результаты ниже ожидаемые. В 1С код не запускался; статическая сверка сигнатур и readonly не подтверждает все особенности реализации HTML DOM вашей среды. Выполните проверки только на своём учебном стенде.

Процедура ВыполнитьПример() Экспорт
    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-документ";
    КонецЕсли;
    Ключ = "own:syntax-guide:order-analysis";
    ДоТекст = Документ.ИзвлечьТолькоТекст();
    ДоКопия = Документ.КлонироватьУзел(Истина);
    ДоДанных = Документ.ПолучитьПользовательскиеДанные(Ключ);
    Сообщить(ДоДанных = Неопределено);
    СвоиДанные = Новый Структура("Тема,Количество", "Учебный заказ", 4);
    Документ.УстановитьПользовательскиеДанные(Ключ, СвоиДанные);
    Получено = Документ.ПолучитьПользовательскиеДанные(Ключ);
    Если ТипЗнч(Получено) <> Тип("Структура") Тогда
        ВызватьИсключение "Ожидалась своя служебная структура";
    КонецЕсли;
    Сообщить(Получено.Тема = "Учебный заказ" И Получено.Количество = 4);
    Сообщить(Документ.ИзвлечьТолькоТекст() = ДоТекст);
    Сообщить(Документ.УзелРавен(ДоКопия));
    НовоеОписание = Новый Структура("Тема,Количество", "Пересчитан учебный заказ", 5);
    Документ.УстановитьПользовательскиеДанные(Ключ, НовоеОписание);
    Обновлено = Документ.ПолучитьПользовательскиеДанные(Ключ);
    Если ТипЗнч(Обновлено) <> Тип("Структура") Тогда
        ВызватьИсключение "Нет обновлённой своей структуры";
    КонецЕсли;
    Сообщить(Обновлено.Тема = "Пересчитан учебный заказ" И Обновлено.Количество = 5);
    Сообщить(Документ.ПолучитьПользовательскиеДанные("own:absent") = Неопределено);

КонецПроцедуры

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

  1. Документ только что создан из своей строки, поэтому наш отдельный ключ ещё не занят. ПолучитьПользовательскиеДанные для отсутствующего ключа по справке возвращает Неопределено.

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

  3. Создать свою Структура с темой анализа и числом единиц 4: книга 3 и ручка 1 из исходного вымышленного заказа.

  4. УстановитьПользовательскиеДанные связывает произвольное значение с узлом. Ключ own:syntax-guide:order-analysis относится к служебным данным, не к атрибуту id или data-*.

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

  6. HTML-текст остаётся прежним. Структурное равенство с копией сохраняется, поскольку пользовательские данные по справке не влияют на УзелРавен.

  7. Повторная установка своего ключа заменяет служебное описание; собственный отсутствующий ключ по-прежнему даёт Неопределено. Код не обещает перенос этих данных при сериализации или клонировании.

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

  1. Шесть сообщений Истина: отсутствие первоначальных данных, своя структура 4, сохранность текста, структурное равенство, обновлённая структура 5 и отсутствие другого ключа.

  2. Проверьте в дереве HTML: атрибут own:syntax-guide:order-analysis не появляется. Метод не является УстановитьАтрибут.

  3. Обновление числа в служебной структуре не изменяет количество в HTML-таблице. Чтобы исправить сам заказ, потребуется отдельная осознанная правка его узлов.

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

Служебные данные собственного разбора привязаны, прочитаны и заменены без смешения с атрибутами и текстом HTML.

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

  1. Пользовательские данные здесь принадлежат одному объекту DOM в памяти, не текущему пользователю информационной базы и не настройкам его профиля.

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

  3. Не обещайте автоматическую сериализацию или перенос служебных данных при копировании документа без отдельной проверки контракта.

  4. Изменение служебного числа не является изменением продажи или документа базы. В 1С пример не запускался.

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

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

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

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

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