Появилась задача разбора HTML текста внутри модуля 1С.
Попытался сделать посредством встроенных функций — получилось очень медленно. Функция СРЕД() в общем съедала до 90% времени, при том, что обработка одной страницы могла идти около минуты.
Задача была решена путем использования стандартной Windows библиотеки RegExp, которая очень быстро обрабатывает текст.
Данная библиотека доступна начиная c Windows 98
Информацию по тому, как составить регулярные выражения можно найти в викиучебнике (Ссылка)
Инструмент = "ABBN"; СерверИсточник = "www.kase.kz"; Адрес = "/ru/news/issuer/"+Инструмент+"/"; ИмяФайла = КаталогВременныхФайлов()+"KASENEws.html"; HTTP = Новый HTTPСоединение(СерверИсточник); HTTP.Получить(Адрес,ИмяФайла); Сообщить(ИмяФайла); АдресНовости = ""; ЧтениеТекста = Новый ЧтениеТекста; ЧтениеТекста.Открыть(ИмяФайла,КодировкаТекста.UTF8); Текст = ЧтениеТекста.Прочитать(); RegExp = Новый COMОбъект("VBScript.RegExp"); RegExp.IgnoreCase = True; RegExp.Global = True; RegExp.MultiLine = True; //Найти все теги, в нутри которых есть атрибут со значением "news" RegExp.Pattern = "<[^>]*\""news\"">"; Matches=RegExp.Execute(Текст); ЧислоВхождений = Matches.Count(); Если ЧислоВхождений > 0 Тогда МассивСтрок = Новый Массив; Для К = 0 ПО ЧислоВхождений-1 Цикл Match = Matches.Item(К); МассивСтрок.Добавить(Match.Value); КонецЦикла; КонецЕсли; МИд = Новый Массив; //Вытащить все числа из строки RegExp.Pattern = "[0-9]*"; Для К = 1 ПО МассивСтрок.Количество()-1 Цикл Matches = RegExp.Execute(МассивСтрок[К]); Коунт = Matches.count(); Для Т = 0 По Коунт-1 Цикл Match = Matches.item(Т); Ид = Match.value; Если Ид <> "" Тогда МИд.Добавить(Ид); КонецЕсли; КонецЦикла; КонецЦикла; Для К = 0 ПО МИд.Количество()-1 Цикл АдресНовости = "/news/show/"+МИд[К]; ИмяФайлаНовости = КаталогВременныхФайлов()+МИд[К]+".txt"; Состояние("Получение "+АдресНовости); HTTP.Получить(АдресНовости,ИмяФайлаНовости); Сообщить(ИмяФайлаНовости); КонецЦикла;