![]() |
![]() |
![]() |
|
v7: Поиск по шаблону и подсчет количества слов в документе Word из 1С 7.7 | ☑ | ||
---|---|---|---|---|
0
Angellisa
13.03.16
✎
22:02
|
1. Есть справочник "Слова". В него занесено 10 слов.
2. Есть справочник "Обработка документа Ворд". 3. Есть справочник "Слова из документа". Подчинен справочнику "Обработка документа Ворд". На форме элемента справочник "Обработка документа Ворд" есть кнопка "Обработать". Открывается нужный вордовский файл, идет поиск слов из справочника "Слова" по указанному документу. При нахождении - вопрос:" Нашли вхождение... Заполнить справочник "Слова из документа"?" Если да, то заполняется подчиненный справочник. Все работает отлично, но хотелось добавить 2 вещи: 1. Вытащить через команду "Сообщить" все предложение (или абзац), содержащее искомый шаблон. 2. Посчитать количество слов в этом документе ворд. ActiveDocument.Words.Count работает криво, возвращает слова с учетом переносов и пр. На ComputeStatistics(wdStatisticWords) - ругается 1С. Функция Текст_Найти(Оле,аТекст) Текст=СокрЛП(аТекст); //поиск Оле.Selection.Find.ClearFormatting(); Оле.Selection.Find.Text=Текст; Оле.Selection.Find.MatchCase=0; Оле.Selection.Find.MatchWholeWord=1; Оле.Selection.Find.MatchWildcards=0; Оле.Selection.Find.MatchSoundsLike=0; Оле.Selection.Find.MatchAllWordForms=0; Оле.Selection.Find.Forward=1; Оле.Selection.Find.Wrap=1; Оле.Selection.Find.Format=0; Ответ=Оле.Selection.Find.Execute(); Если Оле.Selection.Find.Found()=0 Тогда Возврат(0); Иначе Возврат(1); КонецЕсли; КонецФункции В процедуре: Если (Текст_Найти(Оле,СокрЛП(ТекСлово))=1) Тогда Сообщить("Предложение: "+.......); Плз, хлп)) |
|||
1
Garykom
гуру
13.03.16
✎
22:11
|
Можно спросить? А нафуя в задаче word?
|
|||
2
Garykom
гуру
13.03.16
✎
22:12
|
(1)+ забыл классическое "а фото?"
|
|||
3
Angellisa
13.03.16
✎
22:22
|
Как зачем? Мне не нужно хранить в 1С текст вордовского файла, а только найденные вхождения определенных слов из него. Мухи и котлеты отдельно))
|
|||
4
Смотрящий
13.03.16
✎
22:23
|
(3) Фотка где ?
|
|||
5
Garykom
гуру
13.03.16
✎
22:24
|
(3) ну так берете просто весь текст из файлов ворд по очереди и анализируем прямо в 1С... ворд то зачем для анаиза?
где (4) ? :) |
|||
6
Angellisa
13.03.16
✎
22:27
|
Давненько не была на форумах.Фотка чего?))
|
|||
7
Garykom
гуру
13.03.16
✎
22:29
|
(6) Авторши конечно, чего же еще ? ;)
|
|||
8
Garykom
гуру
13.03.16
✎
22:30
|
(5)+ для избавления от "переносов" слов можно глянуть какой символ переноса в полученном из ворда в 1С тексте и СтрЗаменить(...)
|
|||
9
Смотрящий
13.03.16
✎
22:35
|
(6) Вставлять фотку профиль - плата твоя за помощь
|
|||
10
Garykom
гуру
13.03.16
✎
22:38
|
(9) "ню" = "готовый код" ?
|
|||
11
Смотрящий
13.03.16
✎
22:41
|
(10) готовый код это если как в анекдоте: блондинка и фото на паспорт
|
|||
12
Garykom
гуру
13.03.16
✎
22:44
|
(11) это уже XXX какой то )) с таким ракурсом будет "золотой вип абонемент"
|
|||
13
Angellisa
13.03.16
✎
22:50
|
Код простейший:
Процедура АнализТекста() ТекЭлемент=ТекущийЭлемент(); Если ПустоеЗначение(Путь)=1 Тогда Предупреждение("Не указан путь файла!"); Возврат; КонецЕсли; Кл=СоздатьОбъект("Справочник.Слова"); Сл=СоздатьОбъект("Справочник.СловаДок"); Сл.ИспользоватьВладельца(ТекЭлемент); Оле=СоздатьОбъект("Word.Application"); ВыбПутьФайла=Путь; Оле.Documents.Open(ВыбПутьФайла); Кл.ВыбратьЭлементы(); Пока Кл.ПолучитьЭлемент()>0 Цикл ТекКл=Кл.ТекущийЭлемент(); Если Текст_Найти(Оле,СокрЛП(ТекКл))=1) Тогда Сообщить("Нашли предложение: "+.......); Вопр1=Вопрос("Нашли вхождение " + ТекКл + ". Записать?","Да+Нет"); Если (Вопр1="Да") Тогда Если Сл.НайтиПоРеквизиту("Слово",ТекКл,0)=0 Тогда Сл.Новый(); Сл.Наименование=ТекКл.Наименование; Сл.Записать(); Иначе Если Упом.НайтиПоРеквизиту("Слово",ТекКл,0)=1 Тогда Сл.Наименование=ТекКл.Наименование; Сл.Записать(); КонецЕсли КонецЕсли; КонецЕсли; КонецЕсли; Оле.Visible=1; КонецЦикла; Сообщить(Оле.ActiveDocument.Words.Count); Оле.ActiveDocument.Close(); КонецПроцедуры |
|||
14
Смотрящий
13.03.16
✎
23:00
|
(13) А тут то что нетак ?
|
|||
15
Garykom
гуру
13.03.16
✎
23:00
|
(13) код можно упростить и все что делается через word вынести в 1С
будет слегка надежнее, в вашем примере пока не ответили на вопрос документ ворда висит открытый если попробовать открыть другой документ ворда возможны разные глюки или если 1С вылетает то ворд то остается в памяти и мешается |
|||
16
Garykom
гуру
13.03.16
✎
23:02
|
(15)+ самый главный + код получается не привязан совсем к типу файлов (word)
можно его будет использовать почти для любого текста к примеру без проблем с документами libreoffice и прочими |
|||
17
Angellisa
13.03.16
✎
23:03
|
Я же говорю - все отлично работает. Но нужно еще:
1. Вытащить через команду "Сообщить" все предложение (или абзац), содержащее искомый шаблон. Т.е. когда идет предупреждение, что слово найдено, хотелось бы посмотреть в каком предложении и уже тогда отвечать заносить это слово в справочник или нет. 2. Посчитать количество слов в этом документе ворд. ActiveDocument.Words.Count работает криво, возвращает слова с учетом переносов и пр. На ComputeStatistics(wdStatisticWords) - ругается 1С. |
|||
18
Angellisa
13.03.16
✎
23:06
|
А как "все что делается через word вынести в 1С"? Скопипастить в текстовый реквизит? А если там 500 стр?
|
|||
19
Смотрящий
13.03.16
✎
23:08
|
(17) Если Текст_Найти(Оле,СокрЛП(ТекКл))=1) Тогда
код Текст_Найти дай На ComputeStatistics(wdStatisticWords) - ругается 1С. Как вызывается ? дословно что пищет 1С ? |
|||
20
Garykom
гуру
13.03.16
✎
23:09
|
(17) 1. абзац это либо символ конца строки
2. статистика по словам банально убрать смиволы переноса, заменит " " на "РазделительСтрок" затем циклом обойти и добавить все слова в ТЗ, добавить колонку "Количество", заполнить ее "1" и ТЗ.Свернуть("Слова", "Количество") (18) без разницы сколько там страниц, программно же начало кода будет такое же |
|||
21
Garykom
гуру
13.03.16
✎
23:10
|
(20)+
1. абзацы банально находятся при поиске слов сразу не в целом тексте, а в каждом абзаце искать в цикле и если нашли то его выводить куда надо |
|||
22
Angellisa
13.03.16
✎
23:11
|
Сообщить(Оле.ActiveDocument.ComputeStatistics(wdStatisticWords<<?>>));
Переменная не определена (wdStatisticWords) При проверке модуля обнаружены синтаксические ошибки! |
|||
23
Garykom
гуру
13.03.16
✎
23:11
|
(19) код "Текст_Найти" в (0)
|
|||
24
Angellisa
13.03.16
✎
23:14
|
Я с ума сойду копипастить тысячу документов))
|
|||
25
Смотрящий
13.03.16
✎
23:18
|
(22) wdStatisticWords определено в VBA как wdStatisticWords = $0 попробуй использовать
Сообщить(Оле.ActiveDocument.ComputeStatistics(0)); |
|||
26
Angellisa
13.03.16
✎
23:24
|
Вау!!! Заработало! Мерси,мерси))
Теперь бы еще вторую задачку решить и будет мне счастье)) |
|||
27
Смотрящий
13.03.16
✎
23:30
|
(26) я нетверезв, а вба был настолько давно что с ходу не изменю код в (0) - вспоминать надо, и читать опять по новой
|
|||
28
Смотрящий
13.03.16
✎
23:31
|
По идее Текст_Найти должна третьим параметром возвращать предложение в которм найден текст
|
|||
29
Garykom
гуру
13.03.16
✎
23:36
|
(24) да не надо ничего копипастить то ))
просто целиком текст из ворда получаем из каждого файла кодом и далее в 1С его крутим (этот полученный текст) |
|||
30
Angellisa
13.03.16
✎
23:37
|
Нашла в инете:
'получить текст слова 2, в предложении 1,в параграфе 2 WordApp.ActiveDocument.Paragraphs(2).Range.Sentences(1).Words(2).Text Крутила по-всякому, но никак. |
|||
31
Смотрящий
13.03.16
✎
23:45
|
(30) У тебя в Текст_Найти(Оле, аТекст) оператор Оле.Selection.Find.Found() возвращает найдено/ненайдено.
А вот где найдено, в каком параграфе/строке - неизвестно. Надо искать как выдрать средствами вба предложение в котором найдено - условно: сканировать строку к началу до точки (до начала параграфа) и к концу до точки (до начала параграфа) |
|||
32
Garykom
гуру
13.03.16
✎
23:57
|
(31) а не проще по очереди брать каждый параграф из ворда в 1С и в нем искать? но есть, есть любители преодолевать трудности.... "стоя и в гамаке"
|
|||
33
Смотрящий
13.03.16
✎
23:59
|
(31) ну на первом десятке параграфов перебор, может и будет иметь смысл. а вот на сотне - будет виснуть нхрен; надолго
|
|||
34
Angellisa
14.03.16
✎
00:07
|
"Expand() — расширить выделение на слово, предложение, абзац и т.п. — в зависимости от переданного параметра. Метод Extend() позволяет расширить выделение (вместо слова — предложение, вместо предложения — абзац и т.п.). Метод, обратный методу Expand() — Shrink()."
И как это прикрутить? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |