Итак нам надо загрузить html-страницы с сайта. В качестве исходных данных имеем текстовый файл с ссылками на страницы, необходимо загрузить эти страницы в элементы справочника 1с конфигурации. Во время загрузки надо предусмотреть сохранение картинок в конфигурации 1с, а не опираться на их доступность на сайте-источнике.
Для хранения html-страниц в конфигурации был выбран объект встроенного языка ФорматированныйДокумент. В конфигурации находится справочник «Элементы» с реквизитом «Описание» (тип ХранилищеЗначения), в котором будет храниться форматированный документ.
Пользователю в форме списка справочника доступна кнопка загрузки страниц. По данной кнопке происходит передача текстового файла с ссылками на сервер и отдается управление в общий модуль ОбменССайтомСервер. Каждая строка текстового файла воспринимается как ссылка. Чтение текстового файла можно посмотреть в функции ЗагрузитьОбъектыИзСсылокФайла().
Хочу остановиться подробнее на самом алгоритме загрузки html-страницы. Саму загрузку по ссылке производит функция ЗагрузитьССайта, которая возвращает форматированный документ. Для того чтобы сформировать форматированный документ используется метод УстановитьHTML. Для вызова этого метода нам необходимо наличие текстовой строки, которая содержит HTML и структуру вложений. В структуре вложений ключ структуры это название картинки, а в значении хранится сама картинка.
Для загрузки страницы используем HTTPСоединение и его метод Получить(). После загрузки html-страницы во временный файл происходит чтение его как текста и обход строки в цикле для поиска наличия картинок на странице. Наличие картинки определяется вхождением текста «<img». По вхождению в строку значения «src=» определяется адрес расположения картинки по значению, которое храниться в переменной РасположениеФайла . После определения адреса картинки с помощью HTTPСоединение происходит его скачивание во временный файл. После получения картинки происходит подмена в исходном html-коде источника картинки на значения типа «image1», «image2», которые хранятся в нашей структуре вложений. В конце обхода html кода мы готовы к формированию форматированного документа.
Код получения форматированного документа:
Функция ЗагрузитьССайта(СсылкаНаСайт,КешКартинок) Экспорт СтруктураАдреса = РазобратьАдресСайта(СсылкаНаСайт); АдресСайта = СтруктураАдреса.HTTPСервер; ПутьНаСайте = СтруктураАдреса.HTTPАдресСкрипта; ПроксиСервер = Неопределено; //Грузим сам ХТМЛ ИмяВременногоФайла = ПолучитьИмяВременногоФайла("html"); HTTPСервис = Новый HTTPСоединение(АдресСайта,,,,ПроксиСервер,Ложь); ПравильностьВыполнения = Истина; Попытка HTTPСервис.Получить(ПутьНаСайте, ИмяВременногоФайла); Исключение Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное); ПравильностьВыполнения = Ложь; Возврат Неопределено; КонецПопытки; //Разбор ХТМЛ ЧтениеХТМЛ = Новый ЧтениеТекста; ЧтениеХТМЛ.Открыть(ИмяВременногоФайла, КодировкаТекста.UTF8); НашаСтрока = ЧтениеХТМЛ.Прочитать(); ТекстХТМЛ = НашаСтрока; ФорматированныйДокумент = Новый ФорматированныйДокумент; СтруктураВложений = Новый Структура; //Парсим картинки Сч = 0; НомерФайла = 0; РазборКартинки = Ложь; Пока Сч <= СтрДлина(НашаСтрока) Цикл Если НРег(Сред(НашаСтрока,Сч,4)) = "<img" Тогда РазборКартинки = Истина; //Началась картинка Пока Сч <= СтрДлина(НашаСтрока) И РазборКартинки Цикл Если НРег(Сред(НашаСтрока,Сч,5)) = "src=""" Тогда //Сразу перескакиваем к адресу Сч = Сч + 5; РасположениеФайла = ""; ТекСимвол = Сред(НашаСтрока,Сч,1); Пока ТекСимвол <> """" Цикл РасположениеФайла = РасположениеФайла + ТекСимвол; Сч = Сч + 1; ТекСимвол = Сред(НашаСтрока,Сч,1); КонецЦикла; //Загрузка файла НомерФайла = НомерФайла + 1; Если КешКартинок.Получить(РасположениеФайла) = Неопределено Тогда ИмяВременногоФайла = ПолучитьИмяВременногоФайла(""); СтруктураАдреса = РазобратьАдресСайта(РасположениеФайла); АдресСайта = СтруктураАдреса.HTTPСервер; ПутьНаСайте = СтруктураАдреса.HTTPАдресСкрипта; HTTPСервис = Новый HTTPСоединение(АдресСайта,,,,ПроксиСервер,Ложь); Попытка HTTPСервис.Получить(ПутьНаСайте, ИмяВременногоФайла); Исключение Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное); ПравильностьВыполнения = Ложь; Возврат Неопределено; КонецПопытки; НоваяКартинка = Новый Картинка(ИмяВременногоФайла); КешКартинок.Вставить(РасположениеФайла, НоваяКартинка); Иначе НоваяКартинка = КешКартинок.Получить(РасположениеФайла); КонецЕсли; //Подмена в хтмл картинок на другой сорс ИмяНовогоФайла = "image" + Формат(НомерФайла, "ЧЦ=3; ЧВН="); ТекстХТМЛ = СтрЗаменить(ТекстХТМЛ,РасположениеФайла, ИмяНовогоФайла); СтруктураВложений.Вставить(ИмяНовогоФайла, НоваяКартинка); РазборКартинки = Ложь; КонецЕсли; Сч = Сч + 1; КонецЦикла; КонецЕсли; Сч = Сч + 1; КонецЦикла; ФорматированныйДокумент.УстановитьHTML(ТекстХТМЛ,СтруктураВложений); Возврат ФорматированныйДокумент; КонецФункции
Конфигурацию, демонстрирующую решение данной задачи можно скачать
html_to_1C.cf (17,0 KiB, 5 989 скачиваний)
.
Если будут предложения по оптимизации кода обхода html-кода пишите в комментарии.
UPD: Добавлено приведение строки в нижний регистр. При загрузке страницы используется кеш картинок, параметр КешКартинок имеет тип соответствие и дополняется во время разбора ссылки в случае необходимости. Спасибо Александру за дельные советы в комментариях.
Похожие записи:
-
Александр Кунташов
-
Андрей Данилюк
-
Андрей Данилюк
-
-
VitaliyTokarev
-
Андрей Данилюк
-
-
Александр Крынецкий
-
Андрей Данилюк
-
-
Mihail Chichagov
-
Андрей Данилюк
-