helpf.pro
Регистрация
 0 
Распечатать

1С 8.x : Функция проверяет орфографию переданного текста с помощью средств MS Word

Код 1C v 8.х
 // Проверка орфоргафии переданного текста с помощью средств 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();
КонецЕсли;
КонецЕсли;

Возврат Ложь;
КонецЕсли;
КонецФункции


Пример использования:
Код 1C v 8.х
 
Перем ДеревоЗначений;
Состояние("Идет проверка орфографии. Пожалуйста ждите...");
Текст = ЭлементыФормы.ПолеТекстовогоДокумента.ПолучитьТекст(); // Получаем текст
Если ПроверитьОрфографию(Текст, ДеревоЗначений) Тогда // Проверяем орфографию
Предупреждение("Текст ошибок не содержит!!!", 5, "OK");
Иначе
Если ДеревоЗначений.Строки.Количество() > 0 Тогда
// Создаем и открываем форму автозамен...
ФормаВыбора = ЭтотОбъект.ПолучитьФорму("ФормаВыбора");

Для каждого СтрокаДЗ Из ДеревоЗначений.Строки Цикл
Строка = ФормаВыбора.ДеревоЗначений.Строки.Добавить();
Строка.Слово = СтрокаДЗ.Слово;

Для каждого ПодСтрокаДЗ Из СтрокаДЗ.Строки Цикл
ПодСтрока = Строка.Строки.Добавить();
ПодСтрока.Слово = ПодСтрокаДЗ.Слово;
КонецЦикла;
КонецЦикла;

Если ФормаВыбора.ОткрытьМодально() = "OK" Тогда
// Производим автозамены в тексте
Для каждого СтрокаДЗ Из ФормаВыбора.ДеревоЗначений.Строки Цикл
Для каждого ПодСтрокаДЗ Из СтрокаДЗ.Строки Цикл
Если ПодСтрокаДЗ.Пометка Тогда
Текст = СтрЗаменить(Текст, ПодСтрокаДЗ.Родитель.Слово, ПодСтрокаДЗ.Слово);
КонецЕсли;
КонецЦикла;
КонецЦикла;
ЭлементыФормы.ПолеТекстовогоДокумента.УстановитьТекст(Текст); //Вставим в поле исправленный текст
КонецЕсли;
Иначе
Предупреждение("В тексте найдены ошибки, но вариантов автозамены не нашлось!!!", 5, "Ошибка");
КонецЕсли;
КонецЕсли;
Разместил:   Версии: | 8.x |  Дата:   Прочитано: 14082
 0 
Распечатать
Возможно, вас также заинтересует
1C медленно работает по сети с базой на SQL Server 22
Данное обстоятельство может быть обусловлено многими причинами. Одна из них - неоптимальная настройка MS SQL . Перечислим неоптимальности в настройке: 1) Неправильно указанный сетевой протокол, используемый для взаимодействия 1С с SQL Server. П
SMTP greeting failure: 421 SMTP connection broken (reply) 8
Опи­са­ние ошиб­ки: С сен­тяб­ря 2014 Ян­декс.Почта, Mail.ru пе­ре­шли на про­то­кол SSL, что сде­ла­ло их еще более без­опас­ны­ми. Чтобы и даль­ше ра­бо­тать с пись­ма­ми через 1С, Вам нужно из­ме­нить их на­строй­ки и вне­сти до­ра­бот­ки в код
Автоматическая архивация баз 1С 8.х для файлового и клиент-серверного варианта 6
Данный способ архивации подходит для файловых и SQL версий баз 1С: И так: 1. Создаем скрипт vbs и сохраняем его в C:BackupZUP.vbs Set WshShell = CreateObject(" WScript.Shell" ) dim d,m,y d = day(date()) if d 10 then d = " 0" d end
Автоматическое резервное копирование 1С:Предприятия в облако с помощью ПО Effector Saver 4
Всем известно, для большей гарантии восстановления важных данных, необходимо копировать архивы в несколько мест хранения. Отдельный диск может помочь в случае порчи основного, но в случае если устройство будет потеряно или украдено, он будет так же
Автоматическое резервное копирование 1С:Предприятия в облако с помощью ПО Effector Saver 1
Всем известно, для большей гарантии восстановления важных данных, необходимо копировать архивы в несколько мест хранения. Отдельный диск может помочь в случае порчи основного, но в случае если устройство будет потеряно или украдено, он будет так же
Посмотреть все результаты поиска похожих
Комментарии
ketr
13.03.2019 13:44Комментарий: 1
ketr

СУпер, а можно аналог для УФ? 

В таком виде на УФ не работает

Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.