Почему не работает или некорректно работает поиск по контрагентам в 1С:Комплексная автоматизация 2.4?

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

Каждый из нас, кто работал с конфигурациями «1С:Комплексная автоматизация 2.4» или «1С:ERP Управление предприятием 2.4», наверняка сталкивался с неприятной ситуацией: при попытке найти контрагента в документе по его названию система выдает совершенно не то, что нужно. Например, мы вводим поисковый запрос "спец", ожидая увидеть компании, названия которых начинаются на это слово (например, «СпецМонтаж», «СпецТехника»). Вместо этого программа предлагает нам список контрагентов вроде «Газойл Корпорация ЗАО», «СИТИ-МОБИЛЬНИК ООО» или «Арондопаг ЗДТ», в названиях которых буквосочетания "спец" нет и в помине. При этом внизу формы скромно висит надпись: «Слишком много результатов...».

В этой статье мы подробно разберем, почему встроенный полнотекстовый поиск (ПП) в платформе «1С:Предприятие» ведет себя подобным образом, выясним технические причины этой проблемы и рассмотрим практические варианты ее решения как без изменения кода, так и с помощью программных доработок.

---

В чем кроется причина «неадекватного» поиска?

Давайте проанализируем внутренние механизмы работы конфигурации. Начиная с версии ERP и КА 2.4, разработчики фирмы «1С» кардинально переработали механизмы автоподбора в полях ввода. За поиск партнеров и контрагентов отвечает специализированный метод ПартнерыДанныеВыбора, расположенный в общем модуле ПартнерыИКонтрагентыВызовСервера.

Когда в системе включен полнотекстовый поиск, подбор по строке начинает работать по следующим правилам:

  1. Индексация связанных данных: Полнотекстовый поиск устроен так, что он индексирует не только реквизит Наименование самого справочника Партнеры или Контрагенты. В поисковый индекс попадают все связанные объекты: договоры контрагентов, соглашения, контактная информация (адреса, телефоны, email), а также спецификации к договорам.
  2. Жёсткий лимит выборки: Функция ПартнерыДанныеВыбора имеет внутреннее ограничение на количество возвращаемых элементов. Как правило, этот лимит составляет 50 записей. Это сделано для оптимизации производительности интерфейса и предотвращения зависания клиентского приложения.
  3. Переполнение буфера: Когда мы вводим корень "спец", полнотекстовый поиск находит совпадения во всех проиндексированных данных. Слово "специальный" или "спецификация" встречается в сотнях договоров и соглашений самых разных контрагентов. Поиск выбирает первые 50 совпадений по договорам и полностью забивает ими лимит выдачи. В результате реальные партнеры, чьи имена действительно начинаются на "Спец", физически не успевают попасть в эту выборку и отбрасываются системой.

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

---

Способ 1. Отключение полнотекстового поиска при вводе по строке (без программирования)

Если вы хотите сохранить глобальный полнотекстовый поиск по всей базе данных (через общую строку поиска в шапке программы), но желаете вернуть классический и предсказуемый поиск в полях выбора документов, лучшим решением будет точечное отключение ПП для конкретных справочников в Конфигураторе.

Рассмотрим, как это сделать по шагам:

  1. Откройте конфигурацию в режиме «Конфигуратор».
  2. Найдите справочник Партнеры и откройте его свойства.
  3. Перейдите на вкладку «Поля ввода» (или найдите соответствующее свойство в палитре свойств).
  4. Найдите свойство «Полнотекстовый поиск при вводе по строке». По умолчанию там установлено значение Использовать. Нам необходимо изменить его на Не использовать.
  5. Повторите аналогичную операцию для справочника Контрагенты.
  6. Обновите конфигурацию базы данных.

Что изменится? Теперь при вводе названия компании в поле «Клиент» или «Поставщик» в документах система больше не будет обращаться к полнотекстовому индексу. Она выполнит стандартный быстрый запрос к СУБД по началу строки, ИНН или коду. Поиск мгновенно станет точным и предсказуемым, а глобальный поиск по всей базе по-прежнему будет доступен.

---

Способ 2. Программный обход проблемы через Расширение конфигурации

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

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

Создадим расширение и добавим в него модуль ПартнерыИКонтрагентыВызовСервера. Перехватим функцию ПартнерыДанныеВыбора с помощью аннотации &Вместо:


&Вместо("ПартнерыДанныеВыбора")
Функция Икс_ПартнерыДанныеВыбора(ЗначениеПоиска, ПараметрыВыбора, Выборка)
    
    // Если поиск пустой, возвращаем стандартное поведение
    Если ПустаяСтрока(ЗначениеПоиска) Тогда
        Возврат ПродолжитьВызов(ЗначениеПоиска, ПараметрыВыбора, Выборка);
    КонецЕсли;
    
    // Проверяем, не является ли значение поиска ИНН или телефоном
    ЭтоИНН = ТолькоЦифры(ЗначениеПоиска);
    
    Если Не ЭтоИНН Тогда
        // Подменяем логику: принудительно подставляем шаблоны для поиска по подстроке
        // Это заставит систему использовать LIKE в SQL-запросе к СУБД
        СтрокаПоискаМодифицированная = "%" + ЗначениеПоиска + "%";
        
        // Здесь мы можем перенаправить выполнение на собственный облегченный запрос, 
        // который ищет исключительно по наименованию партнера, игнорируя договоры
        РезультатТаблица = ВыполнитьОблегченныйПоискПартнеров(СтрокаПоискаМодифицированная);
        
        Если РезультатТаблица.Количество() > 0 Тогда
            Возврат РезультатТаблица;
        КонецЕсли;
    КонецЕсли;
    
    // Если наши кастомные методы не дали результата, возвращаем стандартный вызов
    Возврат ПродолжитьВызов(ЗначениеПоиска, ПараметрыВыбора, Выборка);
    
КонецФункции

Использование этого кода гарантирует, что система в первую очередь выполнит поиск по наименованию партнера в базе данных, используя стандартные индексы СУБД, а не замусоренный полнотекстовый индекс договоров.

---

Способ 3. Очистка, обновление и оптимизация полнотекстового индекса

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

Если вы хотите восстановить корректную работу ПП в целом, выполните следующие шаги по обслуживанию индекса:

  1. Очистка и слияние индекса через интерфейс 1С: Перейдите в раздел НСИ и администрирование — Поддержка и обслуживание — Управление полнотекстовым поиском. Нажмите кнопку «Очистить индекс», а затем — «Обновить индекс».
  2. Физическое удаление файлов индекса на сервере приложений: Бывают случаи, когда штатная очистка из режима «1С:Предприятие» не помогает, так как файлы индекса заблокированы или повреждены на диске.

    Разберем процесс ручной очистки:

    • Остановите службу сервера 1C:Enterprise Server.
    • Перейдите в каталог кластера серверов (по умолчанию для Windows это C:\Program Files\1cv8\srvinfo\).
    • Найдите папку вашей информационной базы (ее GUID можно посмотреть в свойствах базы в консоли администрирования).
    • Внутри папки базы найдите каталог 1FTxt. Именно здесь физически хранятся файлы полнотекстового индекса. Полностью удалите содержимое этой папки.
    • Запустите службу сервера 1С.
    • Зайдите в базу и запустите полное обновление индекса. Платформа пересоздаст файлы с нуля.
  3. Проверка регламентных заданий: Убедитесь, что регламентные задания ОбновлениеИндексаППД и СлияниеИндексаППД выполняются корректно и без ошибок. Если на сервере недостаточно оперативной памяти, процесс слияния индексов может аварийно завершаться, из-за чего поиск начинает выдавать устаревшие данные.
  4. Переход на Полнотекстовый поиск версии 2: Если вы используете современные версии платформы (начиная с 8.3.20+), рассмотрите возможность перевода базы данных на обновленный механизм поиска. ППД версии 2 работает значительно быстрее, не требует частого запуска ресурсоемких процедур слияния индексов и лишен многих детских болезней старого поискового движка.

Подводя итог, можно сказать: некорректный поиск по контрагентам в КА 2.4 — это следствие избыточной универсальности стандартных механизмов 1С. Применив один из описанных нами методов (точечное отключение ПП при вводе по строке или кастомизацию функции через расширение), вы сможете вернуть пользователям комфортную и быструю работу с базой данных.

← На главную