|
УТ11: HTML to TXT | ☑ | ||
---|---|---|---|---|
0
Mikhail Volkov
01.05.17
✎
15:56
|
В справочнике номенклатуры обычно несколько присоединенных файлов, среди них HTML-файлы, в которых есть описание номенклатуры. Клиент высказал пожелание, если реквизит "Текстовое описание" не заполнен, то чтобы оно заполнялось из HTML-файла. 1С преобразовать HTML-файл в текст может?
|
|||
1
Mikhail Volkov
01.05.17
✎
16:19
|
Была тема v8: Конвертация содержимого HTML в текст, сразу скажу: таблицы мне не нужны, только типа:
Бинокль пластик, ЧИНГИСХАН, 8х21, 101м/1000м, AXT1502 Увеличение: 8х Диаметр линзы: 21мм Длина: 9см В комплекте чехол с салфеткой Желательно пустые строки убрать. |
|||
2
Неверный Параметр И
01.05.17
✎
16:55
|
И? В той теме есть даже пример кода. Тебя научить убирать пустые строки?
|
|||
3
PiotrLoginov
01.05.17
✎
17:09
|
(0) "если реквизит "Текстовое описание" не заполнен, то чтобы оно заполнялось из HTML-файла"
Заполнялось где? На сайте наверное? В этом случае, зачем что-то преобразовывать? Читаем текст из файла и отправляем его в "Описание" таким, какой он есть. Сайт, по идее, благодаря тегам оформит текст в лучшем виде. Содержимое присоединенных файлов хранится в виде хранилища значения в конкретном реквизите. Значит, можно при выполнении некоторых условий присваивать свойству "Описание" это хранилище значений. А дальше перед выгрузкой: Если ТипЗнч(ТекСтрока.НоменклатураОписание) = Тип("ХранилищеЗначения") Тогда ТекСтрока.НоменклатураОписание = ТекСтрока.НоменклатураОписание.Получить(); КонецЕсли; |
|||
4
Mikhail Volkov
01.05.17
✎
18:44
|
(2) В самом тексте может сам смогу. Нужно получить текст из HTML-файла.
(3) Нет, в реквизите номенклатуры Описание (Текстовое описание) - тип Строка 1024. |
|||
5
Остап Сулейманович
01.05.17
✎
18:53
|
(4) Так HTML и есть текст. Только с тегами. Найти между них нужный и всего делов.
Выложи его сюда. |
|||
6
Mikhail Volkov
01.05.17
✎
19:26
|
(5) Пример содержимого в (2). Пытаюсь извлечь текст из файла:
Функция ОписаниеИзHTMLФайла(Номенклатура) Экспорт Запрос = Новый Запрос(" |ВЫБРАТЬ | НоменклатураПрисоединенныеФайлы.ПутьКФайлу |ИЗ | Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы |ГДЕ | НоменклатураПрисоединенныеФайлы.ВладелецФайла = &Номенклатура | И НоменклатураПрисоединенныеФайлы.Расширение = &Расширение"); Запрос.УстановитьПараметр("Номенклатура", Номенклатура); Запрос.УстановитьПараметр("Расширение", Нрег("HTML")); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ОписаниеИзHTML = Новый ИзвлечениеТекста(Выборка.ПутьКФайлу); Если Не ПустаяСтрока(ОписаниеИзHTML.ПолучитьТекст()) Тогда Возврат ОписаниеИзHTML.ПолучитьТекст(); КонецЕсли; КонецЦикла; Возврат ""; КонецФункции ПутьКФайлу - не полный, не находит ничего!? |
|||
7
Неверный Параметр И
01.05.17
✎
21:52
|
(6) У тебя файлы в томах хранятся?
|
|||
8
Mikhail Volkov
02.05.17
✎
03:01
|
(7) Вроде так.
|
|||
9
Mikhail Volkov
02.05.17
✎
07:24
|
(7) Да, именно так, пока не смог найти откуда извлекать полное имя файла. Добавляю путь каталога картинок к ПутьКФайлу.
Но тут другая проблема, в форматировании текста. Например, содержимое файла: <P>Бинокль Sakura 20х40</P> <P> <TABLE> <TBODY> <TR> <TD colSpan=2> <H4>Технические характеристики</H4></TD></TR> <TR> <TD>Увеличение</TD> <TD>х20</TD></TR> <TR> <TD>Диаметр линзы</TD> <TD>50мм</TD></TR> <TR> <TD>Влагозащитный</TD> <TD>да</TD></TR> <TR> <TD>Обрезиненный корпус</TD> <TD>да</TD></TR> <TR> <TD>В комплекте</TD> <TD>чехол и салфетка</TD></TR></TBODY></TABLE></P> в IE выглядит: Бинокль Sakura 20х40 Технические характеристики Увеличение х20 Диаметр линзы 50мм Влагозащитный да Обрезиненный корпус да В комплекте чехол и салфетка А у меня в УТ11: Бинокль Sakura 20х40 Технические характеристики Увеличение х20 Диаметр линзы 50мм Влагозащитный да Обрезиненный корпус да В комплекте чехол и салфетка Ужас! Мне бы только саму таблицу без заголовков. Есть что-то готовое? Или 1С по другому извлекать имеет? |
|||
10
Mikhail Volkov
02.05.17
✎
11:49
|
Хотя бы подскажите где в УТ11 каталог для "Присоединенные файлы (Номенклатура)" найти, в каких настройках?
|
|||
11
Вафель
02.05.17
✎
11:54
|
есть такой объект ИзвлечениеТекста
|
|||
12
Fragster
гуру
02.05.17
✎
11:57
|
в присоединенных файлах есть реквизит ТекстХранилище и СтатусИзвлеченияТекста
|
|||
13
Fragster
гуру
02.05.17
✎
11:59
|
(9) все правильно
|
|||
14
Fragster
гуру
02.05.17
✎
11:59
|
(10) не надо тебе его искать, в подсистеме присоединенных файлов есть все необходимые функции, чтобы абстрагироваться от настроек (тома, версии и т.п.)
|
|||
15
Mikhail Volkov
02.05.17
✎
12:50
|
(14) Дык, подскажи как называются эти функции?
Нарыл кое что: Функция ОписаниеИзHTMLФайла(Номенклатура) Экспорт Запрос = Новый Запрос(" |ВЫБРАТЬ | НоменклатураПрисоединенныеФайлы.Ссылка |ИЗ | Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы |ГДЕ | НоменклатураПрисоединенныеФайлы.ВладелецФайла = &Номенклатура | И НоменклатураПрисоединенныеФайлы.Расширение = &Расширение"); Запрос.УстановитьПараметр("Номенклатура", Номенклатура); Запрос.УстановитьПараметр("Расширение", Нрег("HTML")); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ТекстИзHTML = ИзвлечениеТекстаИзHTML(Выборка.Ссылка); Если Не ПустаяСтрока(ТекстИзHTML) Тогда Возврат ТекстИзHTML; КонецЕсли; КонецЦикла; Возврат ""; КонецФункции Функция ИзвлечениеТекстаИзHTML(ПрисоединенныйФайлНоменклатура) Экспорт ИзвлечениеИзHTML = Новый ИзвлечениеТекста(ПолноеИмяФайла(ПрисоединенныйФайлНоменклатура.ПутьКФайлу)); ТекстИзHTML = ИзвлечениеИзHTML.ПолучитьТекст(); Возврат ?(ПустаяСтрока(ТекстИзHTML), "", ПреобразоватьТекстИзHTMLФорматаВПростой(ТекстИзHTML)); КонецФункции Функция ПолноеИмяФайла(ПутьКФайлу) Экспорт КаталогНоменклатураПрисоединенныеФайлы = "C:\DATA\1C\data"; // пока так, надо в настойках его поискать Возврат КаталогНоменклатураПрисоединенныеФайлы + "\" + ПутьКФайлу; КонецФункции Функция ПреобразоватьТекстИзHTMLФорматаВПростой(ТекстИзHTML) Экспорт Попытка НовыйHTMLДокумент = Новый COMОбъект("HtmlFile"); НовыйHTMLДокумент.open("text/html"); НовыйHTMLДокумент.write(ТекстИзHTML); НовыйHTMLДокумент.close(); Возврат СтрЗаменить(НовыйHTMLДокумент.all.item(0).innerText, Символ(13), ""); Исключение Построитель = Новый ПостроительDOM; ЧтениеHTML = Новый ЧтениеHTML; ЧтениеHTML.УстановитьСтроку(ТекстИзHTML); ДокументHTML = Построитель.Прочитать(ЧтениеHTML); Возврат СокрЛП(ДокументHTML.Тело.ТекстовоеСодержимое); КонецПопытки; КонецФункции В одну строчку все выводит (в начале строки какой-то упр. символ): ? Бинокль Sakura 20х40 Технические характеристики Увеличение х20 Диаметр линзы 50мм Влагозащитный да Обрезиненный корпус да В комплекте чехол и салфетка Осталось перевод строк вставить, и желательно табуляции между названиями и значениями параметров. |
|||
16
Mikhail Volkov
02.05.17
✎
20:41
|
+ Думал в одну строчку выводится из-за СтрЗаменить(НовыйHTMLДокумент.all.item(0).innerText, Символ(13), ""); Но Возврат НовыйHTMLДокумент.all.item(0).innerText; дает тот же результат!? Значит в тексте нет Символ(13). Как бы оставить переводы строк?
Еще, в начале строки какой-то упр. символ, в блокноте он отображается как [] (квадратик), здесь отобразился как "?". Думал это Символ(10), но СтрЗаменить(НовыйHTMLДокумент.all.item(0).innerText, Символ(10), ""); - не помогло!? |
|||
17
Mikhail Volkov
03.05.17
✎
08:39
|
Ну, блин, что за "квадратик" в тексте, чем посмотреть?
|
|||
18
Неверный Параметр И
03.05.17
✎
08:42
|
В некоторых версиях платформы была такая ошибка - отладчик не работал и табло не запускалось. Правда ведь, у тебя такая версия?
|
|||
19
Mikhail Volkov
03.05.17
✎
22:51
|
(18) Табло не кажет, только пробел. В "Текстовое описание" так же переносится. Из него в блокнот копирую - "квадратик" вижу.
Кстати, на счет каталога для "Присоединенные файлы" - целый справочник имеется: Тома хранения файлов (Каталоги на диске для хранения файлов). |
|||
20
Mikhail Volkov
04.05.17
✎
08:06
|
Как раньше хорошо было, когда была только DOS. Столько разных редакторов было (куда делись?), все упр. символы можно было рассмотреть. Из них только 0A и 0D помню (Символ(10) и Символ(13)).
|
|||
21
Неверный Параметр И
04.05.17
✎
08:10
|
Глобальный контекст (Global context)
КодСимвола (CharCode) Синтаксис: КодСимвола(<Строка>, <НомерСимвола>) Параметры: <Строка> (обязательный) Тип: Строка. Исходная строка. <НомерСимвола> (необязательный) Тип: Число. Номер символа в строке, код которого необходимо получить. Нумерация символов в строке начинается с 1. Значение по умолчанию: 1. Возвращаемое значение: Тип: Число. Код переданного символа. Код возвращается в соответствии с кодировкой Unicode. Описание: Получает код символа, расположенного в переданной строке в позиции с указанным номером. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). |
|||
22
Неверный Параметр И
04.05.17
✎
08:14
|
Внезапно, да?
|
|||
23
Mikhail Volkov
04.05.17
✎
08:29
|
(22) И что, предлагаешь написать процедуру в 1С, что переводить символы текста в коды? Что вымерли напрочь все редакторы текста, которые это могут показать?
|
|||
24
Неверный Параметр И
04.05.17
✎
08:36
|
Ох, мьсье трындун, простите, не узнал Вас сразу.
|
|||
25
Mikhail Volkov
04.05.17
✎
08:41
|
В NC было: на одной панеле список файлов, на другой - содержимое файла (в любом виде), на котором курсор стоит. В ТС нет такого быстрого просмотра?
|
|||
26
Mikhail Volkov
05.05.17
✎
08:34
|
Смотрю текст сохраненный в блокноте WinHex, этот символ 3F. Вписал в (15):
СтрЗаменить(НовыйHTMLДокумент.all.item(0).innerText, Символ(63), ""); // 3F Но, не помогло, все равно этот "квадратик" перед текстом остался!? Кстати, когда сохраняю текст в блокноте, предупреждает, что в формате ANSI часть кода будет потеряна, предлагает в Юникоде сохранить. Сохранял, вообще хрень какая-то получилась!? Что за "квадратик", как его вычислить? |
|||
27
Mikhail Volkov
05.05.17
✎
09:44
|
И что я на этой хрени зациклился, вырезать ее, если есть:
Текст = НовыйHTMLДокумент.all.item(0).innerText; ЕстьХрень = Найти("0123456789" + ВсеБуквы(), Лев(Текст, 1)) = 0; Если ЕстьХрень Тогда Текст = Прав(Текст, СтрДлина(Текст) - 1); КонецЕсли; Мне другое надо, как оставить переносы строк, если HTML-файле есть таблица типа (9)? |
|||
28
Mikhail Volkov
12.05.17
✎
20:10
|
ИзвлечениеИзHTML = Новый ИзвлечениеТекста(ПолноеИмяФайла(ПрисоединенныйФайлНоменклатура.ПутьКФайлу));
ТекстИзHTML = ИзвлечениеИзHTML.ПолучитьТекст(); использую как критерий - можно ли из файла текст или нет. А извлекаю методами: НовыйHTMLДокумент = Новый COMОбъект("HtmlFile"); либо Построитель = Новый ПостроительDOM; Вот клиент говорит, что часто выскакивает ошибка "Ошибка извлечения текста из файла", хотя HTML-файлы вроде нормальные, с текстом. Что можно взять в качестве критерия на наличие текста в HTML-файле? |
|||
29
Mikhail Volkov
12.05.17
✎
20:12
|
* можно ли из файла текст извлечь, или нет
|
|||
30
Mikhail Volkov
13.05.17
✎
03:59
|
Как альтернативный вариант хорошо бы: ЗапуститьПриложение(ПутьФайл); и скопировать содержимое файла в буфер обмена. Возможно? Вроде нашел тему v8: Как скопировать файл в буфер обмена но не понял, возможно ли это реализовать в 1С?
|
|||
31
Mikhail Volkov
16.05.17
✎
05:31
|
В теме v8: метод "ИзвлечениеТекста" обнаружил:
Для извлечения текста из файлов используется интерфейс IFilter. Он является расширяемым. Можно установить дополнительные модули, чтобы появилась возможность извлекать текст из еще одного типа файлов. Следует использовать только в среде Windows NT 4.0, 2000, XP. Чтобы узнать, какие расширения для IFilter уже установлены на вашем компьютере, можно скачать и установить программу IFilter Explorer (http://www.citeknet.com). У клиента 2012 сервер. Может поэтому у него "Ошибка извлечения текста из файла"? |
|||
32
Mikhail Volkov
17.05.17
✎
10:25
|
У клиента без проблем работает:
ИзвлечениеИзHTML = Новый ТекстовыйДокумент; ИзвлечениеИзHTML.Прочитать(ПолноеИмяФайла(ПрисоединенныйФайлНоменклатура.ПутьКФайлу)); ТекстИзHTML = ИзвлечениеИзHTML.ПолучитьТекст(); ТекстИзHTML открывается в каком-то редакторе, пользователь копирует из него (все или нужную часть), и вставляет в "Текстовое описание". Просит это автоматизировать. Но если сразу ТекстИзHTML вставить в "Текстовое описание" (без буфера обмена, будет такая хрень: <P>Бинокль Sakura 20х40</P> <P> <TABLE> <TBODY> <TR> <TD colSpan=2> <H4>Технические характеристики</H4></TD></TR> <TR> <TD>Увеличение</TD> <TD>х20</TD></TR> <TR> <TD>Диаметр линзы</TD> <TD>50мм</TD></TR> <TR> <TD>Влагозащитный</TD> <TD>да</TD></TR> <TR> <TD>Обрезиненный корпус</TD> <TD>да</TD></TR> <TR> <TD>В комплекте</TD> <TD>чехол и салфетка</TD></TR></TBODY></TABLE></P> В теме v8: Как скопировать файл в буфер обмена есть ссылка на "Работа с буфером обмена Windows из командной строки" http://old.computerra.ru/gid/rtfm/system/301629/ В 1С это можно использовать? Тип вставили ТекстИзHTML в буфер, а извлекли без тегов с переводом строк таблицы... |
|||
33
Mikhail Volkov
17.05.17
✎
10:28
|
Уже в таком виде:
Бинокль Sakura 20х40 Технические характеристики Увеличение х20 Диаметр линзы 50мм Влагозащитный да Обрезиненный корпус да В комплекте чехол и салфетка |
|||
34
Mikhail Volkov
17.05.17
✎
17:59
|
Как я понял двойной пробел это не два пробела вместе!? Перед тем как записать ТекстИзHTML в строку "Текстовое описание" убираю двойные пробелы и переводы строк. А после сохранения в строку "Текстовое описание" вижу двойные пробелы (по два пробела вместе). Кстати как раз те самые переводы строк таблиц, которые желательно оставить.
Как в ТекстИзHTML заменить "двойной пробел" на Символы.ПС до записи в строку "Текстовое описание"? Или какой код у "двойной пробел"? |
|||
35
Mikhail Volkov
18.05.17
✎
05:17
|
Вроде "двойной пробел" - это Символ(160), но 1С его не ловит!? Приходится уже после Записать() в строке "Текстовое описание" два пробела менять на Символы.ПС, и снова Записать(), если нашлась такая замена.
|
|||
36
cathode
19.05.17
✎
10:47
|
(0) Можно пойти другим путем: отрендерить хтмл-страницу текстовым браузером и сохранить вывод в файл. Что-то вроде:
lynx -dump -display_charset=UTF-8 -dont_wrap_pre -nolist -nomargins in.html > out.txt Достоинства: очень быстро, (условно) кросс-платформенно, вывод похож на то, что видно в обычном браузере (можно легко сравнивать веб-страницы по содержимому). Недостатки: много возни с настройкой и вызовом под Windows, корректно выводит только очень простые таблицы. |
|||
37
Serginio1
19.05.17
✎
11:09
|
||||
38
Mikhail Volkov
19.05.17
✎
13:42
|
(36) Это как "отрендерить"?
Таблицы вроде сейчас выглядят нормально: не в одну строку, а с переносом строк таблицы. Еще желательно правый столбец значений выравнять табуляциями, возится не хочется. Было бы что-то готовое, пусть не в 1С... |
|||
39
Mikhail Volkov
20.05.17
✎
09:51
|
Идеально "отрендерить" - это извлеченный ТекстИзHTML взять в буфер обмена, и из него поместит в "Текстовое описание" (30). В общем вроде так предусмотрено разработчиками УТ11.
|
|||
40
Mikhail Volkov
21.05.17
✎
08:06
|
Если ТекстИзHTML извлекать типовым методом ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекст(), то "двойной пробел" в тексте не используется. Переводы строк таблицы заменены 6 пробелами, колонки таблицы разделяются 3 пробелами. Но замена их на Символы.Таб не дает эффекта выравнивания правой колонки, в "Текстовое описание" выглядит как обычный пробел.
|
|||
41
Мимохожий Однако
21.05.17
✎
09:13
|
(38) В браузере Яндекс есть функция "Перейти в режим чтения". Там много чего отсекается. Может оттуда можно подцепить идеи?
|
|||
42
Mikhail Volkov
27.05.17
✎
07:55
|
Еще момент, при копировании номенклатуры мне не надо переносить в новую Описание и Присоединенные файлы (Номенклатура). Вставил в модуль:
Процедура ПриКопировании(ОбъектКопирования) Если Не ЭтоГруппа Тогда Описание = ""; ФайлОписанияДляСайта = Справочники.НоменклатураПрисоединенныеФайлы.ПустаяСсылка(); ФайлКартинки = Справочники.НоменклатураПрисоединенныеФайлы.ПустаяСсылка(); КонецЕсли; КонецПроцедуры А все равно переносится!? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |