Многие технические специалисты сталкиваются с ситуацией, когда стандартный поиск в динамическом списке начинает «подвисать» или работать крайне медленно. Особенно часто это проявляется в справочнике Номенклатура, где объем данных велик, а пользователи активно используют строку поиска. Рассмотрим детально, почему это происходит и как локализовать проблему, если она проявляется избирательно — только у одного или нескольких сотрудников.
Если поиск тормозит только у одного пользователя, в то время как у администратора или коллег всё работает мгновенно, первоочередная причина кроется в пользовательских настройках формы. Рассмотрим механизм работы механизма «Изменить форму». Когда пользователь самостоятельно добавляет колонки в список, платформа динамически модифицирует SQL-запрос, который отправляется к серверу базы данных.
Проанализируем ситуацию, описанную в теме: пользователь добавил реквизит Входит в группу через команду «Изменить форму». На первый взгляд, это безобидное действие, но для платформы 1С это сигнал к использованию оператора В ИЕРАРХИИ в SQL-запросе. Разберем, почему это критично:
LIKE (ПОДОБНО) это создает колоссальную нагрузку, приводя к «зависанию» интерфейса и отмене фонового задания по таймауту.Другой важный аспект, который мы должны рассмотреть — это добавление полей через навигационные свойства (через точку от основной ссылки). Например, если в список номенклатуры добавлено поле Номенклатура.Производитель.Страна.
Выясним, что происходит на уровне СУБД: каждое такое поле добавляет к основному запросу динамического списка оператор LEFT JOIN. Если таких полей несколько, и по ним активирован поиск, SQL-запрос превращается в «монстра» с десятком присоединений. Поиск по подстроке в такой структуре не может использовать индексы эффективно, что приводит к полному сканированию таблиц (Table Scan).
Рекомендация: Проверьте состав доступных полей. Если пользователю жизненно необходимы эти данные, лучше добавить их в саму таблицу Номенклатура как дополнительные реквизиты или оптимизировать запрос динамического списка на уровне конфигуратора, избегая избыточных соединений в основной схеме.
Платформа 1С:Предприятие, начиная с версии 8.3.15, существенно изменила логику работы глобального поиска в списках. Проанализируем два режима:
1. Полнотекстовый поиск включен. 1С пытается использовать индекс ППД. Если индекс не актуален или фрагментирован, поиск может «тупить» или выдавать неполные результаты. В теме упоминалось, что при включенном ППД поиск работает только по началу слова. Это происходит потому, что механизм индексации настроен на определенные правила разбиения слов.
2. Полнотекстовый поиск выключен. Система переходит на классический SQL-запрос с использованием LIKE '%Текст%'. Такой поиск находит вхождения в середине слова (например, «пласт» в слове «сплав»), но он работает крайне медленно на больших таблицах, так как индексы по строковым полям не поддерживают поиск с диким символом (wildcard) в начале строки.
Посмотрим на пример того, как платформа может формировать условие (условно):
ВЫБРАТЬ ПЕРВЫЕ 100
СправочникНоменклатура.Наименование
ИЗ
Справочник.Номенклатура КАК СправочникНоменклатура
ГДЕ
СправочникНоменклатура.Наименование ПОДОБНО "%пакет%"
ИЛИ СправочникНоменклатура.Артикул ПОДОБНО "%пакет%"
Разберем по шагам, что нужно сделать системному администратору или программисту для устранения тормозов у конкретного пользователя:
%AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8. Это исключит влияние битых временных файлов.ОбновлениеИндексаППД и СлияниеИндексаППД. Также полезно очистить и полностью перезаполнить индекс через управление полнотекстовым поиском.Важно различать поиск в самой форме справочника и поиск при вводе в поле документа. Как мы выяснили из обсуждения, тормоза часто возникают именно при подборе в документе. В этом случае срабатывает обработчик ОбработкаПолученияДанныхВыбора. В типовых конфигурациях (БП 3.0, УТ 11) в этом месте часто прописаны дополнительные проверки на остатки или цены. Если в базе много помеченных на удаление объектов или дублей, это также замедляет процесс.
Для оптимизации этого процесса можно программно ограничить количество полей, по которым ведется поиск:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Ограничиваем список полей для поиска, чтобы ускорить работу
Список.ПараметрыПоиска.ПоляПоиска = "Наименование,Артикул";
КонецПроцедуры
Подводя итог, можно сказать, что в 90% случаев проблема «тормозов у одного юзера» решается удалением его персональных настроек формы. Приучайте пользователей не загромождать динамические списки лишними полями, особенно иерархическими реквизитами и данными из связанных справочников, так как это напрямую влияет на отзывчивость системы.