Почему в УТ 11 не работает поиск по части номера заказа с ведущими нулями и как это исправить?

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

При ежедневной работе со списками документов в программе «1С:Управление торговлей» пользователи нередко сталкиваются с непонятной ситуацией: если номер заказа имеет вид МПОО-000050, то при вводе в строку поиска значения 50 нужный документ мгновенно отображается в списке. Однако если ввести 050 или 0050, список оказывается абсолютно пустым. При этом пользователи отмечают, что ранее такой поиск мог исправно работать. Разберем детально внутренние механизмы платформы «1С:Предприятие», выясним причину такого поведения и рассмотрим практические способы решения этой проблемы.

Механизм токенизации и логика полнотекстового поиска

Проанализируем, как устроен механизм полнотекстового поиска платформы при обработке строковых реквизитов и номеров документов:

  1. Разделение на лексемы (токенизация). При записи номера МПОО-000050 разделитель-дефис разбивает строку на два самостоятельных токена: буквенный префикс МПОО и числовую часть 000050. Полнотекстовый индекс регистрирует числовую часть в двух формах: в исходном текстовом виде со всеми нулями (000050) и в нормализованном числовом представлении без лидирующих нулей (50).
  2. Правила сопоставления поискового запроса. Полнотекстовый индекс платформы по умолчанию выполняет поиск слов целиком либо по префиксу (совпадение с начала слова). Когда мы вводим 50, строка сопоставляется с числовым токеном, и заказ успешно находится. Если ввести номер целиком с нулями 000050, платформа находит совпадение с исходным токеном. Но когда пользователь вводит неполную последовательность нулей (например, 050), система воспринимает ввод как текст и пытается найти токен, начинающийся на 050. Поскольку в индексе содержится слово 000050, а подстрока 050 находится в его середине, совпадение не фиксируется, и результат поиска оказывается пустым.

Почему раньше поиск по неполному номеру мог работать

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

  1. Если регламентное задание обновления индекса было отключено, индекс не успел обновиться или был поврежден, платформа автоматически переводит поиск в динамическом списке на прямой SQL-запрос к СУБД с условием ПОДОБНО "%050%". В режиме SQL-поиска по подстроке лексемы и нули роли не играют — документ находится в любом случае.
  2. Как только регламентное задание обновило индекс или администратор выполнил переиндексацию, платформа переключила строку поиска списка обратно на полнотекстовый движок, из-за чего проявились штатные ограничения токенизатора на неполные ведущие нули.

Решение 1. Использование стандартного поиска по колонке (Alt + F)

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

  1. В списке документов устанавливаем курсор на колонку Номер.
  2. Нажимаем комбинацию клавиш Alt + F (или кнопку «Найти» в командной панели списка).
  3. В появившемся окне отбора проверяем, что способ сравнения установлен как «Содержит» (или «Часть строки»), вводим значение 050 и нажимаем клавишу ввода.

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

Решение 2. Использование символов маски в строке поиска

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

  1. Вместо ввода точного значения 050 укажем строку с маской: *050* или *050.
  2. Звездочка указывает механизму полнотекстового поиска на необходимость поиска подстроки внутри токена, что позволит найти документ с номером МПОО-000050.

Решение 3. Отключение полнотекстового поиска в системе

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

  1. Перейдем в раздел НСИ и администрирование — Общие настройки — Поиск данных.
  2. Снимем флаг Использовать полнотекстовый поиск при поиске данных.

Важное предупреждение: после отключения этой опции все стандартные поля поиска в динамических списках перейдут на выполнение запросов типа LIKE '%...%' на уровне СУБД. В базах с большим объемом заказов это приведет к полному сканированию таблиц (Table Scan) и может существенно замедлить работу пользователей при выполнении поиска.

Решение 4. Доработка для программистов

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

  1. Автоматическая нормализация ввода: добавим на форму списка отдельное поле ввода номера. В обработчике изменения поля программно удалим лидирующие нули (приведем строку к числу) либо дополним номер нулями слева до формата метаданных перед установкой отбора в динамическом списке.
  2. Исключение номера из полнотекстового индекса: в свойствах реквизита Номер соответствующего документа установим свойство Полнотекстовый поиск в значение Не использовать. В этом случае поиск по номеру в списке будет выполняться стандартным механизмом платформы напрямую через СУБД.
← На главную