Объединить отборы: таблица ИЛИ форма

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

Фильтр union объединяет два условия по имени элемента. Получаем именно таблицу и форму вымышленного заказа.

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Используйте учебную базу платформы 8.5.1.1343 и серверную процедуру учебного общего модуля. Каждый пример выполняйте отдельно.

  2. Все данные заказа вымышлены и находятся в строке. ЧтениеHTML разбирает данные, но не является браузером: форма не отправляется, ссылки не открываются, картинки не скачиваются.

  3. Никакие файлы, адреса сайтов, токены и документы информационной базы не нужны. Не заменяйте учебную строку произвольным внешним HTML без отдельной проверки безопасности.

  4. Индексы коллекций начинаются с нуля. Перед обращением к найденному узлу проверяйте Неопределено; перед специальными свойствами элемента проверяйте его тип.

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-документ";
КонецЕсли;
Фильтр = "{""type"":""union"",""value"":[{""type"":""elementname"",""value"":{""value"":""table"",""operation"":""equals""}},{""type"":""elementname"",""value"":{""value"":""form"",""operation"":""equals""}}]}";
Найденные = Документ.НайтиПоФильтру(Фильтр);
Сообщить(Найденные.Количество() = 2);
Имена = Новый Соответствие;
Для Каждого Узел Из Найденные Цикл
    Имена.Вставить(НРег(Узел.ИмяУзла), Истина);
КонецЦикла;
Сообщить(Имена.Получить("table") = Истина);
Сообщить(Имена.Получить("form") = Истина);

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

  1. Каждое вложенное условие — самостоятельный elementname-фильтр.

  2. union означает ИЛИ: один узел не обязан быть одновременно table и form.

  3. Не полагаемся на порядок массива, проверяем множество фактических имён.

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

  1. Три проверки Истина: два результата, наличие table и form.

  2. Для самостоятельной проверки замените union на intersection: узел с двумя разными именами найтись не должен.

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

Показана логика объединённого отбора на настоящих собственных элементах.

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

  1. Массив результатов не обещает порядок ключей Соответствия.

  2. Не смешивайте поле JSON value со специальным Значение input.

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

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

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

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

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