Проверка орфографии средствами Yandex Speller

Обработки - Универсальные обработки

Проверка орфографии средствами Yandex Speller с опциями и коррекцией ошибок. Возможность вызова как с сервера, так и с клиента (с последующим исправлением).

Проверка орфографии средствами Yandex Speller

Описание

Обработка производит проверку передаваемого текста средствами API Yandex Speller, довольно проста в использовании.

Может принимать различные параметры и опции для проверки (см. скриншоты). Например может игнорировать короткие слова, исключать переданые слова из строки с разделителями или заданого справочника.

Позволяет на основе распознаных ошибок создавать справочник-словарь исключений.

Строка может содержать как обычный текст, так и HTML разметку.

Опции:

  1. Пропускать верхний регистр
  2. Пропускать слова с цифрами
  3. Пропускать пути и ссылки
  4. Выявлять повторы слов
  5. Пропускать латиницу
  6. Не предлагать замену (только подсвечивать ошибки)
  7. Отмечать латиницу
  8. Распознавать текст как набор слов
  9. Пропускать рЕгИСтР
  10. Пропускать римские цифры

Есть возможность при отсутствии ошибок в переданном тексте автоматически закрывать форму.

Проверяет русский, английский и украинский языки.

Ошибки подсвечиваются оранжевым цветом, а при наведении пишется в чем заключается ошибка, при щелчке на нее открывается выпадающий список, позволяющий выбрать из доступных вариантов.

Обращение происходит через HTTP GET (Я использовал бы Web сервисы, но платформа накладывает определенные ограничения, тем не менее в модуле есть закоменченный кусочек для соединения через WS).

Производиться десять попыток достучаться до сервиса, прежде чем будет выведено сообщение о невозможности использования (сервис лег, ну или что вероятнее - ваш интернет).

Если проверка инициирована с клиента (через форму), то в случае нахождения ошибок будет возможность исправить их из предложенных вариантов в выпадающем меню.

Если проверка инициирована с сервера, то результат вернет довольно обширный набор данных, включая исправленный текст, информацию об ошибках и предложенные варианты исправления.

Обработка использует только средства платформы, тестировалась на "голой" конфигурации 8.3.10.2561 УФ (Тонкий клиент), Win Server 2012R2.

На вскидку должна запуститься на чем угодно начиная с 8.3.6.1977 с отключенным режимом совместимости (Очень уж люблю СтрШаблон() ).

Красивости расчитаны на наличие IE-11 в системе, если у Вас все плохо, то поправьте следующую строку в модуле объекта: <meta http-equiv='X-UA-Compatible' content='IE=11'>

Спроектирована без  использования модальных окон и вызовов.

Обработка довольно подробно документирована, при вызове функции модуля объекта - все параметры подписаны.

Код открыт, можете править в свое удовольствие, только не продавайте отдельно саму обработку (только если в составе продукта).

 

Передаваемые параметры и полученный результат

Обязательным является только параметр "Текст" при инициализации обработки на сервере, так что не пугайтесь обилию опций, все они могут быть опущены и будут выставлены по умолчанию.

Просто посмотрите, что возвращает закрытая форма или функция, там довольно интуитивно понятно)

 
 При инициализации формы с тонкого клиента
 
 При инициализации обработки на сервере

 

Примеры использования

Вариант "на клиенте":

Предположим вы хотите перед записью документа проверить правописание определенного реквизита, тогда Вы:

1) В модуле формы создаете процедуру "ПередЗаписью()"

2) В ней вызываете форму обработки, передав в нее структуру параметров (обязательно передайте значение ключа "Текст", иначе не имеет смысла, остальное заполниться по умолчанию). Также передайте владельца формы - ЭтаФорма.

!!! ЕСЛИ ВЫ НЕ ПЕРЕДАДИТЕ ВЛАДЕЛЬЦА ФОРМЫ, ТО ОБРАБОТКА ПОСЧИТАЕТ, ЧТО ВЫ ПРОСТО ЗАХОТЕЛИ ПОТЕСТИРОВАТЬ ЕЁ И СЕБЯ И СПРЯЧЕТ КНОПКИ "ОТМЕНИТЬ" и "ПРИНЯТЬ" !!!

Это сделано специально, но если Вы по какой то причине не хотите передавать владельца, Вы вполне можете закоментить процедуру "ПриОткрытии()" в обработке, это не повлияет на результат, а кнопки будут отображаться всегда.

3) Откройте форму, автоматически пройдет проверка. Если вы передали параметр "ЗакрытьЕслиБезОшибок" - Истина и не обнаружено ошибок, то форма будет сразу закрыта и вернет структуру с результатом проверки.

4) Если были обнаружены ошибки - пользователю будет предложено выбрать верные варианты и согласиться/не согласиться с правками.

5) Нажав кнопку Принять или Отмена (крестик) - форма закроется и вернет владельцу результат проверки или неопределено, соответсвенно.

 
На клиенте (упрощенный вызов)
 
На клиенте (с последующей ручной корректировкой)

 

Вариант "на сервере":

 

Предположим вы хотите лишить пользователя свободы воли выбора и автоматически исправлять ошибки, скажем перед записью документа:

1) В модуле объекта документа создаете процедуру "ПередЗаписью()"

2) Там создаете объект обработки.

3) У этого объекта вызываете единственную функцию YandexSpeller(), в которую можете передать кучу параметров (ну или только текст на проверку первым параметром, только он обязательный), конфигуратор подскажет параметры.

4) Функция вернет структуру с ошибками и всевозможными данными, естественно включая исправленный текст.

 
На сервере (упрощенный вызов)
 
На сервере (возвращает исправленный текст и ошибки)

 

Листинг модуля объекта

Вы можете скопировать данную функцию в общий модуль или куданибудь еще, она вполне самостоятельна и может работать в отрыве от обработки.

 
YandexSpeller()

Ответы на вопросы

  • Q: Подскажите как сделать полосу прокрутки в поле HTML?
  • A: В модуле формы, в процедуре "СобратьHTML()" сотрите "overflow: hidden;"

 

  • Q: Почему при вызове формы пропадают кнопки "Принять" и "Отмена"
  • A: При создании формы обработки ПроверкиОрфографии из другой формы - не забывайте передавать параметром владельца "ЭтаФорма"

     

  • Q:  У меня очень длинные строчки с текстом, как настроить их авто перенос?
  • A: В модуле формы, в процедуре "СобратьHTML()" добавьте в блок <style></style> вариации следующего (можете посмотреть в гугле за что отвечает каждая строка).
pre {
	white-space: pre-line;
	word-wrap: break-word;
	word-break: break-all;
	width: 100%;
}

 

UPD 17.11.10

  • Изменил разбор XML ответа
  • Внешний вид формы
  • Добавил проверку на битую кодировку
  • Содержание HTML поля теперь IE=11
  • При смене значения JS скрипт перекрашивает Select в зависимости от Option
  • Поправил ошибку возникающую при использовании словаря и отсутсвии орфографических ошибок

 

 Буду рад отзывам, комментариям, а также звездочкам :3 

 

 

Скачать файлы

Наименование Файл Версия Размер
Проверка орфографии средствами Yandex Speller
.epf 34,98Kb
09.11.17
8
.epf 17.11.10 34,98Kb 8 Скачать

См. также

Комментарии
1. Валерий Березуцких (spec8s) 235 09.11.17 23:00 Сейчас в теме
Совсем недавно делал нечто подобное, т. к. веб-сервис перестал работать. Только метод чтения XML возможно немного короче:

        ЧтениеXML = Новый ЧтениеXML();	
	ЧтениеXML.УстановитьСтроку(HttpОтвет.ПолучитьТелоКакСтроку());
	
	ПостроительDOM = Новый ПостроительDOM;
	ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
	
	РезультатПроверки = Новый Структура("error", Новый Массив);
	
	ЭлементыError = ДокументDOM.ПолучитьЭлементыПоИмени("Error");	
	Для Каждого ЭлементError Из ЭлементыError Цикл
		СтруктураОшибок = Новый Структура("s", Новый Массив);
		Для Каждого АтрибутError Из ЭлементError.Атрибуты Цикл
			СтруктураОшибок.Вставить(АтрибутError.Имя, Число(АтрибутError.Значение));
		КонецЦикла;
		
		ЭлементыWord = ЭлементError.ПолучитьЭлементыПоИмени("word");
		СтруктураОшибок.Вставить("word", ЭлементыWord[0].ТекстовоеСодержимое);
		
		ЭлементыS = ЭлементError.ПолучитьЭлементыПоИмени("s");
		Для Каждого ЭлементS Из ЭлементыS Цикл
			СтруктураОшибок.s.Добавить(ЭлементS.ТекстовоеСодержимое);
		КонецЦикла;
		
		Если СтруктураОшибок.s.Количество() > 0 Тогда
			РезультатПроверки.error.Добавить(СтруктураОшибок);
		КонецЕсли;
	КонецЦикла;
Показать
A1ice1990; +1 Ответить
2. Plague Fox (A1ice1990) 58 09.11.17 23:24 Сейчас в теме
(1) завтра подробнее посмотрю, идея была сделать покрасивее, разобрав XML через DOM, но немног не сдюжил)

Код вышел бы примерно той же длины, отличие в том, что данные в массив Я засовываю под русифицированными читабельными переменными, хотя этот момент можно было решить и изящнее, на вскидку записать в строку с разделителями "Атрибут:РускийСиноним:ОжидаемыйТипДанных; ... : ... : ... ; ...".
Привычка, если работаю с 1с - переменные должны быть русскими и PascalCase (исключение для массивов и некоторых данных, там могу поставить префикс), а вот в JS, Python, C++ и тд уже ожидаю увидеть латинские camelCase.

Но спасибо за поправку, скорее всего переделаю эту часть.
3. Александр Насонкин (nasonkin) 19 10.11.17 06:29 Сейчас в теме
Самый простейший вариант - отображение слов с ошибками, делал через SOAP. Вдруг кому пригодиться:
WSОпределение	= Новый WSОпределения("http://speller.yandex.net/services/spellservice?WSDL","","",,10);      
WSПрокси		= Новый WSПрокси(WSОпределение,"http://speller.yandex.net/services/spellservice","SpellService","SpellServiceSoap",,10);		
Пакет 			= WSПрокси.ФабрикаXDTO.Создать(WSПрокси.ФабрикаXDTO.Тип("http://speller.yandex.net/services/spellservice","CheckTextRequest"));  	
Пакет.options   = 55;
Пакет.format	= "plain";
Пакет.lang		= "ru";
Пакет.text		= Текст;
РезультатВебОперации = WSПрокси.checkTexts(Пакет); 
Для каждого ГрамОшибка из РезультатВебОперации.ArrayOfSpellResult.SpellResult[0].error Цикл
	СловаСОшибками = Строка(СловаСОшибками)+"'"+Строка(ГрамОшибка.word)+"', "
КонецЦикла
Возврат Лев(СловаСОшибками,СтрДлина(СловаСОшибками)-2)
Показать

Но на данный момент SOAP недоступен (хотя в документации ссылка на него есть). Написал в тех. поддержку, жду ответ.
4. Plague Fox (A1ice1990) 58 10.11.17 09:07 Сейчас в теме
(3) Я тоже через него делал изначально. Вчера был доступен "checkText", но с ограничением: передавать параметром надо было только текст.
Есть очень весомое подозрение, что это не сервис у них лежит, а ограничения платформы 1с. Ведь XDTO пакеты это фишка самой 1с.

Вот так работает:
Определения	= Новый WSОпределения("http://speller.yandex.net/services/spellservice?WSDL",,,Неопределено,300);	
Прокси		= Новый WSПрокси(Определения, "http://speller.yandex.net/services/spellservice", 
									"SpellService", "SpellServiceSoap", Неопределено, 300);
Данные		= Прокси.checkText(Текст);


Для меня это не очень важный момент, так через GET также отлично работает.
Мой код немного монструозен, например совсем не обязательно передавать заголовки.
Пытаться достучаться в цикле и вот это все.

Вполне достаточно:
URL				= СтрШаблон("services/spellservice/checkText?text=%1&lang=%2&options=%3&format=%4", Текст, Язык, Опции, Формат);
HTTPСоединение	= Новый HTTPСоединение("speller.yandex.net", 80, , , , 300);
HTTPЗапрос		= Новый HTTPЗапрос(URL);		
HTTPОтвет		= HTTPСоединение.Получить(HTTPЗапрос);
5. Валентин Виноградов (guy_septimiy) 10.11.17 09:09 Сейчас в теме
Интересное решение.
Респект.
6. Андрей Суханцов (&rew) 6 13.11.17 11:56 Сейчас в теме
У меня одного было ощущение, когда я на звезду нажал, как будто "зигу" кинул?
Silenser; PVG_73; Yakud3a; Vladimir87; Serega-artem; Gobbledegook; nayd; bserge88; Кузьмич; RailMen; A1ice1990; +11 Ответить
7. Plague Fox (A1ice1990) 58 13.11.17 12:01 Сейчас в теме
(6) Полно вам, думаю эмблемка Grammar Nazi никого не оскорбит тк узнаваема и к томуже вполне уместна)
9. Иван Пантелеев (RailMen) 704 13.11.17 12:12 Сейчас в теме
8. Александр Журавлев (apostal86) 179 13.11.17 12:04 Сейчас в теме
А api нет у этого Yandex Speller?
10. Plague Fox (A1ice1990) 58 13.11.17 12:17 Сейчас в теме
(8) Не совсем понял вопрос.
Обработка и использует API Яндекса, дружит с ним через HTTP GET (в коде есть закоменченный кусочек для общения через веб сервисы, но там не выйдет вместе с текстом передавать параметры).

По сути обработка является оберткой над API Яндекса.
К самой обработке вы можете обращаться различными способами как с клиента (будет создана форма и установлены параметры либо из переданых, либо по умолчанию, если опущены), так и с сервера (будет возвращена структура с ошибками, предложениями по исправлению, исправленным текстом и текстом с пометками на месте ошибок). Если вам не нужна форма и не хотите предложить пользователю красиво и удобно ручками исправить свои абшибки - можете из листинга модуля объекта просто перенести функцию в общий модуль, все будет работать в лучшем виде (к томуже все передаваемые параметры подписаны и будут подсказываться в конфигураторе).

Я, наверное, слишком сложно и муторно объясняю, лучше посмотрите примеры использования в теме, там все намного проще и лаконичнее.
13. Александр Журавлев (apostal86) 179 13.11.17 13:39 Сейчас в теме
11. Vladimir K (KroVladS) 13.11.17 12:35 Сейчас в теме
Плагин для конфигуратора сделаете?
12. Plague Fox (A1ice1990) 58 13.11.17 13:19 Сейчас в теме
(11) Плагин?
На стандартный конфигуратор, вроде, "вешаются" только шаблоны текста и инжект dll экзотики на вроде "снегопат".
Также есть "графит", но о нем ни слуху ни духу уже несколько лет. Может Я чего проспал?)

Или вы о "расширения конфигурации", штуке которая ставиться поверх типовых не снимая с поддержки?
Если о ней, то Я плохо представляю, что такого особенного Я могу сделать, кроме как добавить саму обработку.

Если кому не достаточно примеров вызовов из темы - могу добавить тестовую конфигурацию.
Яб и тестовый сервер поднял бы, но отдельную железку, которая не былаб дырой в безопасности соберать буду только через пару месяцев.
25. Vladimir K (KroVladS) 14.11.17 13:55 Сейчас в теме
(12)
Я как раз dll-ку имел ввиду.
26. Plague Fox (A1ice1990) 58 14.11.17 14:00 Сейчас в теме
(25) Сильно врядли. Следующий раз как буду плюсы открывать - это будет внешняя компонента для распознования текста :3
14. Сергей Ожерельев (Поручик) 3655 13.11.17 16:16 Сейчас в теме
На вскидку должна запуститься на чем угодно, начиная с 8.3.6.1977 с отключенным режимом совместимости
15. Plague Fox (A1ice1990) 58 13.11.17 16:18 Сейчас в теме
(14)
с отключенным режимом совместимости

Если это так важно, добавлю)
16. Сергей Ожерельев (Поручик) 3655 13.11.17 16:24 Сейчас в теме
(15) Конечно важно. Полно конф, которые работают на 8.3.7.ХХХХ и выше, но внутри у них 8.3.5 или даже 8.2.
17. Plague Fox (A1ice1990) 58 13.11.17 16:29 Сейчас в теме
(16) Я думал это очивидно, но пусть будет.
Да и не велика проблема, вполне можно переписать эти моменты при помощи строковых функций из БСП.
18. Хаким Давуров (Davurov) 14.11.17 08:43 Сейчас в теме
Спасибо большое! Очень классная штука! Не подскажите как сделать полосу прокрутки в поле HTML? Когда длинное предложение неудобно с ним работать так как строчки не переносятся сами и нет полосы прокрутки
19. Plague Fox (A1ice1990) 58 14.11.17 10:07 Сейчас в теме
(18) А, извиняюсь. Делал под себя и не ожидал полосы прокрутки, поэтому для красоты специально спрятал. В модуле формы, в процедуре "СобратьHTML()" сотрите "overflow: hidden;".

Если у вас выходит в ширину слишком длинной строка, то советую посмотреть на следующие стили CSS (также добавлять в СобратьHTML() в <st yle></style> блок):
pre {
	white-space: pre-line;
	word-wrap: break-word;
	word-break: break-all;
	width: 100%;
}



Сейчас создам в темке блок с QA и добавлю туда ответы на вопросы.
Удачи)
20. Хаким Давуров (Davurov) 14.11.17 10:34 Сейчас в теме
(19)
overflow


Ооо! спасибо заработало ) И ещё вопрос, если используется ОбработкаОповещения "ПослеПроверкиОрфографии", то для случая когда нет ошибок и стоит "ЗакрытьЕслиБезОшибок", после закрытия формы в эту процедуру не попадает, поэтому не могу вывести сообщение пользователю: "Все ок. ошибок нет =)"

Форма закрывается с этой ветки:

Если БезОшибок И ЗакрытьЕслиБезОшибок Тогда
		ЭтаФорма.Закрыть(Новый Структура("Текст,БезОшибок,КоличествоОшибок",Текст,БезОшибок,КоличествоОшибок));
		Возврат;
	КонецЕсли; // Если БезОшибок И ЗакрытьЕслиБезОшибок
21. Plague Fox (A1ice1990) 58 14.11.17 10:58 Сейчас в теме
(20) На примере примера из темы для немодального вызова:
&НаКлиенте
Процедура ПроверитьОрфографию(Команда)
	//СтрокаНаПроверку	= "Мамо мыла раму.";
	Оповещение			= Новый ОписаниеОповещения("ПослеПроверкиОрфографии", ЭтаФорма, СтрокаНаПроверку); 
	П					= Новый Структура("Текст,Язык,Формат,МинДлинаСлова,Словарь,Опции,ЗакрытьЕслиБезОшибок",
											СтрокаНаПроверку, "ru,en", "plain", 0, "", 31, Истина);
	Форма	= ОткрытьФорму("Обработка.ПроверкаОрфографии.Форма", П, ЭтаФорма, Истина, , , Оповещение);
	Если Форма = Неопределено Тогда
		Сообщение	= Новый СообщениеПользователю;
		Сообщение.Текст	= "Форма не была создана, вероятно ошибок нету.";
		Сообщение.Сообщить();
	КонецЕсли; // Если Форма = Неопределено
КонецПроцедуры // ПроверитьОрфографию()
Показать


Ну или если не возражаете против модальных окон ( лично мое руководство их очень любит :3 ), то там все еще проще, просто смотрите, что возвращает:
Результат	= ОткрытьФормуМодально("Обработка.ПроверкаОрфографии.Форма", Новый Структура("Текст", СтрокаНаПроверку), ЭтаФорма);
22. Хаким Давуров (Davurov) 14.11.17 11:00 Сейчас в теме
Ок спасибо большое! очень выручили!

P.S у меня все равно приходит форма, поэтому добавил условие

Если Форма = Неопределено ИЛИ Форма.БезОшибок Тогда
        Сообщение    = Новый СообщениеПользователю;
        Сообщение.Текст    = "Ошибок нет!";
        Сообщение.Сообщить();
    КонецЕсли; // Если Форма = Неопределено
23. Хаким Давуров (Davurov) 14.11.17 11:09 Сейчас в теме
Не не не, спасибо =) никаких модальностей =)
24. Ник Рыжик (ra1ich) 12 14.11.17 13:08 Сейчас в теме
Прикольно, для нас будет актуально.
Оставьте свое сообщение