Имя: Пароль:
1C
1С v8
УТ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
Еще момент, при копировании номенклатуры мне не надо переносить в новую Описание и Присоединенные файлы (Номенклатура). Вставил в модуль:

Процедура ПриКопировании(ОбъектКопирования)
    
    Если Не ЭтоГруппа Тогда
        Описание             = "";
        ФайлОписанияДляСайта = Справочники.НоменклатураПрисоединенныеФайлы.ПустаяСсылка();
        ФайлКартинки         = Справочники.НоменклатураПрисоединенныеФайлы.ПустаяСсылка();
    КонецЕсли;
    
КонецПроцедуры

А все равно переносится!?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.