При ежедневной работе со списками документов в программе «1С:Управление торговлей» пользователи нередко сталкиваются с непонятной ситуацией: если номер заказа имеет вид МПОО-000050, то при вводе в строку поиска значения 50 нужный документ мгновенно отображается в списке. Однако если ввести 050 или 0050, список оказывается абсолютно пустым. При этом пользователи отмечают, что ранее такой поиск мог исправно работать. Разберем детально внутренние механизмы платформы «1С:Предприятие», выясним причину такого поведения и рассмотрим практические способы решения этой проблемы.
Проанализируем, как устроен механизм полнотекстового поиска платформы при обработке строковых реквизитов и номеров документов:
МПОО-000050 разделитель-дефис разбивает строку на два самостоятельных токена: буквенный префикс МПОО и числовую часть 000050. Полнотекстовый индекс регистрирует числовую часть в двух формах: в исходном текстовом виде со всеми нулями (000050) и в нормализованном числовом представлении без лидирующих нулей (50).50, строка сопоставляется с числовым токеном, и заказ успешно находится. Если ввести номер целиком с нулями 000050, платформа находит совпадение с исходным токеном. Но когда пользователь вводит неполную последовательность нулей (например, 050), система воспринимает ввод как текст и пытается найти токен, начинающийся на 050. Поскольку в индексе содержится слово 000050, а подстрока 050 находится в его середине, совпадение не фиксируется, и результат поиска оказывается пустым.Рассмотрим, почему подобное поведение могло проявиться внезапно, хотя до определенного момента поиск по 050 успешно срабатывал. В платформе «1С:Предприятие» динамический список умеет переключать режим поиска в зависимости от состояния полнотекстового индекса:
ПОДОБНО "%050%". В режиме SQL-поиска по подстроке лексемы и нули роли не играют — документ находится в любом случае.Посмотрим на самое простое и эффективное пользовательское решение, которое не требует изменения настроек конфигурации и прав администратора. Для поиска по подстроке в конкретной колонке полнотекстовый индекс не нужен:
050 и нажимаем клавишу ввода.При таком подходе запрос на фильтрацию отправляется напрямую к базе данных без участия полнотекстового индекса, и документ находится моментально.
Разберем, как заставить полнотекстовый поиск искать совпадение внутри слова без вызова дополнительных диалоговых окон. Если требуется использовать общую строку поиска в верхней части списка, применим специальный синтаксис поисковых выражений:
050 укажем строку с маской: *050* или *050.МПОО-000050.Если специфика работы организации требует регулярного поиска именно по обрывкам номеров с произвольным количеством нулей через общую строку поиска, проанализируем возможность полного отключения полнотекстового поиска:
Важное предупреждение: после отключения этой опции все стандартные поля поиска в динамических списках перейдут на выполнение запросов типа LIKE '%...%' на уровне СУБД. В базах с большим объемом заказов это приведет к полному сканированию таблиц (Table Scan) и может существенно замедлить работу пользователей при выполнении поиска.
Если требуется сохранить быстродействие полнотекстового индекса и при этом обеспечить удобство пользователей, рассмотрим варианты программной доработки через расширение конфигурации:
Номер соответствующего документа установим свойство Полнотекстовый поиск в значение Не использовать. В этом случае поиск по номеру в списке будет выполняться стандартным механизмом платформы напрямую через СУБД.