Как настроить полнотекстовый поиск по части слова в 1С:Управление торговлей 11 и что делать, если он не работает?

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

При работе с системой 1С:Предприятие 8, особенно в конфигурации 1С:Управление торговлей 11 (УТ 11), пользователи часто сталкиваются с необходимостью быстрого поиска информации в справочниках и документах. Полнотекстовый поиск (ППД) призван значительно упростить эту задачу, позволяя находить данные по словам, фразам и их частям. Однако иногда возникает ситуация, когда поиск по части слова, например, по середине или концу наименования, не дает ожидаемых результатов, даже если соответствующие настройки включены. Давайте разберем, почему это происходит и как можно решить эту проблему.

Понимание работы полнотекстового поиска в 1С

Прежде чем перейти к решению проблемы, нам важно понять основные принципы работы полнотекстового поиска в 1С:Предприятии 8.

  1. Индексация: основа ППД. Полнотекстовый поиск функционирует на базе специального индекса, который представляет собой структурированное хранилище всех слов и фраз из индексируемых объектов (справочников, документов, регистров сведений и т.д.). Этот индекс позволяет системе мгновенно находить нужную информацию, не перебирая все данные базы.
  2. Регламентные задания для актуальности индекса. Индекс не формируется однократно. Он нуждается в регулярном обновлении, чтобы отражать все изменения, происходящие в базе данных. За это отвечают регламентные задания:
    • Обновление индекса ППД: Это задание сканирует базу данных на предмет изменений в индексируемых объектах и добавляет новые или измененные данные в индекс.
    • Слияние индекса ППД: Это задание оптимизирует структуру индекса, объединяя различные части и удаляя устаревшие записи, что повышает производительность поиска.

    Если эти регламентные задания не настроены или работают некорректно, индекс может стать неактуальным, и поиск не будет находить даже существующие данные.

  3. "Любая часть слова" и ее особенности. Начиная с платформы 8.3.3, в 1С появился механизм, позволяющий искать по любой части в строке. Для его активации необходимо установить соответствующее свойство для справочника или в общих настройках полнотекстового поиска. По умолчанию способ поиска по строке может быть установлен в значение "Начало", что означает поиск только по первым символам слова.
  4. Поиск по подстроке и подстановочные символы. Важно понимать, что полнотекстовый поиск в 1С по умолчанию всегда ищет с начала слова. Это означает, что если вы вводите "казчик" для поиска "Тестовый заказчик", без специальных указаний система может не найти результат. Для поиска по части слова, которая не является его началом, необходимо использовать подстановочные символы, такие как звездочка (*). Например, запрос *казчик* позволит найти "Тестовый заказчик". Однако для типовых полей ввода в формах списка или выбора такой прямой ввод может быть неудобен или не предусмотрен.
  5. Версии полнотекстового поиска. В 1С существуют две версии полнотекстового поиска. Версия 2, появившаяся в более поздних версиях платформы, обладает расширенными возможностями, но требует клиент-серверного варианта базы данных и не работает в файловом режиме (за исключением автономного сервера).
  6. Настройки извлечения текстов. В окне настроек полнотекстового поиска (обычно "Администрирование" - "Общие настройки" - "Поиск данных" - "Настроить") необходимо проверить пункт "Автоматическое извлечение текстов" и убедиться, что выбрана правильная операционная система (Windows или Linux). Изменение этой настройки может потребовать очистки и обновления индекса.
  7. Ограничения индексируемых данных. По умолчанию может быть установлено ограничение на максимальный размер индексируемых данных (например, 1 Мб). Это может влиять на полноту индекса и, как следствие, на результаты поиска, если тексты слишком большие.

Шаги по диагностике и устранению проблемы

Давайте пошагово разберем, как диагностировать и решить проблему с полнотекстовым поиском по части слова.

  1. Проверка и обновление индекса полнотекстового поиска.

    • Актуальность индекса: Убедитесь, что индекс ППД актуален. Перейдите в раздел "Администрирование" -> "Общие настройки" -> "Поиск данных". Здесь вы увидите информацию о состоянии индекса.
    • Ручное обновление: Попробуйте выполнить обновление индекса вручную. Для этого нажмите кнопку "Обновить индекс". Дождитесь завершения процесса.
    • Переформирование индекса: Если простое обновление не помогло, попробуйте полностью удалить индекс и создать его заново. Для этого в том же разделе нажмите "Очистить индекс", а затем "Обновить индекс". Это может занять значительное время, особенно для больших баз.
    • Регламентные задания: Проверьте, активны ли регламентные задания Обновление индекса ППД и Слияние индекса ППД в "Администрирование" -> "Обслуживание" -> "Регламентные и фоновые задания". Убедитесь, что они выполняются по расписанию и завершаются без ошибок.

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

  2. Тестирование поиска.

    После обновления индекса протестируйте поиск:

    • Попробуйте найти полное наименование, например, "Тестовый заказчик". Если и это не находится, значит, проблема глубже, возможно, с самим механизмом индексирования или доступом к данным.
    • Попробуйте найти по началу слова, например, "Тесто". Если это работает, а "казчик" — нет, то мы имеем дело именно с проблемой поиска по произвольной части слова, а не с общей неработоспособностью ППД.
    • Попробуйте ввести "Тестовый*" (с символом звездочки в конце). Если такой поиск работает, это указывает на то, что система ожидает явного указания подстановочного символа для поиска по части слова.

    Автор в сообщении 4 подтвердил: "При вводе "Тесто"- не находит. Если ввести "Тестовый" - находит." и "Для теста создал нового клиент и его не находило даже с полным наименованием, обновил индекс, ввел полное наименование и нашлось. Т.е с индексом точно все в порядке." Это очень важная информация, указывающая на то, что проблема не в актуальности индекса как таковой, а в логике поиска по части слова.

  3. Настройки полнотекстового поиска в конфигурации.

    • Свойства справочника: Откройте конфигуратор, найдите нужный справочник (например, "Партнеры"). Проверьте свойства объекта: в разделе "Полнотекстовый поиск" должны быть установлены галочки для индексации. Также проверьте настройки поиска по строке для полей, по которым ведется поиск (например, "Наименование").
    • "Любая часть" для ППД: Убедитесь, что в общих настройках полнотекстового поиска (Администрирование -> Общие настройки -> Поиск данных -> Настроить) установлен соответствующий флажок для поиска по "любой части слова", если он доступен в вашей версии платформы.
  4. Проверка отключения полнотекстового поиска.

    В некоторых случаях, если полнотекстовый поиск отключен, 1С может использовать упрощенный механизм поиска по началу строки, который иногда работает более предсказуемо для простых случаев. Автор в сообщении 9 отмечает: "У вас на демо скорее всего отключен полнотекстовый поиск. Если отключить то в принципе находит." Это косвенно указывает на то, что включенный полнотекстовый поиск может вносить свои особенности в логику поиска, которые приводят к нежелательному результату для "части слова".

Анализ программных ограничений – ключевой этап

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

  1. Модуль менеджера справочника: функция ОбработкаПолученияДанныхВыбора.

    Самое первое место, куда следует посмотреть при проблемах с поиском и выбором в формах списка и выбора, это модуль менеджера соответствующего справочника (в нашем случае - справочник "Партнеры"). В этом модуле часто переопределяется стандартное поведение с помощью функции ОбработкаПолученияДанныхВыбора.

    Эта процедура предназначена для того, чтобы разработчик мог перехватить стандартное формирование списка выбора и сформировать свой собственный список, используя, например, произвольные запросы. Если в этой процедуре установлен флаг СтандартнаяОбработка = Ложь или если там формируется собственный запрос, то стандартный полнотекстовый поиск, который использует платформа, просто не будет задействован. Вместо него будет работать тот механизм, который реализован непосредственно в этой функции.

    Как это может выглядеть в коде:

    
    Процедура ОбработкаПолученияДанныхВыбора(ПараметрыВыбора, СтандартнаяОбработка) Экспорт
    
        // Ищем строку поиска, если она передана в ПараметрыВыбора
        СтрокаПоиска = "";
        Если ТипЗнч(ПараметрыВыбора) = Тип("Структура") И ПараметрыВыбора.Свойство("СтрокаПоиска") Тогда
            СтрокаПоиска = ПараметрыВыбора.СтрокаПоиска;
        КонецЕсли;
    
        Если Не ПустаяСтрока(СтрокаПоиска) Тогда
            // *************************************************************
            // ВНИМАНИЕ: Если здесь есть код, который устанавливает
            // СтандартнаяОбработка = Ложь, это перехватывает стандартный поиск.
            // *************************************************************
            СтандартнаяОбработка = Ложь; 
    
            // Теперь мы должны сформировать наш собственный список выбора.
            // Если здесь используется запрос БЕЗ оператора ПОДОБНО %...%,
            // то поиск по части слова работать не будет.
            Запрос = Новый Запрос;
            Запрос.Текст = 
            "ВЫБРАТЬ 
            |    Партнеры.Ссылка КАК Ссылка,
            |    Партнеры.Наименование КАК Представление
            |ИЗ 
            |    Справочник.Партнеры КАК Партнеры
            |ГДЕ
            |    Партнеры.ПометкаУдаления = ЛОЖЬ
            |    И Партнеры.Наименование НАЧИНАЕТСЯ С &СтрокаПоиска
            |
            |УПОРЯДОЧИТЬ ПО
            |    Представление
            |АВТОУПОРЯДОЧИВАНИЕ"; // Может быть и без АВТОУПОРЯДОЧИВАНИЕ
    
            // В этом примере, если используется "НАЧИНАЕТСЯ С",
            // поиск по части слова не будет работать.
            // Нужно заменить на ПОДОБНО для поиска по части.
            Запрос.УстановитьПараметр("СтрокаПоиска", СтрокаПоиска);
            
            Результат = Запрос.Выполнить().Выгрузить();
            
            // Передаем полученный результат в ПараметрыВыбора.
            // Система будет использовать его для отображения списка выбора.
            ПараметрыВыбора.ДополнительныеСвойства.Вставить("СписокВыбора", Результат); 
        КонецЕсли;
    
    КонецПроцедуры
    

    Мы видим, что в сообщении 11 автор получает прямой и очень важный совет: "Смотрите модуль менеджера справочника, который выбираете Функция ОбработкаПолученияДанныхВыбора - там идет переопределение". Это, вероятно, и является основной причиной проблемы, так как именно здесь могли изменить логику поиска. Для быстрого исправления этой проблемы в УТ 11 можно использовать расширение для подбора партнеров по любой части наименования.

  2. Динамический список с произвольным запросом.

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

Альтернативное решение: реализация поиска с помощью запроса

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

  1. Когда необходимо использовать свой механизм.

    Реализация собственного поиска актуальна, если:

    • Стандартный ППД не настраивается или конфликтует с существующим кодом.
    • Требуется очень специфичная логика поиска (например, по нескольким полям с особыми условиями).
    • Производительность ППД в конкретном сценарии недостаточна (хотя обычно ППД быстрее).
    • Вы обнаружили переопределение в ОбработкаПолученияДанныхВыбора и хотите изменить его логику.

    Именно к такому выводу приходит автор в сообщении 10: "Видимо придется пилить через запрос с "подобно"".

  2. Оператор ПОДОБНО (LIKE) в запросах 1С.

    Для поиска по части слова в запросах 1С используется оператор ПОДОБНО (аналог SQL LIKE). Этот оператор позволяет использовать подстановочные символы:

    • % (процент) – любое количество любых символов (включая ноль).
    • _ (подчеркивание) – один любой символ.

    Чтобы найти "казчик" в "Тестовый заказчик", нам потребуется использовать % в начале и конце искомой строки.

  3. Пример использования ПОДОБНО для поиска по части слова.

    Предположим, мы хотим получить список партнеров, наименование которых содержит введенную пользователем строку. Мы можем создать следующий запрос:

    
    // В какой-то процедуре или функции, где нужно получить список партнеров
    // Например, в ОбработкаПолученияДанныхВыбора после установки СтандартнаяОбработка = Ложь;
    
    СтрокаВводаПользователя = "казчик"; // Это то, что ввел пользователь в поле поиска
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
        |    СправочникПартнеры.Ссылка КАК Ссылка,
        |    СправочникПартнеры.Наименование КАК Представление
        |ИЗ
        |    Справочник.Партнеры КАК СправочникПартнеры
        |ГДЕ
        |    СправочникПартнеры.ПометкаУдаления = ЛОЖЬ
        |    И СправочникПартнеры.Наименование ПОДОБНО &СтрокаПоиска
        |
        |УПОРЯДОЧИТЬ ПО
        |    Представление";
    
    // Формируем параметр для запроса, добавляя подстановочные символы
    СтрокаПоискаДляЗапроса = "%" + СтрокаВводаПользователя + "%"; 
    Запрос.УстановитьПараметр("СтрокаПоиска", СтрокаПоискаДляЗапроса);
    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    // Теперь РезультатЗапроса содержит список партнеров,
    // наименование которых включает "казчик" в любой части.
    // Этот результат можно использовать для заполнения списка выбора.
    

    Если мы обнаружили, что в функции ОбработкаПолученияДанныхВыбора используется запрос, который не применяет ПОДОБНО с подстановочными символами, мы можем модифицировать этот запрос, чтобы обеспечить поиск по части слова.

Дополнительные аспекты и советы

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

Таким образом, решение проблемы поиска по части слова в 1С:УТ 11 может лежать как в плоскости корректной настройки и индексации полнотекстового поиска, так и в более глубоком анализе программного кода конфигурации, особенно функции ОбработкаПолученияДанныхВыбора. В случае программного переопределения стандартного поведения, реализация собственного поиска с использованием оператора ПОДОБНО становится эффективным и контролируемым решением. Для экономии времени на ручную разработку можно использовать готовое расширение для поиска объектов в 1С по произвольной части строки.

← На главную