1с прочитать html файл
Итак нам надо загрузить html-страницы с сайта. В качестве исходных данных имеем текстовый файл с ссылками на страницы, необходимо загрузить эти страницы в элементы справочника 1с конфигурации. Во время загрузки надо предусмотреть сохранение картинок в конфигурации 1с, а не опираться на их доступность на сайте-источнике.
Для хранения html-страниц в конфигурации был выбран объект встроенного языка ФорматированныйДокумент. В конфигурации находится справочник «Элементы» с реквизитом «Описание» (тип ХранилищеЗначения), в котором будет храниться форматированный документ.
Пользователю в форме списка справочника доступна кнопка загрузки страниц. По данной кнопке происходит передача текстового файла с ссылками на сервер и отдается управление в общий модуль ОбменССайтомСервер. Каждая строка текстового файла воспринимается как ссылка. Чтение текстового файла можно посмотреть в функции ЗагрузитьОбъектыИзСсылокФайла().
Хочу остановиться подробнее на самом алгоритме загрузки html-страницы. Саму загрузку по ссылке производит функция ЗагрузитьССайта, которая возвращает форматированный документ. Для того чтобы сформировать форматированный документ используется метод УстановитьHTML. Для вызова этого метода нам необходимо наличие текстовой строки, которая содержит HTML и структуру вложений. В структуре вложений ключ структуры это название картинки, а в значении хранится сама картинка.
Код получения форматированного документа:
Конфигурацию, демонстрирующую решение данной задачи можно скачать
html_to_1C.cf (17,0 KiB, 6 392 скачиваний)
Если будут предложения по оптимизации кода обхода html-кода пишите в комментарии.
UPD: Добавлено приведение строки в нижний регистр. При загрузке страницы используется кеш картинок, параметр КешКартинок имеет тип соответствие и дополняется во время разбора ссылки в случае необходимости. Спасибо Александру за дельные советы в комментариях.
1. Забыли учесть то, что теги могут быть написаны как в нижнем регистре, так и в ВЕРХНЕМ (проверки для поиска тэга img и атрибута src).
2. Обычно отдельные элементы дизайна страниц одного и того же сайта повторяются, соответственно, повысить эффективность скачивания нескольких страниц одного и того же сайта подряд можно добавив кэширование картинок в соответствии, в котором ключем будет URL картинки, а значением — путь к временному файлу скачанной картинки.
Александр, спасибо большое за указание на неточности. По первому пункту надо добавить использование ВРег() в условиях.
Кеширование картинок во время скачивания сделать в соответствии так же реально, так как сервер файл отрабатывает за один вызов и не надо будет думать про сохранение переменной на сервере между вызовами клиента.
Спасибо.
Обновил пост. Спасибо.
На своих данных с такой ситуацией не сталкивался. Интересный момент. Спасибо за дополнение
Для того, чтобы брать информацию со страницы, нам надо изучить ее. Посмотрев исходный код страницы, можно выделить следующие фрагменты:
Теперь необходимо разобраться, как получать информацию о самих участниках. Опять же глянем исходный код страницы:
В таблице каждая строка представлена 4 ячейками:
- Ячейка с классом regional_tour_fio. В данной ячейке размещается фамилия, имя и отчество участника
- Ячейка с классом regional_tour__nomination_td. В данной ячейке размещается элемент span, класс которого зависит от номинации, в которой участ вовал пользователь. Таких номинаций три:
- Бухгалтерский учет и налогообложение (класс nomination b)
- Кадровый учет и трудовое право (класс nomination k)
- Платформа 1С:Предприятие 8 – разработка и администрирование (класс nomination it)
- Ячейка с классом text-center. В данной ячейке размещается количество баллов, набранных за отборочный тур. Также здесь можно увидеть атрибут title, в котором хранится калькуляция баллов. Например "Тест: 84, акция Вконтакте: 15, акция от партнера: 15". Здесь хотелось бы отметить, что обязательно указывается только "Тест", остальные значения могут не указываться, если участник не принимал участия в акциях партнера или проводимых Вконтакте.
- Ячейка без опозновательных знаков :) В ней находится номер сертификата Профессионал 1С:ИТС. Ее будем определять как ячейку без атрибута class.
Создание справочников
Создадим пустую конфигурацию и добавим справочники Участники и Партнеры. На рисунке ниже показаны реквизиты справочников
В справочнике Участники реквизиты Фамилия, Имя, Отчество, Сертификат имеют тип Строка, БаллыЗаТест, БаллыВК, БаллыПартнер, ОбщиеБаллы имеют тип число и реквизит Партнер имеет тип СправочникСсылка.Партнеры. В справочнике Партнеры все реквизиты имеют тип строка.
Теперь создадим общую форму, с помощью которой будем обновлять информацию в справочниках. В данной форме создадим две команды: ОбновитьИнформацию и ЗакрытьФорму.
Разбор адреса
Начнем писать код в модуле этой формы. Для удобства работы напишем сперва функцию СтруктураАдреса, которая будет разбирать наш адрес по частям и возвращать структуру. Согласно RFC1738, адрес страницы строится следующим образом:
Получение DOM-объектов с веб-страницы
Получение и обработка данных из DOM-объектов
Чтобы получить необходимую информацию, нам необходимо загрузить страницу, где она расположена. Но у нас таких страниц несколько, и для этого нам необходимо обработать элементы списка партнеров. Чтобы получить список партнеров и адреса страниц, нам надо просмотреть все элементы option и получить значение атрибута value, из которого получим адреса страниц и сам текст этого элемента. Поиск элемента в объектах DOM будем осуществлять с помощью метода построителя DOM - ПолучитьЭлементыПоИмени(). В результате работы этого метода мы получим переменную с типом СписокЭлементовDOM(), в котором будут содержаться все элементы option и его содержимое. Для получения атрибута используем метод ПолучитьАтрибут(), а для получения содержимого элемента используем метод ТекстовоеСодержимое() Получить. Эти данные мы сохраним в структуре Партнер("Город", "НомерНаСайте", "Партнер"), которую в свою очередь добавим в массив. Вот тут у меня вопрос к читателям: как лучше сделать - передавать по одной структуре на сервер и там сохранять в справочнике или собрать все структуры в массив и передать массив на сервер? Я попробовал оба варианта, и по мне лучше второй. Далее мы подгружаем все страницы с информацией о участниках поочередно. Для получения информации об участниках необходимо найти таблицу без шапки (элемент tbody) и в нем получить все строки (элемент tr). После этого просматриваем все ячейки строки (элемент td) на соответствие атрибута class одному из условий. Все условия мы с вами рассмотрели ранее. Когда получаем элементы ячеек, нам необходимо выполнить некоторую обработку:
- В ячейке "Номинация" необходимо найти элемент span и на основании атрибута class данного элемента получить номинацию;
- Разобрать атрибут title в ячейке с количеством баллов, чтобы получить отдельно баллы за тест, за акцию ВК и баллы от партнеров.
Все полученные данные сохраняем в структуру Участник("ФИО", "Номинация", "БаллыТест", "БаллыВК", "БаллыПарт", "ОбщиеБаллы", "Сертификат", "Партнер"). Как и в случае с партнерами, данную структуру добавляем в массив. Полученные массивы отправляем на сервер для сохранения. В итоге функция получилась следующая:
Сохранение данных в справочниках
Для сохранения данных в справочниках мы создадим функции ОбновитьУчастников(МассивУчастников) и ОбновитьПартнеров(МассивПартнеров):
Осталось только сделать приятные мелочи по оформлению, но каждый делает на свой вкус и цвет. Я вывел форму списка справочника Участники единственной на рабочую облать начальной страницы, и вместо вывода номера сертификата я применил условное форматирование (строка выделяется цветом, если человек получил сертификат). В итоге получилось следующее:
Один мой хороший клиент использует встроенный в 1С почтовый клиент.
До этого все работало хорошо, но недавно из-за установки нового банк-клиента на компьютере обновили Internet Explorer до 11 версии - стала появляться ошибка:
Поле объекта не обнаружено innerText
Пришлось немного доработать типовую функцию получения текста из html:
еще функции пример получения:
Похожие FAQ
10060 (0x0000274C): Попытка установить соединение была безуспешной 19
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1С Предприятие что это? 12
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D: ВашаБаза 1с77 " ; Пользователь= Cклонения по падежам 6
НаКлиенте Процедура Команда1(Команда) ФИО = " Иванов Иван Иванович" ; Падеж = 2; Пол = 1; Результат = СклонениеФИО(ФИО, Падеж, пол); Сообщить(Результат); КонецПроцедуры НаСервере Функция СклонениеФИО(ФИО, Падеж, пол) Результат = " " ; Посмотреть все результаты поиска похожих
Еще в этой же категории
Прошу отнестись с понимаем, раньше писал неплохо, но 3 года вне игры. последнее что видел 8.2.
А в 8.3 я даже полеHTMLдокумента не пойму куда вставить.
Искал по разным форумам, но для 8.3 примеров что-то совсем мало.
В двух словах задача, на HTML странице выкладывают регулярно обновляемые несколько строк текста.
Мне бы их считать и Записать в таблицу значений, я даже считать не могу html.
Вопрос как подключится по вебадресу и считать.
Спасибо!
Отпишусь как что-то получится.
А как теперь поле формы называется куда это можно визуально вывести?
Как на форму вставить поле в которое можно ввести html страницу?
В 8.2 это было полеHTMLдокумента. кажется.
Что-то я совсем туплю.
Кладем на страницу "СамСайт" ПолеHTMLДокумента и обзываем его к примеру "Сайт".
Вот как это в 8.3 реализуется?
Ужас, стыдно, но честно не понимаю.
Вот такое написал.
Но в поле Сайт ничего не появляется. Что может быть не так?
7. Проверяем работу нашей обработки. У меня появился сайт связного. А у Вас?
А у меня вот ничего не появляется..
Код теперь вот так вот выглядит. СайтДокументаСформирован() не запускается.
(0) Обновляемые строки текста в каком-то контейнере находятся (div, например)? ID у контейнера есть? Пример нужен, одним словом.
Вот этот синтаксис же не совсем точен? В модуле формы нельзя с таким синтаксисом обратится к "ЭлементыФормы"?
(14) ты реально из Манилы?
в (13) работающий код
Я горе фринлансер, когда-то перешел с 1С на свои проекты по вебмастерингу.
Это нечто. Я первый в жизни себя таким ослом ощущаю.
Сделал все до запятой как в (13).
Обход элементов не начинается.
1С в локале стоит, файловая БД.
Ну что еще может быть не так. Реквизиты те же.
Отладчик выдает вот тут выдает нули
(17) скорее всего у тебя обработчики не ассоциированы с процедурами обработки - в свойствах формы глянь - события
и прощелкай мышью чтобы связать код с обработчиками
Ассоциированы.
ПриОткрытииии срабатывает по отладчкиу да и остальное тоже.
Все таки, как выглядит оператор перехода на сайт.
я скопировал 13-е дословно.
прошел отладчиком все процедуры.
сайт не открывается обход не начинается.
на обходе сразу уходит в конец цикла, визуально сайта тоже нет.
Ошибок нет, но обхода боди.алл тоже нет, там пусто.
но ошибка не выскакивает.
это вот что отладчик пишет.
(24) у элемента формы "Сайт" в свойствах что написано?
путь к данным?
Вид элемента?
Сайт = "----" явно не указала на это.
Реквизит1 Строка неогр длины
Переименовал, ничего не изменилось.
Я правильно понимаю, что Сайт, это реквизит формы, а не самой внешней обработки?
Ты гений. Спасибо.
вообще ничего открыть не могу.
пусто.
чувствую не по зубьям задачка, но надо бы как то сделать.
(39) У тебя тут JSON. В 8.3.6 он уже реализован на уровне платформы, читай его стандартными методами.
(40) Ты можешь показать страницу, с которой тебе надо выдернуть данные, и сказать, какие именно данные нужно выдернуть?
(40) выше была ссылка.
(39) разработчик утверждал что тут должен быть ХМЛ вообще-то ). он с 8.3.6? Я что такое Json только слышал )
эта страница результат сводного очень объемного парсинга с 10ка сайтов, на которых вживую идет спортивная статистика.
стоит задача собирать эту инфу и потом анализировать.
Так как я когда-то неплохо знал УПП и писал море отчетов, то взялся это делать.
Но много конечно сложностей.
Вечером когда футбола будет больше там будет до 40 50 строк одновременно.
(44) JSON суть тот же XML - структурированный набор данных. Просто он легче XMLя, поэтому используется более широко при обмене данными в интернете.
44, да с ним еще хуже, питон знаю только кроме 1С и тоже слабо.
Я брался задачу по формам отчетов делать.
Запись этой инфы в регистры рассматривал как подзадачу не очееь серьезную и н4 слишком объемную.
Ошибся сильно.
Визуальное отражение страницы требование заказчика, в лбом случае. Так что по хорошему чтобы два раза не читать одно и то же, использовать бы лучше уже полученное.
Интересно насколько эта ерунда будет лагать, чтение и запись обновлений раз в 30 секунд.
(54) А зачем ему отображать JSON?
Но задача растет, так как программист который до этого парсил, родил (на ладно ладно, родила) и ей не до того, то надо теперь запарсить вот это.
У нас там живет DIV
Пока жена собирается, я там обнаружил фрейм:
Полагаю, твой div находится в документе, размещенном внутри фрейма, поэтому ты его перебором и не находишь.
А. Дублер
Б. По второй ссылке инфы больше.
Распарсить не обязательно средствами 1С, можно чем угодно и писать например в текстовый файл. Ну вы поняли.
Админам. Извините, если предложение мое тут неуместно. Но честно очень надо.
а вот верхняя из списка. Понятно что ссылки эти все время обновляются.
Рассмотрим один из видов парсинга html файлов при помощи регулярных выражений.
Регулярные выражения – это формальный язык поиска и осуществления манипуляций с подстроками в тексте.
Платформа 1С использует стандартные компоненты регулярных выражений Visual Basic, которые подключаются как COM объект (VBScript.RegExp).
Основные свойства объекта RegExp:
Global - Определяет продолжительность поиска (False – до первого совпадения, True – по всему тексту, значение по умолчанию: False)
IgnoreCase - Определяет чувствительность к регистру символов (False – учитывать регистр, True – не учитывать регистр, значение по умолчанию: False)
Multiline - Определяет структуру объекта (False – однострочный, True – многострочный , значение по умолчнанию: False)
Pattern - Строка, используемая как шаблон. Именно при помощи Pattern мы задаем маску для искомых фрагментов текста.
Таблица основных специальных символов (метасимволов) для создания шаблона:
Данный шаблон будет искать все заголовки 2го уровня, т.е. любой текст заключенный в html тэги h2> и h2>.
А данный шаблон просто ищет все что помещено в какие-либо html тэги.
Execute() - Возвращает коллекцию найденных по шаблону подстрок
Replace() - Возвращает строку, в которой найденные по шаблону вхождения в исходной строке заменены на указанную подстроку
Test() - Возвращает булево значение как результат проверки соответствия строки шаблону
Рассмотрим живой пример.
Прочитаем файл test.html и выведем из него все заголовки 2го уровня.
На 1С данный код будет выглядеть следующим образом:
Рассмотрим подробнее, что мы сделали. После того как мы указали путь к файлу, мы считываем его построчно. Проходим циклом все строки и записываем каждую в массив (МассивСтрок).
Затем подключаем COM объект VBScript.RegExp, задаем свойства и идем уже по массиву строк, ищем совпадения по шаблону 1 и в случае нахождения совпадения – удаляем html тэги по шаблону 2.
Читайте также: