Как настроить полнотекстовый поиск с транслитерацией (латиница в кириллицу) при вводе в полях формы?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Почему поиск в поле и глобальный поиск работают по-разному?

Первое, что нужно понять — это фундаментальное различие между двумя механизмами поиска в 1С:

  1. Глобальный полнотекстовый поиск (Ctrl+Shift+F). Это мощный инструмент, который работает на основе предварительно созданного индекса. Этот индекс хранит не только исходные слова, но и их различные формы (морфология), а также учитывает транслитерацию (преобразование символов из одной раскладки в другую) и замещение (похожие по написанию символы). Именно поэтому при глобальном поиске запрос "ogurec" успешно находит "огурец". Система заранее подготовила индекс и "знает", что это одно и то же.
  2. Ввод по строке. Это механизм, который срабатывает, когда вы начинаете вводить текст в поле для выбора ссылки (например, в поле "Контрагент" в документе). Этот поиск оптимизирован для скорости и простоты. Хотя он может использовать полнотекстовый индекс, его логика по умолчанию часто проще. Он ищет по первым символам, по вхождению строки и не всегда задействует сложные алгоритмы транслитерации и синонимов, если это не было явно запрограммировано.

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

Что насчет дополнительных словарей?

В платформе 1С у конфигурации есть свойство Дополнительные словари полнотекстового поиска. Может показаться, что это идеальное место для настройки наших правил. Однако это не так. Эти словари предназначены для другого:

Они не являются инструментом для ручной настройки правил транслитерации вроде "g" -> "г" или поддержки специфических символов, например, польского алфавита. Для нашей задачи этот механизм не подходит.

Решение: перехват поиска в модуле менеджера

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

Рассмотрим по шагам, как это сделать на примере справочника "Номенклатура".

  1. Включаем полнотекстовый поиск для объекта.

    Убедитесь, что для нужного справочника и его реквизитов (например, "Наименование") в конфигураторе включено использование полнотекстового поиска. Без этого дальнейшие шаги не будут работать. Не забудьте обновить индекс после внесения изменений (Администрирование -> Обслуживание -> Управление полнотекстовым поиском).

  2. Открываем модуль менеджера.

    В дереве конфигурации найдите нужный справочник (например, Справочники.Номенклатура), нажмите на него правой кнопкой мыши и выберите "Открыть модуль менеджера".

  3. Создаем обработчик события.

    В модуле менеджера нужно создать процедуру-обработчик с именем ОбработкаПолученияДанныхВыбора.

    
    Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
        
        // Здесь будет наш код
        
    КонецПроцедуры
    
  4. Пишем логику поиска.

    Теперь самое интересное. Нам нужно выполнить несколько действий внутри этой процедуры.

    Шаг 1. Отключаем стандартную обработку. Чтобы платформа не выполняла свой стандартный поиск после нашего, первой строкой кода ставим:

    СтандартнаяОбработка = Ложь;

    Шаг 2. Получаем строку поиска. Текст, который ввел пользователь, находится в параметрах. Добавим проверку, что строка не пустая.

    
    СтрокаПоиска = Параметры.СтрокаПоиска;
    Если НЕ ЗначениеЗаполнено(СтрокаПоиска) Тогда
        Возврат;
    КонецЕсли;
    

    Шаг 3. Используем объект ПолнотекстовыйПоиск. Вместо того чтобы вручную формировать запросы с `ПОДОБНО`, мы воспользуемся мощью платформенного ППС. Это позволит искать все словоформы и использовать индекс, что гораздо производительнее.

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

    Важный момент: полнотекстовый поиск в 1С ищет по началу слов. Поэтому, чтобы найти вхождение строки в любом месте, к ней нужно добавить оператор `*`.

    Шаг 4. Собираем все вместе.

    Итоговый код в модуле менеджера будет выглядеть так:

    
    Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
        // Проверяем, что поиск вообще есть и он не по пустой строке
        Если НЕ Параметры.Свойство("СтрокаПоиска") 
            Или НЕ ЗначениеЗаполнено(Параметры.СтрокаПоиска) Тогда
            Возврат;
        КонецЕсли;
    
        // Отключаем стандартный поиск, так как мы реализуем свой
        СтандартнаяОбработка = Ложь;
        
        // Добавляем оператор "*" для поиска по вхождению, а не только по началу строки.
        // Это стандартный синтаксис для полнотекстового поиска 1С.
        СтрокаПоиска = "*" + Параметры.СтрокаПоиска + "*";
        
        // Формируем список объектов для поиска
        ОбъектыПоиска = Новый Массив;
        ОбъектыПоиска.Добавить(Метаданные.Справочники.Номенклатура);
        
        // Используем штатный объект ППС для получения списка ссылок
        // Система сама выполнит транслитерацию и поиск по словоформам
        СписокНайденных = ПолнотекстовыйПоиск.СоздатьСписок(ОбъектыПоиска, СтрокаПоиска, 20); // Ограничим выборку 20 элементами
        
        // Помещаем результат в параметр "ДанныеВыбора"
        ДанныеВыбора = СписокНайденных;
        
    КонецПроцедуры
    

Что делать, если нужна поддержка специфических символов (например, польских)?

Стандартный механизм транслитерации 1С может не покрывать все необходимые вам символы. В этом случае логику можно усложнить. Перед вызовом ПолнотекстовыйПоиск.СоздатьСписок() вы можете вручную подготовить несколько вариантов поисковой строки.

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

Пример такой доработки:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

    Если НЕ Параметры.Свойство("СтрокаПоиска") 
        Или НЕ ЗначениеЗаполнено(Параметры.СтрокаПоиска) Тогда
        Возврат;
    КонецЕсли;

    СтандартнаяОбработка = Ложь;
    
    // Получаем исходную строку
    ИсходнаяСтрока = Параметры.СтрокаПоиска;
    
    // Создаем вторую строку с заменой польских символов
    // Это упрощенный пример, логику замены нужно реализовать более полно
    СтрокаСЗаменой = СтрЗаменить(ИсходнаяСтрока, "ł", "l");
    СтрокаСЗаменой = СтрЗаменить(СтрокаСЗаменой, "ń", "n");
    // ... и так далее для всех нужных символов
    
    // Формируем поисковое выражение с оператором "ИЛИ"
    // чтобы искался любой из вариантов
    Если ИсходнаяСтрока = СтрокаСЗаменой Тогда
        СтрокаПоиска = "*" + ИсходнаяСтрока + "*";
    Иначе
        СтрокаПоиска = "(*" + ИсходнаяСтрока + "*) ИЛИ (*" + СтрокаСЗаменой + "*)";
    КонецЕсли;
    
    ОбъектыПоиска = Новый Массив;
    ОбъектыПоиска.Добавить(Метаданные.Справочники.Номенклатура);
    
    СписокНайденных = ПолнотекстовыйПоиск.СоздатьСписок(ОбъектыПоиска, СтрокаПоиска, 20);
    
    ДанныеВыбора = СписокНайденных;
    
КонецПроцедуры

Такой подход дает полный контроль над логикой поиска. Хотя он и требует написания кода, это не "костыль" или "говнокод", а штатный механизм расширения функциональности платформы, предусмотренный разработчиками 1С. Главное — помнить о производительности и всегда поддерживать полнотекстовый индекс в актуальном состоянии.

← На главную