Отделить метку своей HTML-пометки и рассчитать 125 + 75

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

Разбираем собственную HTML-строку, находим настоящий комментарий DRAFT:125 и вызываем РазделитьТекст(6). Проверяем префикс исходного комментария и данные фактически возвращённого ТекстDOM; из полученного числа 125 и учебной доплаты 75 вычисляем 200. Это узкое сопровождение устаревшего API с сохранённым противоречием типов.

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

Полный модуль собственной управляемой общей формы новой файловой CF 8.5.1.1343. Настоящая команда на клиенте; разбор, разделение, чтение обоих свойств Данные и преобразование числа только в &НаСервереБезКонтекста. Возврат через границу — Строка.

Подготовка

  1. Урок относится к сопровождению старого HTML API: КомментарийHTML и РазделитьТекст не рекомендуются начиная с 8.2. Здесь есть только исходник будущего опыта, не результат запуска 1С. Метод обещает ТекстDOM, а не ТекстHTML; иной фактический тип остановит опыт.

  2. Вручную создайте свою новую пустую файловую учебную ИБ с платформой 8.5.1.1343. В свойствах корня конфигурации задайте Имя = УчебноеРазделениеHTML85, Основной режим запуска = Управляемое приложение, Режим совместимости = Не использовать. Не изменяйте рабочую конфигурацию или её копию.

  3. Конфигуратор → Общие → Общие формы: создайте управляемую РазделениеПометкиHTML85. Реквизит Протокол85: Строка, длина 0 (неограниченная). Выведите его многострочным полем, ТолькоПросмотр = Да. ОпытНачат85 — внутренняя переменная модуля, не реквизит для редактирования.

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

  5. В форме → Команды создайте Разделить85, Действие = Разделить85. ИспользованиеТекущейСтроки и ИспользованиеВыделенныхСтрок = НеИспользует. Добавьте кнопку с этой командой. Основной блок вставьте целиком в пустой модуль формы вместо автоматически созданной пустой процедуры; внутри него уже есть клиентский обработчик и серверная функция.

  6. Общие → Подсистемы: создайте УчебныйHTML85. Общие → Общие команды: создайте ОткрытьРазделениеПометкиHTML85 без параметра, включите в состав своей подсистемы и отметьте видимость в её командном интерфейсе. Поддерживающий блок вставьте целиком в пустой модуль именно этой общей команды. Параметры обработчика передаёт платформа; не вызывайте его вручную.

  7. Сохраните собственную учебную конфигурацию, проверьте её для выбранного клиента и сервера, обновите только свою учебную ИБ. Запустите толстый управляемый клиент 8.5.1.1343 и откройте форму настоящей общей командой. Серверная функция работает и в файловой ИБ; не переносите DOM-разбор или чтение ТекстDOM.Данные в клиентский обработчик.

  8. HTML полностью задан строкой: внутри своего DIV только комментарий DRAFT:125 и SPAN с текстом 125. Не добавляйте пробелы между детьми, файлы, URL, скрипты или чужую разметку. Парсер не открывает браузер; дерево существует только в памяти серверного вызова.

  9. Нажмите Разделить85 один раз на новом экземпляре своей формы. Старый протокол очищается до проверок, повтор в этом экземпляре запрещён. Если фактическое поведение устаревшего API расходится со справкой, получите СТОП и вручную завершите опыт: типы не исправляются, дерево не восстанавливается, повтор автоматически не выполняется.

&НаКлиенте
Перем ОпытНачат85;

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

&НаСервереБезКонтекста
Функция РазделитьНаСервере85()
    ИсходныйHTML85 = "<html><head><title>Урок 125</title></head><body><div id='split85'><!--DRAFT:125--><span id='value85'>125</span></div></body></html>";
    Чтение85 = Новый ЧтениеHTML;
    Попытка
        Чтение85.УстановитьСтроку(ИсходныйHTML85);
        Построитель85 = Новый ПостроительDOM;
        Документ85 = Построитель85.Прочитать(Чтение85);
    Исключение
        Чтение85.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Чтение85.Закрыть();
    Если ТипЗнч(Документ85) <> Тип("ДокументHTML") Тогда
        ВызватьИсключение "Разбор не вернул документированный ДокументHTML";
    КонецЕсли;
    Контейнер85 = Документ85.ПолучитьЭлементПоИдентификатору("split85");
    Если ТипЗнч(Контейнер85) <> Тип("ЭлементБлокHTML") Тогда
        ВызватьИсключение "Не получен собственный DIV";
    КонецЕсли;
    Дети85 = Контейнер85.ДочерниеУзлы;
    Если ТипЗнч(Дети85) <> Тип("СписокУзловHTML") Тогда
        ВызватьИсключение "Не получен список собственных узлов";
    КонецЕсли;
    Количество85 = Дети85.Количество();
    Если ТипЗнч(Количество85) <> Тип("Число") Или Количество85 <> 2 Тогда
        ВызватьИсключение "До разделения ожидаются ровно два узла";
    КонецЕсли;
    Пометка85 = Дети85.Элемент(0);
    Если ТипЗнч(Пометка85) <> Тип("КомментарийHTML") Тогда
        ВызватьИсключение "Первый узел не является документированным КомментарийHTML";
    КонецЕсли;
    Владелец85 = Пометка85.ДокументВладелец;
    Если ТипЗнч(Владелец85) <> Тип("ДокументHTML") Тогда
        ВызватьИсключение "Не получен документ собственной пометки";
    КонецЕсли;
    ПометкаСвоя85 = Владелец85.УзелИдентичен(Документ85);
    Если ТипЗнч(ПометкаСвоя85) <> Тип("Булево") Или Не ПометкаСвоя85 Тогда
        ВызватьИсключение "Пометка не принадлежит только что разобранному документу";
    КонецЕсли;
    ДанныеДо85 = Пометка85.Данные;
    Если ТипЗнч(ДанныеДо85) <> Тип("Строка") Или ДанныеДо85 <> "DRAFT:125" Тогда
        ВызватьИсключение "Полная собственная пометка не совпала";
    КонецЕсли;
    РезультатРазделения85 = Пометка85.РазделитьТекст(6);
    Если ТипЗнч(Пометка85) <> Тип("КомментарийHTML")
        Или ТипЗнч(РезультатРазделения85) <> Тип("ТекстDOM") Тогда
        ВызватьИсключение "Фактические типы после разделения не соответствуют справке";
    КонецЕсли;
    Префикс85 = Пометка85.Данные;
    СуммаСтрокой85 = РезультатРазделения85.Данные;
    Если ТипЗнч(Префикс85) <> Тип("Строка") Или Префикс85 <> "DRAFT:"
        Или ТипЗнч(СуммаСтрокой85) <> Тип("Строка") Или СуммаСтрокой85 <> "125" Тогда
        ВызватьИсключение "Две фактически прочитанные части пометки не совпали";
    КонецЕсли;
    Сумма85 = Число(СуммаСтрокой85);
    Если ТипЗнч(Сумма85) <> Тип("Число") Или Сумма85 <> 125 Тогда
        ВызватьИсключение "Полученная сумма не подтверждена";
    КонецЕсли;
    Доплата85 = 75;
    Итого85 = Сумма85 + Доплата85;
    Если ТипЗнч(Итого85) <> Тип("Число") Или Итого85 <> 200 Тогда
        ВызватьИсключение "Расчёт по полученным данным не подтверждён";
    КонецЕсли;
    Возврат "Пометка до: " + ДанныеДо85 + "; метка после: " + Префикс85
        + "; данные после: " + СуммаСтрокой85 + "; сумма: " + Строка(Сумма85)
        + "; доплата: " + Строка(Доплата85) + "; итого: " + Строка(Итого85);
КонецФункции
Модуль своей общей команды ОткрытьРазделениеПометкиHTML85

Своя учебная CF → Общие → Общие команды → ОткрытьРазделениеПометкиHTML85 → пустой модуль общей команды: вставить весь поддерживающий блок.

Настоящий клиентский ОбработкаКоманды с двумя потреблёнными параметрами; только открывает свою форму, не запускает DOM-опыт автоматически.

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

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

  1. Клиент очищает старый протокол, проверяет свою настоящую команду, форму и оба режима сохранения. Сервер проверяет имя собственной учебной конфигурации и фактическую версию платформы. Эти признаки маршрута не являются системой безопасности.

  2. ЧтениеHTML получает только собственную строку; ПостроительDOM.Прочитать получает настоящий объект чтения. При таком источнике справка обещает ДокументHTML. Чтение закрывается при нормальном разборе и в обработчике исключения.

  3. По id находим собственный DIV. Его настоящий список детей должен иметь фактическое число 2; только после этого читается Элемент(0). Нужен именно КомментарийHTML, принадлежащий только что разобранному документу, с полной фактической строкой DRAFT:125.

  4. РазделитьТекст получает число 6: перед числовой частью находится шесть символов DRAFT:. В удержанном комментарии по описанию остаётся префикс, метод возвращает отдельный ТекстDOM. Проверяются оба фактических типа; ТекстHTML не принимается вместо ТекстDOM.

  5. Заново читаются Данные исходного комментария и Данные непосредственно возвращённого ТекстDOM. Полные строки должны быть DRAFT: и 125. После разделения список HTML-детей и соседние HTML-узлы не используются для поиска возвращённого объекта.

  6. Функция Число преобразует реально полученную строку 125 в число. После проверки фактического типа и значения к этой сумме прибавляется учебная фиксированная доплата 75; итог 200 вычисляется, а не подставляется в вывод. Клиент получает только строку из прочитанных частей и рассчитанных чисел.

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

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

  1. Будущий нормальный ручной запуск должен показать: Пометка до: DRAFT:125; метка после: DRAFT:; данные после: 125; сумма: 125; доплата: 75; итого: 200. Это ожидаемое наблюдение, не выполненный здесь тест в 1С.

  2. В серверном отладчике до разделения проверьте настоящие ДокументHTML, СписокУзловHTML, число 2, КомментарийHTML и полную строку DRAFT:125. Убедитесь, что результат проверки принадлежности действительно имеет тип Булево и значение Истина.

  3. Сразу после вызова проверьте: РезультатРазделения85 действительно ТекстDOM. Префикс85 и СуммаСтрокой85 — две фактически прочитанные строки, а Сумма85 и Итого85 — реальные числа 125 и 200. Не подставляйте эти значения вручную и не вызывайте HTML-методы у результата.

  4. В отдельном новом экземпляре собственной учебной формы измените в коде только исходную пометку на DRAFT:126: проверка полной строки должна остановить опыт до РазделитьТекст. Другой отдельный опыт: добавьте третьего ребёнка DIV; отказ должен произойти до чтения первого узла и разделения.

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

  6. Если ваша платформа возвращает ТекстHTML, КомментарийHTML, Неопределено или иной результат вместо описанного ТекстDOM, остановитесь. Это расхождение наблюдения и справки, а не разрешение исправить объявленный тип или пометить пример успешным.

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

После будущего успешного ручного запуска протокол содержит фактические строки DRAFT: и 125, реально преобразованное число 125 и вычисленный итог 200. Это не подтверждение согласованности смешанного HTML-дерева или выполненного здесь запуска 1С.

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

  1. Нативная страница HTMLComment.SplitText объявляет ТекстDOM и говорит о добавлении нового узла родителю. Однако HTMLNodeList.Item объявляет только типы HTML-узлов без ТекстDOM. Это противоречие сохранено: здесь читаются только два документированных строковых свойства Данные непосредственно у удержанного комментария и результата разделения. Состав, корректность сериализации и дальнейшая обработка смешанного HTML-дерева после операции не проверяются и не обещаются.

  2. ДокументHTML.СоздатьКомментарий в установленной справке возвращает КомментарийDOM. Этот урок не использует такую фабрику или вымышленный конструктор КомментарийHTML: HTML-комментарий берётся из настоящего разбора своей строки и проверяется по типу.

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

  4. ТекстDOM.Данные в справке доступен на сервере, но не в обычном тонком клиенте. Разбор, разделение, чтение и преобразование числа остаются в серверной функции; через границу формы передаётся только Строка.

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

  6. Урок не обращается к браузеру, чужому HTML, файлам или данным базы. Настоящее открытие своей формы и серверный вызов выполняются платформой при будущем ручном запуске; здесь 1С, GUI и сеть не запускались. Отказ сохраняется только для этого экземпляра формы.

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

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

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

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

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