|
MS Word и 1С | ☑ | ||
---|---|---|---|---|
0
K1RSAN
05.08.19
✎
12:36
|
В общем, сделал некое подобие "Т9" для 1С на УФ, при нажатии кнопки 1С создает ком объект Word и прогоняет текст на наличие орфографических ошибок - потом меняет слова на правильные (по своему мнению) и внизу выводит список строк, в которых ошибка и слова с ошибкой. Проблема в том, что по выполнению этой задачи остается висеть фоновый процесс word, который можно только убить. Проблема усугубляется тем, что текст проверяется в табличной части, а значит цикл по количеству строк.
Где-то неправильно делаю? И раз пошла такая пляска - может кто подскажет другой способ проверки орфографии на УФ? В функцию подается Текст - строка и номер строки табличной части. В начале модуля определена переменная ОбъектMSWord Функция ПроверкаОрфографии(Текст, НомерСтроки) // Создадим объект MS Word, он должен быть установлен Если ОбъектMSWord = Неопределено Тогда Попытка ОбъектMSWord = Новый COMОбъект("Word.Application"); Исключение ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Microsoft Word не установлен!'")); Возврат Текст; КонецПопытки; КонецЕсли; НаименованиеПроектаДляПроверки = Текст; СловаДляЗамены = Новый ТаблицаЗначений; СловаДляЗамены.Колонки.Добавить("Слово"); СловаДляЗамены.Колонки.Добавить("СловоДляЗамены"); СловаДляЗамены.Колонки.Добавить("Представление"); НетОшибок = ОбъектMSWord.CheckSpelling(Текст); КоличествоОшибок = 0; СловаОшибки = ""; Если НЕ НетОшибок Тогда // текст содержит ошибки. Проверим каждое слово и выведем ошибочные. Док = ОбъектMSWord.Documents.Add(); // Создадим новый документ Область = Док.Range(0,0); // Получим пустую область в начале документа Область.InsertBefore(Текст); // Добавим в документ текст Для каждого Слово Из Область.Words Цикл СловоДляПроверки = СокрЛП(Слово.Text); НетОшибок = ОбъектMSWord.CheckSpelling(СловоДляПроверки); Если НЕ НетОшибок Тогда // Слово ошибочно НаименованиеПроектаДляПроверки = СтрЗаменить(НаименованиеПроектаДляПроверки, СловоДляПроверки, "<span style=""color:red"">" + СловоДляПроверки + "</span>"); // покажем возможные замены неправильного слова СтрокаВариантов = ""; // Получим варианты правописания Варианты = Слово.GetSpellingSuggestions( ,1, ,0); Первый = Истина; Для каждого Вариант Из Варианты Цикл Если ЗначениеЗаполнено(Вариант.Name) Тогда СтрокаВариантов = СтрокаВариантов + ", " + Вариант.Name; НоваяСтрока = СловаДляЗамены.Добавить(); НоваяСтрока.Слово = СловоДляПроверки; НоваяСтрока.СловоДляЗамены = Вариант.Name; НоваяСтрока.Представление = СловоДляПроверки + " " + Вариант.Name; Если Первый = Истина Тогда Текст = СтрЗаменить(Текст,СловоДляПроверки,Вариант.Name); Первый = Ложь; КонецЕсли; КонецЕсли; КонецЦикла; Если ЗначениеЗаполнено(СтрокаВариантов) Тогда КоличествоОшибок = КоличествоОшибок + 1; СловаОшибки = СловаОшибки + СловоДляПроверки + ", "; КонецЕсли; КонецЕсли; КонецЦикла; Док.Close(0,,); // закроем документ без сохранения wdDoNotSaveChanges ОбъектMSWord.Application.Quit(0);// Пытаемся закрыть процесс MS Word Если КоличествоОшибок > 0 Тогда Сообщить ("Ошибки найдены в " + НомерСтроки + " строке в " + КоличествоОшибок + " словах: " + СловаОшибки); КонецЕсли; КонецЕсли; Возврат Текст; КонецФункции |
|||
1
K1RSAN
05.08.19
✎
12:38
|
Изначально обработка была немного по-другому сделана, но надо на данный момент такое. Знаю, что есть атрофированный код, который не ведет ни к чему, но пока надо решить задачу, а потом убрать лишнее
|
|||
2
Fish
05.08.19
✎
12:41
|
Да полно других способов. Вот, навскидку: http://catalog.mista.ru/public/698583/
А решать это через ком-объект - имхо, плохо. |
|||
3
Garykom
гуру
05.08.19
✎
12:43
|
(0) Веб-сервисы же для этой и подобных целей используются.
А что там на сервере (который может быть и локально на клиентском компе) используется, ворд или нечто другое пофиг. Главное что для 1С интерфейс тот же самый, легко переделать проверку с ворда на нечто другое. |
|||
4
K1RSAN
05.08.19
✎
12:48
|
(2) Да, тоже пришел к этому выводу - уж больно долго работает. Но желательно сделать это без дополнительных действий пользователей и новых форм - в 90% случаев автозамена решит проблему, да и ошибок не планируется много - просто в случае их наличия надо показать, где было исправлено, чтобы в случае неправильной автозамены можно было легко найти. Просто Word - первое, что пришло в голову.
|
|||
5
lodger
05.08.19
✎
13:27
|
(4) создай клиентскую переменную на форме и храни в ней COMОбъект от начала работы с тч до окончания жизни формы. при закрытии на клиенте грохать комок.
а вот с закрытием объекта поработай в сторону команд Word.Application ну это если не делать ничего нового, а оптимизировать "как есть". |
|||
6
K1RSAN
05.08.19
✎
13:41
|
(5) То есть создать его на этапе открытия формы? И при закрытии формы уничтожать тогда.
|
|||
7
lodger
05.08.19
✎
13:43
|
(6) от начала работы с тч.
т.е. ты пробуешь получить переменную и если там тыква, то создаешь комок в эту переменную. при закрытии формы уничтожать - да. |
|||
8
K1RSAN
05.08.19
✎
13:47
|
(5)+ А вообще это первый пробный вариант, надо что-то в конце оставить такое, что будет приемлемое по качеству и с минимальными действиями пользователей
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |