Имя: Пароль:
1C
1С v8
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)+ А вообще это первый пробный вариант, надо что-то в конце оставить такое, что будет приемлемое по качеству и с минимальными действиями пользователей
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший