При интерактивной работе с управляемыми формами в «1С:Предприятии 8.3» разработчики и пользователи сталкиваются с ситуацией, когда активация стандартного поиска (комбинация клавиш Ctrl + Alt + F или расширенный поиск) приводит к ощутимым задержкам интерфейса. Подвисания начинают проявляться при выполнении практически любых пользовательских действий: при переходе по строкам таблицы, выполнении контекстных команд и даже при вызове пустых клиент-серверных процедур. В типовых конфигурациях, таких как «1С:ERP Управление предприятием» и «1С:Зарплата и управление персоналом», задержка в списках вроде договоров контрагентов может составлять одну-две секунды, а в сложных самописных формах с объемными запросами доходить до пяти секунд и более.
Характерной особенностью проблемы является то, что при установке структурного отбора через диалог «Настроить список» подвисания не возникают. Пользователи при этом привыкли пользоваться именно встроенным поиском по сочетанию клавиш, из-за чего простое скрытие кнопки вызывает сопротивление со стороны бизнес-пользователей.
Главная техническая причина разницы в скорости работы кроется в том, какие именно условия накладываются платформой на результирующий SQL-запрос динамического списка к СУБД:
ПОДОБНО '%Текст%' либо обращается к полнотекстовому поиску. Наличие знака процента в начале шаблона делает невозможным применение классических B-Tree индексов реляционной базы данных. СУБД вынуждена выполнять полное сканирование таблицы или индекса (Table Scan / Index Scan), считывая и проверяя каждую запись.Динамический список считывает данные порциями, достаточными для отображения на экране. Однако при выполнении серверных вызовов из формы (включая срабатывание обработчика ПриАктивизацииСтроки, нажатие кнопок командной панели или обновление формы) клиентское приложение синхронизирует состояние с сервером. В этот момент динамический список валидирует текущую позицию курсора и проверяет видимый диапазон строк.
Если в списке действует неиндексированный поиск, СУБД при каждом подтверждении позиции или подгрузке строк повторно выполняет тяжелый сканирующий запрос. В результате даже элементарный вызов сервера без полезной нагрузки превращается в многосекундное ожидание ответа базы данных.
Для определения причин задержки рекомендуется выполнить следующие диагностические шаги:
&НаСервере или &НаСервереБезКонтекста). Если такой вызов есть, он будет вызывать повторное обращение к контексту формы и списка при каждом движении курсора.ПОДОБНО многократно увеличивают время выполнения плана запроса.В зависимости от архитектуры конфигурации и требований к интерфейсу можно использовать несколько взаимодополняющих подходов.
1. Оптимизация обработчика смены строки
Если в форме задействован обработчик ПриАктивизацииСтроки, необходимо максимально сократить количество синхронных вызовов сервера. Получение дополнительных данных по текущей строке можно перенести на клиентский обработчик ожидания (через подключение обработчика ожидания на небольшую паузу), чтобы серверный вызов происходил только тогда, когда пользователь остановил перемещение по списку.
2. Использование поиска по началу строки
При поиске через «Найти» можно рекомендовать пользователям выбирать режим «по началу строки». В этом случае формируется условие ПОДОБНО 'Текст%'. Такое условие позволяет СУБД задействовать существующие строковые индексы по реквизиту (например, по наименованию или коду), исключая полное сканирование таблицы.
3. Проверка полнотекстового индекса
Если в конфигурации используется полнотекстовый поиск данных, следует проверить актуальность регламентного задания обновления и слияния индексов полнотекстового поиска. Если индекс актуален и настроен для реквизитов списка, платформа может задействовать полнотекстовый механизм вместо прямого сканирования таблиц СУБД через оператор подобия.
4. Упрощение схемы запроса динамического списка
Для сложных самописных списков следует проверить следующие параметры:
5. Отключение стандартного поиска в пользу быстрых отборов
Если структура данных настолько велика и сложна, что контекстный поиск приводит к недопустимым задержкам, стандартами разработки допускается отключение стандартных элементов поиска в командной панели формы списка. В качестве альтернативы на форму выводятся поля быстрых отборов по ключевым реквизитам (контрагент, организация, статус, период), которые фильтруют записи по строгому равенству без падения производительности.