Каждый из нас, кто работал с конфигурациями «1С:Комплексная автоматизация 2.4» или «1С:ERP Управление предприятием 2.4», наверняка сталкивался с неприятной ситуацией: при попытке найти контрагента в документе по его названию система выдает совершенно не то, что нужно. Например, мы вводим поисковый запрос "спец", ожидая увидеть компании, названия которых начинаются на это слово (например, «СпецМонтаж», «СпецТехника»). Вместо этого программа предлагает нам список контрагентов вроде «Газойл Корпорация ЗАО», «СИТИ-МОБИЛЬНИК ООО» или «Арондопаг ЗДТ», в названиях которых буквосочетания "спец" нет и в помине. При этом внизу формы скромно висит надпись: «Слишком много результатов...».
В этой статье мы подробно разберем, почему встроенный полнотекстовый поиск (ПП) в платформе «1С:Предприятие» ведет себя подобным образом, выясним технические причины этой проблемы и рассмотрим практические варианты ее решения как без изменения кода, так и с помощью программных доработок.
---
Давайте проанализируем внутренние механизмы работы конфигурации. Начиная с версии ERP и КА 2.4, разработчики фирмы «1С» кардинально переработали механизмы автоподбора в полях ввода. За поиск партнеров и контрагентов отвечает специализированный метод ПартнерыДанныеВыбора, расположенный в общем модуле ПартнерыИКонтрагентыВызовСервера.
Когда в системе включен полнотекстовый поиск, подбор по строке начинает работать по следующим правилам:
Наименование самого справочника Партнеры или Контрагенты. В поисковый индекс попадают все связанные объекты: договоры контрагентов, соглашения, контактная информация (адреса, телефоны, email), а также спецификации к договорам.ПартнерыДанныеВыбора имеет внутреннее ограничение на количество возвращаемых элементов. Как правило, этот лимит составляет 50 записей. Это сделано для оптимизации производительности интерфейса и предотвращения зависания клиентского приложения."спец", полнотекстовый поиск находит совпадения во всех проиндексированных данных. Слово "специальный" или "спецификация" встречается в сотнях договоров и соглашений самых разных контрагентов. Поиск выбирает первые 50 совпадений по договорам и полностью забивает ими лимит выдачи. В результате реальные партнеры, чьи имена действительно начинаются на "Спец", физически не успевают попасть в эту выборку и отбрасываются системой.Мы получаем парадокс: механизм, разработанный для упрощения поиска по всей базе, делает стандартный ввод по строке в документах практически неработоспособным.
---
Если вы хотите сохранить глобальный полнотекстовый поиск по всей базе данных (через общую строку поиска в шапке программы), но желаете вернуть классический и предсказуемый поиск в полях выбора документов, лучшим решением будет точечное отключение ПП для конкретных справочников в Конфигураторе.
Рассмотрим, как это сделать по шагам:
Партнеры и откройте его свойства.Использовать. Нам необходимо изменить его на Не использовать.Контрагенты.Что изменится? Теперь при вводе названия компании в поле «Клиент» или «Поставщик» в документах система больше не будет обращаться к полнотекстовому индексу. Она выполнит стандартный быстрый запрос к СУБД по началу строки, ИНН или коду. Поиск мгновенно станет точным и предсказуемым, а глобальный поиск по всей базе по-прежнему будет доступен.
---
Если ваша конфигурация находится на официальной поддержке и вносить изменения непосредственно в основную конфигурацию нежелательно, мы можем решить проблему с помощью механизма расширений.
Давайте проанализируем, как можно модифицировать логику работы метода ПартнерыДанныеВыбора. Наша задача — принудительно заставить систему искать совпадения по подстроке (используя оператор ПОДОБНО или аналог) в обход стандартного ПП, если мы понимаем, что пользователь ищет конкретное наименование.
Создадим расширение и добавим в него модуль ПартнерыИКонтрагентыВызовСервера. Перехватим функцию ПартнерыДанныеВыбора с помощью аннотации &Вместо:
&Вместо("ПартнерыДанныеВыбора")
Функция Икс_ПартнерыДанныеВыбора(ЗначениеПоиска, ПараметрыВыбора, Выборка)
// Если поиск пустой, возвращаем стандартное поведение
Если ПустаяСтрока(ЗначениеПоиска) Тогда
Возврат ПродолжитьВызов(ЗначениеПоиска, ПараметрыВыбора, Выборка);
КонецЕсли;
// Проверяем, не является ли значение поиска ИНН или телефоном
ЭтоИНН = ТолькоЦифры(ЗначениеПоиска);
Если Не ЭтоИНН Тогда
// Подменяем логику: принудительно подставляем шаблоны для поиска по подстроке
// Это заставит систему использовать LIKE в SQL-запросе к СУБД
СтрокаПоискаМодифицированная = "%" + ЗначениеПоиска + "%";
// Здесь мы можем перенаправить выполнение на собственный облегченный запрос,
// который ищет исключительно по наименованию партнера, игнорируя договоры
РезультатТаблица = ВыполнитьОблегченныйПоискПартнеров(СтрокаПоискаМодифицированная);
Если РезультатТаблица.Количество() > 0 Тогда
Возврат РезультатТаблица;
КонецЕсли;
КонецЕсли;
// Если наши кастомные методы не дали результата, возвращаем стандартный вызов
Возврат ПродолжитьВызов(ЗначениеПоиска, ПараметрыВыбора, Выборка);
КонецФункции
Использование этого кода гарантирует, что система в первую очередь выполнит поиск по наименованию партнера в базе данных, используя стандартные индексы СУБД, а не замусоренный полнотекстовый индекс договоров.
---
Иногда проблема кроется не в самой логике конфигурации, а в техническом сбое работы службы полнотекстового поиска платформы «1С:Предприятие». Со временем индекс может разрушаться, забиваться неактуальными данными или зависать из-за сбоев в работе фоновых регламентных заданий.
Если вы хотите восстановить корректную работу ПП в целом, выполните следующие шаги по обслуживанию индекса:
Разберем процесс ручной очистки:
1C:Enterprise Server.C:\Program Files\1cv8\srvinfo\).1FTxt. Именно здесь физически хранятся файлы полнотекстового индекса. Полностью удалите содержимое этой папки.ОбновлениеИндексаППД и СлияниеИндексаППД выполняются корректно и без ошибок. Если на сервере недостаточно оперативной памяти, процесс слияния индексов может аварийно завершаться, из-за чего поиск начинает выдавать устаревшие данные.
Подводя итог, можно сказать: некорректный поиск по контрагентам в КА 2.4 — это следствие избыточной универсальности стандартных механизмов 1С. Применив один из описанных нами методов (точечное отключение ПП при вводе по строке или кастомизацию функции через расширение), вы сможете вернуть пользователям комфортную и быструю работу с базой данных.