Project

Profile

Help

HostedRedmine.com has moved to the Planio platform. All logins and passwords remained the same. All users will be able to login and use Redmine just as before. Read more...

Bug #977092

open

8.3.23 Очень долгий обход поддерева (//) в методе ДокументDOM.ВычислитьВыражениеXPath

Added by Сергей Старых 4 months ago. Updated 4 months ago.

Status:
New
Priority:
Normal
Assignee:
-
Category:
-
Sprint/Milestone:
-
Start date:
Due date:
% Done:

0%

Estimated time:

Description

https://partners.v8.1c.ru/forum/t/2163988/m/2163988
https://forum.mista.ru/topic/891023
Конфигурация ПО

8.3.23

Проблема

Очень долгий обход поддерева (//) в методе ДокументDOM.ВычислитьВыражениеXPath

Воспроизведение

Открыть приложенную внешнюю обработку в управляемом клиентском приложении любой базы и нажать кнопку "Команда1". При этом выполнится код
Текст = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Текст").ПолучитьТекст();
ЧтениеXML = Новый ЧтениеXML;
ПараметрыЧтения = Новый ПараметрыЧтенияXML();
ЧтениеXML.УстановитьСтроку(Текст, ПараметрыЧтения);
ПостроительDOM = Новый ПостроительDOM;
ДокументДом = ПостроительDOM.Прочитать(ЧтениеXML);
Разыменователь = Новый РазыменовательПространствИменDOM(Новый Соответствие);
Выражение = "/e/e1/e//d[starts-with(text(),'111')]/text()";
Начало = ТекущаяДата();
ДокументДом.ВычислитьВыражениеXPath(Выражение, ДокументДом, Разыменователь);
Сообщить("Длительность = " + (ТекущаяДата()-Начало));

И через некоторое время будет выведено сообщение

Длительность = 30

означающее что вычисление выражения XPath выполнилось за внушительные 30 секунд. Длительность будет отличаться на разных компьютерах.

А ожидалась длительность менее секунды. Обоснование далее.

Способ обхода

Вместо фрагмента "//" сделать цикл поисков по каждой конкретной глубине в дереве. В таком случае поиск выполняется в сотни раз быстрее!
Для Счетчик = 0 По 10 Цикл
Выражение = "/e/e1/e/" + ШаблонУровня + "d[starts-with(text(), '111')]/text()";
Разыменователь = Новый РазыменовательПространствИменDOM(Новый Соответствие);
НаборУзлов = ДокументДом.ВычислитьВыражениеXPath(Выражение, ДокументДом, Разыменователь);
Пока Истина Цикл
Узел = НаборУзлов.ПолучитьСледующий();
Если Узел = Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ШаблонУровня = ШаблонУровня + "*/";
КонецЦикла;


Files

ОтважныйБобр.epf (215 KB) ОтважныйБобр.epf Сергей Старых, 2023-12-14 08:42 PM
Actions #1

Updated by Сергей Старых 4 months ago

  • Description updated (diff)

Also available in: Atom PDF