Ускоряем полнотекстовый поиск в динамических списках

Публикация № 1267438

Администрирование - Администрирование данных 1С - Поиск данных

полнотекстовый поиск ускорение оптимизация производительность

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

Предисловие

Прочитал статью коллеги Полнотекстовый поиск в 1С. №1 Грабли в динамических списках в которой автор описывает типовую ситуацию всех баз с большим количеством документов. При этом был разобран случай без использования РЛС, если у автора поиск длится 8 сек, то у обычного пользователя с ограничением на уровне записей он будет длиться около 20 сек (даже если фактического ограничения нет, а рлс включен).

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

  • медленно, все как и описано в статье
  • и не всегда ищет
     
     Пример поиска

     

Результат на такие обращения - ссылки на ИТС, изучайте документацию, с системой все норм.

Но решение, подходящее для меня нашел и решил внести вклад в развитие сообщества, может это избавит кого-то от головной боли.

Применяя метод костылей

Суть "метода" заключается в том чтобы заблокировать отбор по некоторым, ненужным нам полям динамического списка. Этот метод не блокирует возможности установки отборов через настройку списка или "быстрых отборов" отдельно выведенных на форму создателями типовых конфигураций. Единственный минус, который я заметил, если заблокированное поле является частью условия для условного оформления - оформление ломается. Ниже приведен код, который ограничит все поля динамического списка, кроме тех, которые есть в условном оформлении и нужны нам для поиска.

Эту процедуру можно разместить в "своем" общем модуле. У меня УТ 11.4 - поэтому примеры соответствуют этой конфигурации.

Сама процедура:

// Устанавливает ограничения в динамическогм списке на отборы, сортировки и группировку на все поля списка
// для ускорения поиска по строке поиска и уменьшает количество ошибочных настроек пользователя
// убирает из ограничений поля указанные в отборах условного оформления, т.к. это ломает оформление
// Параметры:
//  Список           - ДинамическийСписок - Динамический список на который устанавливается отбор
//                 
//  РазрешенныеПоля  - Массив - состоящий из строк-имен полей по которым не устанавливаются ограничения
//
//
Процедура УстановитьОграничениеДинамическогоСписка(Список, РазрешенныеПоля) Экспорт

	Для Каждого ЭлементНастроек Из Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы Цикл
		Для Каждого ЭлементОтбора Из ЭлементНастроек.Отбор.Элементы Цикл
			РазрешенныеПоля.Добавить(Строка(ЭлементОтбора.ЛевоеЗначение));
		КонецЦикла;
	КонецЦикла;
	МассивПолей = Новый Массив;
	Для Каждого ЭлементСписка Из Список.КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.Элементы Цикл
		Если РазрешенныеПоля.Найти(Строка(ЭлементСписка.Поле)) = Неопределено ИЛИ ЭлементСписка.Папка Тогда
			МассивПолей.Добавить(Строка(ЭлементСписка.Поле));
		КонецЕсли;
	КонецЦикла;
	
	Список.УстановитьОграниченияИспользованияВГруппировке(МассивПолей);
	Список.УстановитьОграниченияИспользованияВОтборе(МассивПолей);
	Список.УстановитьОграниченияИспользованияВПорядке(МассивПолей);
	
КонецПроцедуры // УстановитьОграничениеДинамическогоСписка()

Пример вызова процедуры для списка заказов клиента из модуля формы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	//Пример для формы списка заказов клиента
	//ЭтаФорма.ИмяФормы = "Документ.ЗаказКлиента.Форма.ФормаСпискаДокументов"
	РазрешенныеПоля = СтрРазделить("Дата,Номер,СуммаДокумента,Клиент,Партнер,Ссылка", ",", Ложь);
	х_ДополнительныеВозможности.УстановитьОграничениеДинамическогоСписка(ЭтаФорма.Список, РазрешенныеПоля);
КонецПроцедуры

Эффект - потрясающий. Для полноправного пользователя поиск длится около 1 сек (для базы с миллионом и более документов). Для пользователя с РЛС поиск длятся около 2 сек. Без дополнительных отборов по организации, менеджеру, дате.

Пример для формы подбора товаров:

Форма подбор товаров в документ продажи, мне для поиска нужны только артикул и наименование:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	х_ДополнительныеВозможности.УстановитьОграничениеДинамическогоСписка(ЭтаФорма.СписокНоменклатура, СтрРазделить("Артикул,Наименование", ",", Ложь));
КонецПроцедуры

Подбор, благодаря "правкам" был довольно шустрый (1-2 сек для пользователя), но с ограничением по полям результаты появляются еще до ввода строки (шутка), моментально.

Писака не писатель, это мой первый раз и т.д. прошу меня простить за допущенные ошибки.

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. YPermitin 9691 20.07.20 20:12 Сейчас в теме
(0) большой плюс! Идея отличная!

Тему поиска будем продожать. :)
P. S. В обслуживаемых мной больших базах этот поиса вообще пришлось отключить. Но нашел другие решения. В следующих статьях все опишу :)
jONES1979; +1 Ответить
2. v25i85 20.07.20 23:03 Сейчас в теме
Небось и в динамике по отображаемым колонкам можно настроить огрраничения? Типа сколько колонок выводится, по ним и производим поиск? Или по скрытым колонкам тоже ищет?
5. PRO100_NigGaZ 57 21.07.20 09:03 Сейчас в теме
(2) Поиск по строке ищет по всем видимым колонкам, для себя я блокирую все доступные для выбора поля (и видимые и скрытые), оставляя только необходимые.
3. Yashazz 3410 21.07.20 00:43 Сейчас в теме
У меня вызывает серьёзные сомнения всеобъемлющая действенность этого метода. Автор, у вас, часом, в списках, где поиск тормозил, не было применения события "ПриПолученииДанныхНаСервере"? Потому что оно, если криво сделано, криво положено на то, что выгребает запрос дин.списка, да ещё если в получении представлений объектов скверно, вот оно да, может тормозить. И простое листание могло тупить (известно же, что у этого обработчика свой, весьма своеобразный кэш и его обновление), и полнотекстовый мог тупить. Хотя 1С ещё в 8.3.8 заявляло, что-де это ускоряет, но далеко не всегда...

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

Так что не уверен, что ваш способ - панацея. Для списков с "ПолучениемДанных", с неоптимальным набором в СтрокеДС, с РЛС на разыменование и представление - может быть. Но не везде. Впрочем, всякое бывает...
6. PRO100_NigGaZ 57 21.07.20 09:08 Сейчас в теме
(3) Нет, при получении данных на сервере не используется. Основная таблица у списка есть, А сам поиск тормозит из-за соединениями с РС, если их убрать - поиск будет нормальный, но это не выход. У меня поведение поиска такое же какое в статье на которую я сослался.Метод который я описал работает, поэтому и опубликовал такое решение.
7. Yashazz 3410 21.07.20 09:26 Сейчас в теме
(6) Интересно. Т.е. получается, что эти методы влияют и на поведение СКД на этапе процессора компоновки... Любопытно.
4. Bienko 189 21.07.20 07:42 Сейчас в теме
Можно использовать ALT + F (сначала выделив нужный столбец), - работает быстро и ищет только по нужному столбцу.
pioneeer; starik-2005; +2 Ответить
8. starik-2005 2198 21.07.20 10:56 Сейчас в теме
(4)
Можно использовать ALT + F
Раньше в платформе был только такой метод поиска, потом добавили "полнотекстовый", который ищет все соединения с представлением по всем отображаемым полям, поэтому и тормозит. Если не изменяет память, то поиск по подстрокам можно отключить у динамического списка, после чего АЛЬТ+Ф становится поиском по-умолчанию.

Но вообще и такой поиск при множестве пользователей (у нас их было 500 штук) при поиске даже номера в журнале документов тормозил систему в целом достаточно сильно (отключили - система ожила). Сервера стоили миллионы и были разделены на скульный и 1Сный.
9. VKislitsin 21.07.20 12:02 Сейчас в теме
Немного уточню: предложенный способ решает несколько более широкий спектр проблем, чем означено в заголовке.

Во-первых, он влияет не только на полнотекстовый поиск, но и на "обычный" поиск средствами СУБД.

Во-вторых, такая блокировка позволяет обезопасить от сортировки по "неправильной" (без индекса) колонке списка, а также установки группировок в списках по таким же "неправильным" колонкам.

Для установки опасной сортировки пользователю достаточно просто кликнуть на заголовок столбца. Он тут же и забудет об этом. А настройка сохраняется и дальше список всегда "тормозит". В особо неудачных случаях для отображения списка требуется несколько минут. При этом нет никаких внешних признаков по каким колонкам можно сортировать, а по каким - нельзя. Остается ограничивать доступные для сортировки списка колонки, как описано в заметке.
JohnyDeath; triviumfan; PRO100_NigGaZ; +3 Ответить
10. PRO100_NigGaZ 57 21.07.20 12:51 Сейчас в теме
(9) Не стал удалять эти вызовы, хотя и не относятся к теме. А вообще да, не дает пользователю случайно сломать список
Оставьте свое сообщение

См. также

Полнотекстовый поиск в 1С. №2 Самое основное для разработчика

Поиск данных v8 1cv8.cf Бесплатно (free)

Полнотекстовый поиск в 1С и все что с этим связано. Часть №2: программное использование и некоторые нюансы при разработке.

02.09.2020    3068    YPermitin    4    

Полнотекстовый поиск в 1С. №1 Грабли в динамических списках

Поиск данных v8 1cv8.cf Бесплатно (free)

Полнотекстовый поиск в 1С и все что с этим связано. Часть №1: особенности работы в динамических списках.

18.07.2020    4582    YPermitin    18    

Поиск некорректных дат средствами SQL

Поиск данных v8 1cv8.cf Бесплатно (free)

Ошибка "Дата ' **.**.**** ' не может быть записана в базу данных на MS SQL Server с нулевым смещением дат.

03.10.2019    2819    sutygin    8    

Рекурсивный поиск каталога среди каталогов.

Поиск данных Универсальные функции v8 1cv8.cf Бесплатно (free)

Внимание особо умных. Предложенная процедура актуальна для конфигураций на платформе 8.1 и ниже. В них для функции НайтиФайлы не был реализован рекурсивный поиск в подкаталогах. Это указано в справке. Задача Найти путь к вложенному каталогу. Пример Каталог AST содержит каталоги A1, S1, T1 Каталог A1 содержит каталоги 0001, 0002, 0003 каталог S1 содержит каталоги 1001, 1002, 1003 Каталог Т1 содержит каталоги 2001, 2002, 2003 На входе функции КорневойКаталог = "D:\AST" КаталогПоиска = "1002" На выходе функции НайденныйПуть = "D:\AST\A1\1002" Уточнение - имена КаталогПоиска уникальны и не повторяются. Функция НайтиФайлы не помогает - она ищет их только в текущем каталоге.

19.09.2014    8692    betepon    5    

1С 8.2. Особенности поиска, выделение элементов

Поиск данных Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

По сравнению с 8.1, интерфейс 1С 8.2 в режиме управляемого приложения претерпел значительные изменения. Кроме внешнего вида, появились так же и новые "фишки". В частности, расширен механизм поиска.

24.05.2013    23333    megabax    10    

Пример алгоритма синхронизации справочников по GUID

Практика программирования Поиск данных v8 1cv8.cf Россия Бесплатно (free)

Порой при переводе систем с одной конфигурации на другую нужно часто переносить справочники из одних в другие. При этом сложно завязываться на код или наименование. Но! Можно завязаться на GUID элемента. 1С позволяет использовать один и тот же GUID в разных справочниках.

10.02.2012    18373    fixin    6    

Готовое решение для отслеживания конфликтов кадровых неявок в ЗУП и УПП

Управление персоналом (HRM) Поиск данных Тестирование и исправление Анализ учета Управление персоналом (HRM) v8 ЗУП2.5 ЗКБУ УПП1 Бесплатно (free)

В актуальной версии ЗУП 2.5 оперативный контроль кадровых неявок сводится к программной проверке : не начинается ли в эту же самую дату какая-то другая неявка? Многие пользователи считают, что этого явно недостаточно. Вашему вниманию предлагается готовое решение (в виде программного кода) для ЗУП и УПП, которое после проведения документа кадровой неявки информирует пользователя, какие конфликты кадровых неявок повлекло за собой проведение документа.

29.06.2011    15531    megatrend    8    

Восстановление битых ссылок в 1С

Практика программирования Поиск данных v8 1cv8.cf Россия Бесплатно (free)

Простая и относительно бескровная методика восстановления битых ссылок и ссылочной целостности.

19.01.2011    33593    romansun    15