Как просто и красиво настроить орфографию в 1С без Яндекс.Спеллера
В этой статье пойдет речь о подсветке орфографии в 1С. Все привыкли, что при использовании практически любых программ, где можно писать текст, будь то почтовик или любой мессенджер, неправильно написанные слова подсвечиваются автоматически. И это стало обыденностью.
Нам поступила задача: для удобства работы с программой на форме в 1С сделать такую же подсветку орфографии. Задача есть – нужно выполнять. Так как ранее мы не сталкивались с подобным, пришло время обратится к Синтакс-помощнику. В нем мы нашли свойство поля ввода формы – ПроверкаПравописанияПриВводеТекста.
Все так просто: включаем использование – и вуаля, все работает? Но, раз эта статья существует, значит все не так просто. Как оказалось, это свойство (а также несколько других, которые были бы очень полезны, например, СпециальныйРежимВводаТекста), доступно только в мобильном приложении.
Но мы не отчаивались и решили спросить у Гугла, что наши коллеги, столкнувшиеся с данным вопросом, уже придумали. Мы нашли множество решений: и COM соединение с Word, и — самый популярный вариант – использование Яндекс Спеллера. Все они действительно рабочие, но все-таки мы были уверены, что можно сделать проще и красивее. И, действительно, после пары экспериментов мы нашли решение. Так как этот способ при быстром поиске в интернете мне найти не удалось, полагаю, эта статья полезна тем, кто столкнулся с такой же проблемой. Далее расскажу о реализации функции на нашем примере.
Изначальные условия — существует форма документа Сообщение, у документа имеется реквизит Вопрос, тип Строка, а также на форме есть связанный элемент с типом Поле ввода.
Задача – проверять текст, введенный пользователем в поле Вопрос.
Скорее всего, это абстрактная ситуация именно то, с чем вы столкнетесь при решении проблемы, примерно такие же исходные данные будут и у вас.
Что нужно сделать – создаем реквизит формы, назовем его ВопросФорматированныйДокумент с типом ФорматированныйДокумент, а также у Поля Ввода Вопрос изменим ПутьКДанным до только что созданного реквизита формы ВопросФорматированныйДокумент
Но нам нужно, чтобы текст, введенный пользователем в это поле, сохранялся в реквизите Документа Вопрос. Для этого напишем в функциях ПриСозданииНаСервере И ПередЗаписью следующий код:
Теперь данные будут корректно сохранятся и повторно выводится на форму при открытии.
На этом все действия закончены. Как по мне, это очень лаконичное решение. Надеюсь, эта статья будет вам полезна. Результат работы проверки орфографии ниже:
Статью подготовил Селютин Никита, программист 1С:Предприятие партнерской сети «ИнфоСофт»
Проверка орфографии в 1С через API Яндекс.Спеллера
Ссылки по теме:
http://avprog.ru/public/81278/ — Интеграция TinyMCE в 1С. (afedorov)
http://avprog.ru/public/22237/ — [TinyMCE] — редактор HTML WYSIWYG кода. (Душелов)
Обработка SpellChecker1С содержит урезанную версию TinyMCE, вырезано практически все, что не нужно для работы проверки орфографии. Не изменяет форматирование текста (сохраняет абзацы/переносы строк).
Из любой формы достаточно вызвать функцию ПроверитьОрфографию и передать ей два параметра указатель на текущую форму и на элемент формы который необходимо проверить.
Для встраивания в вашу конфигурацию необходимо в общем модуле добавить процедуру:
Вставить внешнюю обработку SpellChecker1С и в нужной форме прописать обработку проверки, например как обработку события «Открытие»:
В прикрепленных файлах сама обработка и демоконфигурация с одним документом «Событие» в котором встроена проверка текстовых полей.
Особенности работы ввода по строке в поле ввода
1. Как переопределять работу поля ввода в части ввода по строке
Для переопределения работы поля ввода в части ввода по строке можно обрабатывать события поля ввода «АвтоПодборТекста» и «ОкончаниеВводаТекста».
1.1. Событие АвтоПодборТекста
Событие «АвтоПодборТекста» возникает во время начала ожидания ввода текста (когда в процессе набора текста сделана пауза). При стандартной отработке события происходит поиск по полям, указанным в свойстве «Ввод по строке» соответствующего объекта метаданных. Если найдено единственное значение, то производится автоподстановка окончания текста. Если введенному тексту соответствует несколько значений, то автоподстановки не происходит.
В этом примере при вводе в поле ввода буквы «п» и прерывании редактирования в поле ввода появился слово «пункт», при этом выделена будет его часть «ункт» (начало слова было уже введено и выделение на него не делается):
Выделение выставляется для того, чтобы подставленную часть текста можно было легко заменить следующим действием редактирования, если подставленный текст не подходит. Для отключения стандартного обработчика в значение параметра «СтандартнаяОбработка» записали «Ложь».
1.2. Событие ОкончаниеВводаТекста
Событие «ОкончаниеВводаТекста» вызывается системой в тех случаях, когда по введенному (отредактированному) в поле ввода тексту нужно сформировать значение, соответствующее этому тексту. При этом, если по имеющемуся в поле ввода тексту уже было ранее успешно сформировано значение, нового формирования значения по этому тексту выполняться не будет (т.е. не будет возникать событие «ОкончаниеВводаТекста»).
Необходимость формирования значения по тексту в поле ввода возникает в различных ситуациях, например при переходе из поля ввода к другому элементу управления, нажатии в поле ввода кнопки выбора (клавиша F4) и в ряде других ситуаций.
Стандартный (системный) обработчик события ищет некоторое значение, которое соответствует набранному тексту. Если найдено одно значение – оно сохраняется в качестве значения поля ввода. Если найдено несколько значений – в выпадающем списке предоставляется возможность выбрать из них нужное значение. Если не найдено ни одного значения – выдается сообщение о том, что в элементе управления введены некорректные данные.
В этом примере обеспечивается следующая функциональность для поля ввода: если в поле ввода набрать слово «одежда», то при формировании значения по имеющемуся в поле ввода тексту (например, при переходе из поля ввода к другому элементу управления в форме), пользователю будет предоставлена возможность выбрать одно из двух значений: «Рубашка» или «Брюки»:
— введем в поле ввода слово «одежда»:
— нажмем на клавишу Tab для перехода к следующему элементу управления: при этом появится выпадающий список из двух значений:
— выберем в выпадающем списке первое значение с помощью клавиши «Enter». выбранное значение будет установлено в поле ввода, а мы перейдем к следующему элементу управления:
2. Использование результатов поиска по строке
При поиске значения по тексту могут быть следующие результаты поиска:
· не найдено ни одного значения;
· найдено одно значение;
· найдено больше одного, но не более некоторого количества значений (в системе используется константа — 50 значений);
· найдено некоторое количество значений или больше (т.е. > 50).
В каждом из этих случаев стандартные (системные) обработчики событий «АвтоПодборТекста» и «ОкончаниеВводаТекста» ведут себя определенным образом.
2.1. Работа стандартного (системного) обработчика события АвтоПодборТекста с результатами поиска по строке
1. По имеющемуся в поле ввода тексту ищется одно подходящее значение
2. Значение найдено?
2.1. Получается текстовое представление найденного значения
2.2. В поле ввода дописываются недостающие завершающие символы текстового представления найденного значения.
Пример : пусть поле ввода имеет тип «СправочникСсылка.Номенклатура»; в свойстве «Ввод по строке» указаны поля «Код», «Наименование»; в справочнике есть два элемента с наименованиями «Рубашка», «Брюки»:
Если мы введем воле ввода текст «Ру», он будет дополнен текстом «башка»:
2.2. Устройство механизма преобразования текста в поле ввода в значение и обработчик события ОкончаниеВводаТекста
Рассмотрим процесс формирования значения по тексту, введенному в поле ввода. Ниже приводится алгоритм преобразования текста в поле ввода в значение:
- Начало процесса формирования значения по тексту поля ввода.
- Получение текста из поля ввода.
- Вызов обработчика события «ОкончаниеВводаТекста».
В параметры вызываемой процедуры записывается:
Текст — текст из поля ввода;
Значение — Неопределено. В обработчике события в него можно записать значение или список значений;
СтандартнаяОбработка = Истина. - В обработчике события разрешили выполнение стандартной обработки?
- Через параметр «Значение» вернули список значений?
- Кнопка выбора (клавиша F4) нажата ?
- В переданном списке количество значений больше одного?
- Открытие выпадающего списка в поле ввода и выбор значения из списка. Если в выпадающем списке выбрано значение, оно выставляется в качестве значения в поле ввода, а в качестве текста в поле ввода устанавливается текстовое представление выбранного значения. Если же значение в выпадающем списке не выбрано, состояние поля ввода не меняется.
- В переданном списке храниться только одно значение?
- В качестве значения в поле ввода устанавливается единственное значение из переданного списка. В качестве текста в поле вода устанавливается текстовое представление устанавливаемого значения.
- В параметре «Значение» вернули не список значений, а конкретное значение?
- Установка в поле ввода значения по умолчанию того типа, который сейчас выставлен в поле ввода.
- В качестве значения в поле ввода устанавливается значение параметра «Значение», а в качестве текста — представление устанавливаемого значения.
- Вызов стандартного (системного) обработчика события «ОкончаниеВводаТекста».
- Конец процесса формирования значения по тексту поля ввода.
Из описанного алгоритма видно, что смысл подмены стандартного (системного) обработчика может состоять в том, чтобы сформировать свой список значений из одного и более элементов или одно конкретное значение для поля ввода в зависимости от того текста, который есть в поле ввода.
2.3. Работа стандартного (системного) обработчика события ОкончаниеВводаТекста с результатами поиска по строке
Стандартный (системный) обработчик события «ОкончаниеВводаТекста» работает следующим образом:
- Начало работы стандартного обработчика.
- Получение текста из поля ввода.
- Текст в поле ввода не пустой?
- Формирование списка значений на основе текста из поля ввода. Например — поиск товаров, у которых наименование товара начинается с имеющегося в поле ввода текста.
- В сформированном в пункте 4 списке значений есть элементы?
- Кнопка выбора (клавиша F4) нажата? Это условие проверяется, потому что если она нажата, то будет открываться форма выбора и выпадающих списков появляться не должно.
- В сформированном в пункте 4 списке значений есть только одно значение?
- Устанавливаем единственное значение из списка в поле ввода. В качестве текста в поле ввода устанавливается представление этого значения.
- В сформированном в пункте 4 списке значений более 50 элементов?
- Открывается выпадающий список у поля ввода. В качестве списка значений для него используется список, сформированный в пункте 4. Пользователь может выбрать в этом списке одно из значений.
- Вывод пользователю сообщения о том, что найдено слишком много значений.
- Установка в поле ввода значения по умолчанию того типа, который сейчас выставлен в поле ввода.
- Конец работы стандартного обработчика.
3. Настройка состава и порядка полей, используемых в стандартных (системных) обработчиках событий АвтоПодборТекста и ОкончаниеВводаТекста
Для определения состава полей, используемых стандартными (системными) обработчиками событий » АвтоПодборТекста» и «ОкончаниеВводаТекста» , и их порядка, ряд объектов метаданных поддерживают свойство «Ввод по строке», доступное для редактирования через палитру свойств и в форме редактирования объекта метаданных. К таким объектам метаданных относятся «Справочники», «Документы», «Планы видов характеристик», «Планы счетов», «Планы видов расчета», «Планы обмена», «Бизнес-процессы», «Задачи».
Состав полей объекта метаданных, которые могут участвовать в поиске, состоит из некоторых фиксированных полей и реквизитов, для которых указано, что они строкового или числового типа и их нужно индексировать или индексировать с дополнительным упорядочиванием.
При поиске по строке для числовых полей из строки формируется число, которое затем ищется в базе данных. При поиске по строке для строковых полей ищутся все записи из базы данных, у которых в соответствующем поле хранится текст, начинающийся с искомого.
В качестве значения по умолчанию для свойства «Ввод по строке» в 1С:Предприятии 8 используются следующие поля:
Отметим, что поле используется для поиска по строке только в том случае, если длина поля больше нуля. Так, например, если длина наименования в некотором справочнике равна нулю, то поиск по полю «Наименование» выполняться не будет.
Пример . Есть справочник товаров , описываемых кодом (число), наименованием (строка) и артикулом (строка).
Если принято использование артикулов товаров, можно указать в свойстве «Ввод по строке» поля «Артикул», «Наименование», «Код». При этом в выпадающем списке сначала будут идти товары, у которых в поле «Артикул» хранится хранится текст, начинающийся с введенного текста, затем — товары, у которых в поле «Наименование» хранится текст, начинающийся с введенного текста, затем — товары, у которых в поле «Код» хранится введенное значение (текст из поля ввода интерпретируется как число).
Если использование артикулов товаров не принято, можно указать в свойстве «Ввод по строке» поля » Наименование», » Код». При этом в выпадающем списке сначала будут идти товары, у которых в поле » Наименование» хранится текст, начинающийся с введенного текста, затем — товары, у которых в поле » Код» хранится введенное значение (текст из поля ввода интерпретируется как число).
4. Модальные действия в обработчиках событий АвтоПодборТекста и ОкончаниеВводаТекста
Механизм автоподбора текста в поле ввода и преобразования текста в значение не предусматривает возможности использования разработчиком конфигурации интерактивных действий в обработчиках событий. Кроме того, логика работы стандартных (системных) обработчиков событий достаточно сложная и в обработчиках этих событий не всегда можно узнать, по какому поводу он (обработчик) вызван. Например, обработчик события » ОкончаниеВводаТекста» будет вызываться не только при переходе из поля ввода на другой элемент управления формы, но и при нажатии в поле ввода кнопки выбора (клавиша F4).
Рекомендуется в обработчиках событий » АвтоПодборТекста» и » ОкончаниеВводаТекста» работать исключительно с параметрами обработчиков, формируя нужный текст и значения и отдавая их через параметры обработчиков.
5. Управление механизмом автопоиска и автоподбора с помощью прав
Управлять механизмом автопоиска и автоподбора можно на уровне прав пользователей. Для этого в списке прав для различных объектов метаданных существует право «Ввод по строке».
Если у пользователя нет права на ввод по строке для соответствующего объекта метаданных , в поле ввода запрещается редактирование текста и работа механизма автопоиска и автоподбора блокируется.
6. Работа механизма автопоиска и автоподбора с правами на уровне записей
Данные, используемые системой в обработчиках событий автопоиска и автоподбора, могут иметь ограничения на доступ к ним. Достичь этого можно с помощью механизма ограничения прав доступа к данным на уровне записей. В этой ситуации сама платформа 1С:Предприятие 8 выбирает только разрешенные записи и дополнительной поддержки на уровне обработчиков событий для этого не требуется.
Если же есть необходимость поиска подходящих данных в обработчиках событий автопоиска и автоподбора, в запросе нужно использовать служебное слово «РАЗРЕШЕННЫЕ», указывающее, что при встрече данных, доступ к которым ограничен, нужно их просто пропускать: в противном случае будет выдана ошибка времени исполнения.
http://avprog.ru/public/1988/
http://its.1c.ru/db/content/metod8dev/src/platform81/metod/form/i8102207.htm