При работе с системой 1С:Предприятие 8, особенно в конфигурации 1С:Управление торговлей 11 (УТ 11), пользователи часто сталкиваются с необходимостью быстрого поиска информации в справочниках и документах. Полнотекстовый поиск (ППД) призван значительно упростить эту задачу, позволяя находить данные по словам, фразам и их частям. Однако иногда возникает ситуация, когда поиск по части слова, например, по середине или концу наименования, не дает ожидаемых результатов, даже если соответствующие настройки включены. Давайте разберем, почему это происходит и как можно решить эту проблему.
Прежде чем перейти к решению проблемы, нам важно понять основные принципы работы полнотекстового поиска в 1С:Предприятии 8.
Обновление индекса ППД: Это задание сканирует базу данных на предмет изменений в индексируемых объектах и добавляет новые или измененные данные в индекс.Слияние индекса ППД: Это задание оптимизирует структуру индекса, объединяя различные части и удаляя устаревшие записи, что повышает производительность поиска.Если эти регламентные задания не настроены или работают некорректно, индекс может стать неактуальным, и поиск не будет находить даже существующие данные.
*). Например, запрос *казчик* позволит найти "Тестовый заказчик". Однако для типовых полей ввода в формах списка или выбора такой прямой ввод может быть неудобен или не предусмотрен.Давайте пошагово разберем, как диагностировать и решить проблему с полнотекстовым поиском по части слова.
Проверка и обновление индекса полнотекстового поиска.
Обновление индекса ППД и Слияние индекса ППД в "Администрирование" -> "Обслуживание" -> "Регламентные и фоновые задания". Убедитесь, что они выполняются по расписанию и завершаются без ошибок.Наш опыт показывает, что часто проблема исчезает после полного перестроения индекса. Однако, как видим из сообщений форума, автор выполнял эти действия несколько раз, и это не привело к решению для части слова.
Тестирование поиска.
После обновления индекса протестируйте поиск:
Автор в сообщении 4 подтвердил: "При вводе "Тесто"- не находит. Если ввести "Тестовый" - находит." и "Для теста создал нового клиент и его не находило даже с полным наименованием, обновил индекс, ввел полное наименование и нашлось. Т.е с индексом точно все в порядке." Это очень важная информация, указывающая на то, что проблема не в актуальности индекса как таковой, а в логике поиска по части слова.
Настройки полнотекстового поиска в конфигурации.
Проверка отключения полнотекстового поиска.
В некоторых случаях, если полнотекстовый поиск отключен, 1С может использовать упрощенный механизм поиска по началу строки, который иногда работает более предсказуемо для простых случаев. Автор в сообщении 9 отмечает: "У вас на демо скорее всего отключен полнотекстовый поиск. Если отключить то в принципе находит." Это косвенно указывает на то, что включенный полнотекстовый поиск может вносить свои особенности в логику поиска, которые приводят к нежелательному результату для "части слова".
Если все вышеперечисленные шаги не привели к решению, наиболее вероятной причиной является программное вмешательство в стандартный механизм выбора и поиска. Это распространенная практика в типовых конфигурациях 1С, когда разработчики переопределяют стандартное поведение для специфических бизнес-задач.
Модуль менеджера справочника: функция ОбработкаПолученияДанныхВыбора.
Самое первое место, куда следует посмотреть при проблемах с поиском и выбором в формах списка и выбора, это модуль менеджера соответствующего справочника (в нашем случае - справочник "Партнеры"). В этом модуле часто переопределяется стандартное поведение с помощью функции ОбработкаПолученияДанныхВыбора.
Эта процедура предназначена для того, чтобы разработчик мог перехватить стандартное формирование списка выбора и сформировать свой собственный список, используя, например, произвольные запросы. Если в этой процедуре установлен флаг СтандартнаяОбработка = Ложь или если там формируется собственный запрос, то стандартный полнотекстовый поиск, который использует платформа, просто не будет задействован. Вместо него будет работать тот механизм, который реализован непосредственно в этой функции.
Как это может выглядеть в коде:
Процедура ОбработкаПолученияДанныхВыбора(ПараметрыВыбора, СтандартнаяОбработка) Экспорт
// Ищем строку поиска, если она передана в ПараметрыВыбора
СтрокаПоиска = "";
Если ТипЗнч(ПараметрыВыбора) = Тип("Структура") И ПараметрыВыбора.Свойство("СтрокаПоиска") Тогда
СтрокаПоиска = ПараметрыВыбора.СтрокаПоиска;
КонецЕсли;
Если Не ПустаяСтрока(СтрокаПоиска) Тогда
// *************************************************************
// ВНИМАНИЕ: Если здесь есть код, который устанавливает
// СтандартнаяОбработка = Ложь, это перехватывает стандартный поиск.
// *************************************************************
СтандартнаяОбработка = Ложь;
// Теперь мы должны сформировать наш собственный список выбора.
// Если здесь используется запрос БЕЗ оператора ПОДОБНО %...%,
// то поиск по части слова работать не будет.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Партнеры.Ссылка КАК Ссылка,
| Партнеры.Наименование КАК Представление
|ИЗ
| Справочник.Партнеры КАК Партнеры
|ГДЕ
| Партнеры.ПометкаУдаления = ЛОЖЬ
| И Партнеры.Наименование НАЧИНАЕТСЯ С &СтрокаПоиска
|
|УПОРЯДОЧИТЬ ПО
| Представление
|АВТОУПОРЯДОЧИВАНИЕ"; // Может быть и без АВТОУПОРЯДОЧИВАНИЕ
// В этом примере, если используется "НАЧИНАЕТСЯ С",
// поиск по части слова не будет работать.
// Нужно заменить на ПОДОБНО для поиска по части.
Запрос.УстановитьПараметр("СтрокаПоиска", СтрокаПоиска);
Результат = Запрос.Выполнить().Выгрузить();
// Передаем полученный результат в ПараметрыВыбора.
// Система будет использовать его для отображения списка выбора.
ПараметрыВыбора.ДополнительныеСвойства.Вставить("СписокВыбора", Результат);
КонецЕсли;
КонецПроцедуры
Мы видим, что в сообщении 11 автор получает прямой и очень важный совет: "Смотрите модуль менеджера справочника, который выбираете Функция ОбработкаПолученияДанныхВыбора - там идет переопределение". Это, вероятно, и является основной причиной проблемы, так как именно здесь могли изменить логику поиска. Для быстрого исправления этой проблемы в УТ 11 можно использовать расширение для подбора партнеров по любой части наименования.
Динамический список с произвольным запросом.
Если форма списка справочника или форма выбора использует динамический список, основанный на произвольном запросе, то поведение поиска также может быть изменено. Стандартный полнотекстовый поиск платформы работает с объектами метаданных и их полями, но если список формируется сложным запросом, то механизм ППД может не применяться или работать не так, как ожидается. В этом случае, возможно, потребуется внести изменения в сам запрос, используемый динамическим списком, чтобы включить логику поиска по части слова.
Если выяснилось, что стандартный полнотекстовый поиск либо не работает должным образом из-за программных ограничений, либо не удовлетворяет специфическим требованиям, мы можем реализовать свой собственный механизм поиска с использованием запросов 1С.
Когда необходимо использовать свой механизм.
Реализация собственного поиска актуальна, если:
ОбработкаПолученияДанныхВыбора и хотите изменить его логику.Именно к такому выводу приходит автор в сообщении 10: "Видимо придется пилить через запрос с "подобно"".
Оператор ПОДОБНО (LIKE) в запросах 1С.
Для поиска по части слова в запросах 1С используется оператор ПОДОБНО (аналог SQL LIKE). Этот оператор позволяет использовать подстановочные символы:
% (процент) – любое количество любых символов (включая ноль)._ (подчеркивание) – один любой символ.Чтобы найти "казчик" в "Тестовый заказчик", нам потребуется использовать % в начале и конце искомой строки.
Пример использования ПОДОБНО для поиска по части слова.
Предположим, мы хотим получить список партнеров, наименование которых содержит введенную пользователем строку. Мы можем создать следующий запрос:
// В какой-то процедуре или функции, где нужно получить список партнеров
// Например, в ОбработкаПолученияДанныхВыбора после установки СтандартнаяОбработка = Ложь;
СтрокаВводаПользователя = "казчик"; // Это то, что ввел пользователь в поле поиска
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СправочникПартнеры.Ссылка КАК Ссылка,
| СправочникПартнеры.Наименование КАК Представление
|ИЗ
| Справочник.Партнеры КАК СправочникПартнеры
|ГДЕ
| СправочникПартнеры.ПометкаУдаления = ЛОЖЬ
| И СправочникПартнеры.Наименование ПОДОБНО &СтрокаПоиска
|
|УПОРЯДОЧИТЬ ПО
| Представление";
// Формируем параметр для запроса, добавляя подстановочные символы
СтрокаПоискаДляЗапроса = "%" + СтрокаВводаПользователя + "%";
Запрос.УстановитьПараметр("СтрокаПоиска", СтрокаПоискаДляЗапроса);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// Теперь РезультатЗапроса содержит список партнеров,
// наименование которых включает "казчик" в любой части.
// Этот результат можно использовать для заполнения списка выбора.
Если мы обнаружили, что в функции ОбработкаПолученияДанныхВыбора используется запрос, который не применяет ПОДОБНО с подстановочными символами, мы можем модифицировать этот запрос, чтобы обеспечить поиск по части слова.
При работе с полнотекстовым поиском и запросами важно также учитывать следующие моменты:
ПОДОБНО, эта функциональность теряется, и её придется реализовывать самостоятельно, что значительно усложнит код.Таким образом, решение проблемы поиска по части слова в 1С:УТ 11 может лежать как в плоскости корректной настройки и индексации полнотекстового поиска, так и в более глубоком анализе программного кода конфигурации, особенно функции ОбработкаПолученияДанныхВыбора. В случае программного переопределения стандартного поведения, реализация собственного поиска с использованием оператора ПОДОБНО становится эффективным и контролируемым решением. Для экономии времени на ручную разработку можно использовать готовое расширение для поиска объектов в 1С по произвольной части строки.