Как исправить проблему с поиском контрагентов и партнеров в 1С:ERP?

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

В процессе работы с крупными информационными базами на платформе 1С:Предприятие 8, особенно в конфигурациях 1С:ERP Управление предприятием, 1С:Комплексная автоматизация или 1С:Управление торговлей, пользователи часто сталкиваются с некорректным поведением поиска в справочниках Контрагенты и Партнеры. Типичный пример: при вводе части наименования клиента, например «Рэйл», система ничего не находит, но при вводе «Рэйла» или использовании стандартного поиска по комбинации клавиш Alt + F элемент успешно отображается. При этом стандартные процедуры очистки кэша и обновления полнотекстового поиска не приносят желаемого результата.

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

Способ 1. Изменение свойств метаданных «Ввод по строке» в конфигураторе

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

Для исправления этого поведения выполним следующие шаги в конфигураторе:

  1. Откроем дерево метаданных конфигурации и найдем справочники Партнеры и Контрагенты.
  2. Перейдем на вкладку «Данные» и нажмем кнопку «Ввод по строке...».
  3. Обратим внимание на свойство «Полнотекстовый поиск при вводе по строке». Если там установлено значение Не использовать, платформа будет осуществлять поиск стандартными SQL-запросами без привлечения полнотекстового индекса. Изменим это значение на Использовать.
  4. Также проанализируем свойство «Способ поиска строки при вводе по строке». По умолчанию там часто установлено значение Начало. Это означает, что поиск будет искать только те элементы, которые начинаются с введенных символов. Для реализации поиска по вхождению в любую часть наименования изменим это свойство на Любая часть.

Важное предупреждение: включение поиска по любой части строки без дополнительных ограничений может вызвать существенное замедление работы системы на больших базах данных при вводе первых одного-двух символов.

Способ 2. Ограничение минимальной длины поисковой строки в модуле менеджера

Чтобы избежать зависания системы при включении поиска по любой части строки (Способ 1), мы должны установить программное ограничение на минимальное количество символов, при котором начинает срабатывать поиск. Рассмотрим пример реализации такого ограничения в модуле менеджера справочника.

Разберем программный код, который необходимо разместить в предопределенной процедуре ОбработкаПолученияДанныхВыбора:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Очищаем пробелы по краям поисковой строки
    СтрПоиска = СокрЛП(Параметры.СтрокаПоиска);
    
    // Если пользователь ввел менее 3 символов, отменяем стандартный поиск
    Если СтрДлина(СтрПоиска) < 3 Тогда
        СтандартнаяОбработка = Ложь; 
        // Возвращаем пустую структуру данных выбора, чтобы не нагружать СУБД пустой выборкой
        ДанныеВыбора = Новый СписокЗначений;
    КонецЕсли;    
    
КонецПроцедуры

Данный подход позволяет защитить сервер СУБД от тяжелых и неоптимальных запросов вида LIKE "%а%", когда пользователь только начинает вводить первые буквы наименования контрагента.

Способ 3. Восстановление регистра сведений «Иерархия партнеров»

В архитектуре 1С:ERP механизмы выбора партнеров и контрагентов в документах тесно завязаны на вспомогательный регистр сведений Иерархия партнеров. Это наиболее частая скрытая причина «невидимости» контрагентов при поиске.

Проанализируем ситуацию: если данные в базу переносились программно (например, через механизмы интеграции, конвертацию данных или XML-обмен) и при этом запись объектов производилась с установленным свойством ОбменДанными.Загрузка = Истина, то стандартные обработчики событий записи объектов не вызываются. В результате записи в регистре сведений Иерархия партнеров для новых контрагентов просто не создаются.

Визуально контрагент присутствует в списке, но при попытке поиска через ввод по строке левое соединение динамического списка с регистром иерархии возвращает пустое значение, и платформа «скрывает» этот элемент из результатов автоподбора.

Для исправления этой ситуации разработаем и запустим внешнюю обработку, которая выполнит перезапись объектов без флага загрузки обмена данными:


Выборка = Справочники.Партнеры.Выбрать();

Пока Выборка.Следующий() Цикл
    
    ОбъектПартнер = Выборка.ПолучитьОбъект();
    
    // Снимаем флаг загрузки, чтобы отработали все подписки на события 
    // и заполнились записи во вспомогательных регистрах иерархии
    ОбъектПартнер.ОбменДанными.Загрузка = Ложь;
    
    Попытка
        ОбъектПартнер.Записать();
        ИнформационноеСообщение = СтрШаблон("Партнер %1 успешно перезаписан.", ОбъектПартнер.Наименование);
        ЗаписьЖурналаРегистрации("РегенерацияИерархии", УровеньЖурналаРегистрации.Информация, , , ИнформационноеСообщение);
    Исключение
        Предупреждение = СтрШаблон("Не удалось записать партнера %1. Ошибка: %2", ОбъектПартнер.Наименование, ОписаниеОшибки());
        ЗаписьЖурналаРегистрации("РегенерацияИерархии", УровеньЖурналаРегистрации.Ошибка, , , Предупреждение);
    КонецПопытки;
    
КонецЦикла;

После выполнения данного кода записи в регистре иерархии актуализируются, и контрагенты мгновенно станут доступными для стандартных механизмов поиска.

Способ 4. Устранение скрытого влияния ограничений доступа RLS

Если в вашей информационной базе ERP настроено разграничение прав доступа на уровне записей (RLS), это накладывает жесткие ограничения на формирование запросов выбора данных.

При пустом или поврежденном регистре Иерархия партнеров механизмы RLS полностью скрывают данные элементы из поисковой выдачи для рядовых пользователей. При этом администратор с полными правами (у которого RLS отключен) может частично находить этих контрагентов.

Для диагностики этой проблемы выполните поиск под пользователем с полными правами. Если под Администратором поиск работает корректно, а под обычным менеджером — нет, вам необходимо проверить настройки групп доступа партнеров и запустить перерасчет прав доступа в разделе Администрирование — Настройки пользователей и прав.

Способ 5. Специфика лингвистического индекса и использование спецсимволов

Разберем лингвистическую сторону вопроса. Полнотекстовый поиск платформы 1С основан на морфологическом анализе текста (стемминге), который разбивает наименования на отдельные основы слов.

Почему ввод «Рэйл» не находил компанию «РэйлАльянс», а ввод «Рэйла» находил? Сложные составные слова, написанные без пробелов, индексируются системой как одно неделимое слово. Поисковый движок пытается сопоставить основу запроса с основой проиндексированного слова.

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

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

Поскольку изменение типовой конфигурации ERP крайне нежелательно и усложняет последующие обновления, лучшим решением является использование механизма расширений. Мы можем перехватить функцию автоподбора данных на лету и модифицировать поисковую строку СУБД, сохраняя конфигурацию стандартной, что позволяет без проблем применять инструменты для автоматического обновления типовых баз по расписанию.

Создадим новое расширение конфигурации и добавим в него метод-перехватчик для серверного вызова получения данных выбора партнеров:


&Вместо("ПартнерыДанныеВыбора")
Функция МоеРасширение_ПартнерыДанныеВыбора(Параметры)
    
    НачальнаяСтрокаПоиска = Параметры.СтрокаПоиска;
    
    // Принудительно модифицируем строку поиска для поиска по любой части слова
    Если НЕ ПустаяСтрока(НачальнаяСтрокаПоиска) И СтрДлина(НачальнаяСтрокаПоиска) >= 3 Тогда
        Параметры.СтрокаПоиска = "%" + НачальнаяСтрокаПоиска;
    КонецЕсли;
    
    // Вызываем оригинальный метод конфигурации с измененными параметрами
    Результат = ПродолжитьВызов(Параметры);
    
    // Возвращаем исходную строку поиска во избежание побочных эффектов в вызывающих процедурах
    Параметры.СтрокаПоиска = НачальнаяСтрокаПоиска;
    
    Возврат Результат;
    
КонецФункции

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

Способ 7. Переход на вторую версию полнотекстового поиска (ППД v2)

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

Для этого выполним следующие действия:

  1. Откроем свойства корневого узла конфигурации в конфигураторе.
  2. В группе свойств «Совместимость» найдем параметр «Версия полнотекстового поиска».
  3. Установим значение в положение «Версия 2».
  4. В режиме «1С:Предприятие» перейдем в раздел Администрирование — Поддержка и обслуживание — Управление полнотекстовым поиском.
  5. Выполним операцию «Очистить индекс», а затем дождемся завершения выполнения регламентного задания «Обновление индекса ППД».

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

← На главную