1С: Получить таблицы из Html
Задача: в неком html файле содержится несколько таблиц. Необходимо их распарсить и обработать силами 1С
Решение: воспользуемся построителем DOM. Результатом работы функции будет массив таблиц html документа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
&НаСервере Функция УбратьНеОбрабатываемыеСимволы(стр) стр=стрзаменить(стр," ","_"); стр=стрзаменить(стр,"№","N"); стр=стрзаменить(стр,"-","_"); стр=стрзаменить(стр,".","_"); стр=стрзаменить(стр,",","_"); стр=стрзаменить(стр,"/","_"); возврат стр; конецфункции &НаСервере Функция ПреобразоватьФайлHtmlВМассивТаблиц(АдресХранилищаФайла) ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилищаФайла); ИмяВременногоФайлаСпр = ПолучитьИмяВременногоФайла("html"); ДвоичныеДанные.Записать(ИмяВременногоФайлаСпр); ЧтениеHTML = Новый ЧтениеHTML; ЧтениеHTML.ОткрытьФайл(ИмяВременногоФайлаСпр, "UTF-8"); ПостроительDOM = Новый ПостроительDOM; ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML); ЭлементыТаблицы = ДокументHTML.ПолучитьЭлементыПоИмени("table"); МассивТаблиц=Новый Массив(); для каждого таблица из ЭлементыТаблицы цикл ТЗ=Новый ТаблицаЗначений(); строкиТаблицы=таблица.ПолучитьЭлементыПоИмени("tr"); ПрочитаноСтрок=0; для каждого строкаТаблицы из строкиТаблицы цикл колонки=строкаТаблицы.ПолучитьЭлементыПоИмени("td"); ПрочитаноКолонок=0; для каждого колонка из колонки цикл если ПрочитаноСтрок=0 тогда ТЗ.Колонки.Добавить(УбратьНеОбрабатываемыеСимволы(колонка.ТекстовоеСодержимое)); иначе если ПрочитаноКолонок=0 тогда нс=ТЗ.Добавить() конецесли; нс[ПрочитаноКолонок]=колонка.ТекстовоеСодержимое; конецесли; ПрочитаноКолонок=ПрочитаноКолонок+1; конеццикла; ПрочитаноСтрок=ПрочитаноСтрок+1; конеццикла; МассивТаблиц.Добавить(ТЗ); конеццикла; ЧтениеHTML.Закрыть(); конецфункции &НаКлиенте Процедура ЗагрузитьФайл(Команда) Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.ПолноеИмяФайла = ""; Фильтр = НСтр("ru = 'Текст'; en = 'Text'")+ "(*.xls)|*.xlsx"; ДиалогОткрытияФайла.Фильтр = Фильтр; ДиалогОткрытияФайла.МножественныйВыбор = ложь; ДиалогОткрытияФайла.Заголовок = "Выберите файлы"; Если ДиалогОткрытияФайла.Выбрать() Тогда МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; ФайлСМС=""; Для Каждого ИмяФайла Из МассивФайлов Цикл ФайлСМС=ИмяФайла; конеццикла; если ФайлСМС<>"" тогда АдресХранилищаФайла = ""; Состояние("Перемещаю файл на сервер"); ПоместитьФайл(АдресХранилищаФайла, ФайлСМС, , Ложь, ЭтаФорма.УникальныйИдентификатор); Состояние("Обрабатывается файл "+ФайлСМС); таблицы=ПреобразоватьФайлHtmlВМассивТаблиц(АдресХранилищаФайла); иначе сообщить("Файл не выбран"); конецесли; конецесли; КонецПроцедуры |
Большое человеческое спасибо! Сэкономлена куча времени и сил.