// Проверка орфоргафии переданного текста с помощью средств MS Word // Параметры // <Текст> – <Строка> – проверяемый текст // <ДеревоЗначений> – <ДеревоЗначений> – возвращает дерево замен // Возвращаемое значение: // <Булево> – Истина, если текст не содержит ошибок Функция ПроверитьОрфографию(Текст, ДеревоЗначений = Null) Экспорт Попытка Ворд = Новый COMОбъект("Word.Application"); //Создаем объект MS Word Исключение Предупреждение("Microsoft Word не установлен!",,"Ошибка!"); Возврат Ложь; КонецПопытки; ТекстБезОшибок = Ворд.CheckSpelling(Текст); //проверяем нашу строку на ошибки Если ТекстБезОшибок Тогда // Нет ошибок Возврат Истина; Иначе // Обнаружены ошибки, будем проверять по словам Если ДеревоЗначений <> Null Тогда Ворд_Активен = Ворд.Visible; //Запомним, был ли Word активен ВремДок = Ворд.Documents.Add(); //Добавляем к открытым документам МояОбласть = ВремДок.Range(0, 0); //Получаем пустую область в начале документа МояОбласть.I_nsertBefore(Текст); //Добавляем в эту область нашу строку ЧислоСлов = МояОбласть.Words.Count; //Подсчитываем число слов в области ДеревоЗначений = Новый ДеревоЗначений; //сюда будем записывать слова и варианты их замен МассивТипов = Новый Массив; МассивТипов.Добавить(Тип("Строка")); ОписаниеТипов = Новый ОписаниеТипов(МассивТипов); ДеревоЗначений.Колонки.Добавить("Слово", ОписаниеТипов, "Слово/Замена",); wdSpellword=0; //константа Word, указывающая на то, что при при вызове проверки орфографии возвращается множество замен wdDoNotSaveChanges=0; //константа Word, указывающая на то, что при закрытии не надо сохранять изменения в закрываемом документе Для НомерСлова = 1 По ЧислоСлов Цикл ОбработкаПрерыванияПользователя(); ПровОбласть = МояОбласть.Words(НомерСлова); //выбираем очередное слово ПровСлово = СокрЛП(ПровОбласть.Text); СловоБезОшибок = Ворд.CheckSpelling(ПровСлово); //проверяем наше слово на ошибки Если НЕ СловоБезОшибок Тогда //получаем варианты замен (их может и не быть!) Если ДеревоЗначений.Строки.Найти(ПровСлово, "Слово") = Неопределено Тогда НоваяСтрока = ДеревоЗначений.Строки.Добавить(); НоваяСтрока.Слово = ПровСлово; Замены = ПровОбласть.GetSpellingSuggestions( ,1, ,wdSpellword); //проверяем орфографию, укзав, что возвращать надо множество замен ЧислоЗамен = Замены.Count; //получаем число возможных замен Если ЧислоЗамен > 0 Тогда //заносим варианты замен в таблицу значений Для НомерЗамены = 1 По ЧислоЗамен Цикл СловоЗамены = СокрЛП(Замены.Item(НомерЗамены).Name); НоваяПодСтрока = НоваяСтрока.Строки.Добавить(); НоваяПодСтрока.Слово = СловоЗамены; КонецЦикла; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; ВремДок.Close(wdDoNotSaveChanges,,); Если Не Ворд_Активен Тогда Ворд.Quit(); КонецЕсли; КонецЕсли; Возврат Ложь; КонецЕсли; КонецФункции
Перем ДеревоЗначений; Состояние("Идет проверка орфографии. Пожалуйста ждите..."); Текст = ЭлементыФормы.ПолеТекстовогоДокумента.ПолучитьТекст(); // Получаем текст Если ПроверитьОрфографию(Текст, ДеревоЗначений) Тогда // Проверяем орфографию Предупреждение("Текст ошибок не содержит!!!", 5, "OK"); Иначе Если ДеревоЗначений.Строки.Количество() > 0 Тогда // Создаем и открываем форму автозамен... ФормаВыбора = ЭтотОбъект.ПолучитьФорму("ФормаВыбора"); Для каждого СтрокаДЗ Из ДеревоЗначений.Строки Цикл Строка = ФормаВыбора.ДеревоЗначений.Строки.Добавить(); Строка.Слово = СтрокаДЗ.Слово; Для каждого ПодСтрокаДЗ Из СтрокаДЗ.Строки Цикл ПодСтрока = Строка.Строки.Добавить(); ПодСтрока.Слово = ПодСтрокаДЗ.Слово; КонецЦикла; КонецЦикла; Если ФормаВыбора.ОткрытьМодально() = "OK" Тогда // Производим автозамены в тексте Для каждого СтрокаДЗ Из ФормаВыбора.ДеревоЗначений.Строки Цикл Для каждого ПодСтрокаДЗ Из СтрокаДЗ.Строки Цикл Если ПодСтрокаДЗ.Пометка Тогда Текст = СтрЗаменить(Текст, ПодСтрокаДЗ.Родитель.Слово, ПодСтрокаДЗ.Слово); КонецЕсли; КонецЦикла; КонецЦикла; ЭлементыФормы.ПолеТекстовогоДокумента.УстановитьТекст(Текст); //Вставим в поле исправленный текст КонецЕсли; Иначе Предупреждение("В тексте найдены ошибки, но вариантов автозамены не нашлось!!!", 5, "Ошибка"); КонецЕсли; КонецЕсли;