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

20.07.20

Задачи пользователя - Поиск данных

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

Предисловие

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

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

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

     

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Поиск данных Внешние источники данных Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Если вам нужно автоматически генерировать представления (view) к вашей базе данных 1С (есть две версии - для СУБД MS SQL Server и для PostgreSQL) по структуре метаданных 1С, то вам необходима данная обработка. Наш "Генератор View", другими словами - это коннектор к данным 1С для Power BI - незаменимый помощник для бизнес-аналитиков, работающих с базами 1С из Yandex Datalens/Power BI и т.д. Работает для обычных и управляемых форм под 1С 8.3

230000 руб.

31.07.2020    13748    13    48    

25

Поиск данных Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработки помогут Вам легко и, главное, быстро (в 5 раз и быстрее штатной обработки 1С), выполнить поиск дублирующих данных в Ваших базах 1С на платформах 8.1-8.3. Это позволит уменьшить объем лишней информации в справочниках и документах, планах видов характеристик и др., упростит работу с данными пользователям. А так же можно, одним нажатием, узнать в каких ссылочных объектах есть вообще дубли! Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. А так же обновления Вы получаете бесплатно в течение года с момента приобретения данных обработок! (Обновление от 27.11.2023, версия 6.12)

10800 руб.

14.05.2012    158966    336    253    

570

Розничная торговля WEB-интеграция Поиск данных Пользователь Платформа 1С v8.3 Оперативный учет 1С:Розница 2 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Альтернатива сервису 1С Номенклатура, не требует подписки ИТС, ищет данные в открытых источниках. Для поиска товара по штрихкоду в сети интернет, полезно для первоначального заполнения базы.

1999 руб.

15.10.2020    18981    23    63    

24

Математика и алгоритмы Инструментарий разработчика Универсальные функции Поиск данных Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Абонемент ($m)

Несколько упакованных в один класс интерфейсов для обработки популярных универсальных коллекций. Для тех, кого раздражает отсутствие действительно единого интерфейса для универсальных коллекций.

5 стартмани

25.09.2024    2231    0    Артано    14    

19

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

В этой статье я хочу рассмотреть еще один кейс применения Clickhouse в связке с 1С - оптимизацию поиска в справочнике по ключевым словам. Здесь не будет готового решения, но будут описаны важные моменты, которые позволят легко применить данный кейс в реальности.

18.08.2024    1817    1cnik2    23    

14

Поиск данных Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Отображение и просмотр реквизитов справочника или документа - с бесконечным открытием подуровней.

1 стартмани

14.06.2024    3396    7    RustIG    26    

22

Поиск данных Системный администратор Программист Платформа 1С v8.3 Россия Абонемент ($m)

Статья об опыте развертывания и интеграции с базой данных Manticore Search для быстрого полнотекстового поиска.

1 стартмани

30.11.2023    4565    andreysidor4uk    18    

53

Поиск данных Корректировка данных Пользователь Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

PowerOffice - обработка для поиска, просмотра и обработки данных для пользователей. Доступ к объектам на просмотр и редактирование данных определяется правами пользователя.

1 стартмани

05.06.2023    2327    25    PowerBoy    1    

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

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

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

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

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

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

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

Для установки опасной сортировки пользователю достаточно просто кликнуть на заголовок столбца. Он тут же и забудет об этом. А настройка сохраняется и дальше список всегда "тормозит". В особо неудачных случаях для отображения списка требуется несколько минут. При этом нет никаких внешних признаков по каким колонкам можно сортировать, а по каким - нельзя. Остается ограничивать доступные для сортировки списка колонки, как описано в заметке.
C0mmander_Alex; cleaner_it; st4rk; Cyberhawk; artbear; Дмитрий74Чел; Алексей Воробьев; JohnyDeath; triviumfan; PRO100_NigGaZ; +10 Ответить
10. PRO100_NigGaZ 121 21.07.20 12:51 Сейчас в теме
(9) Не стал удалять эти вызовы, хотя и не относятся к теме. А вообще да, не дает пользователю случайно сломать список
11. stepani4 10.10.20 21:28 Сейчас в теме
Спасибо автору за код.
но пришлось его чуть модернизировать
Для Каждого ЭлементНастроек Из Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы Цикл
		Для Каждого ЭлементОтбора Из ЭлементНастроек.Отбор.Элементы Цикл
			Если ТипЗнч(ЭлементОтбора)=  Тип("ГруппаЭлементовОтбораКомпоновкиДанных") тогда
				Продолжить; //у групп нет свойства "ЛевоеЗначение"
			КонецЕсли;	
			РазрешенныеПоля.Добавить(Строка(ЭлементОтбора.ЛевоеЗначение));
		КонецЦикла;
	КонецЦикла;
Показать
JohnyDeath; cleaner_it; Somebody1; Дмитрий74Чел; dkonakov; +5 Ответить
12. bmk 15.12.21 02:47 Сейчас в теме
Не понимаю, что делаю не так. У меня есть 4 поля в справочнике номенклатура по которым я хочу искать. Код. артикул, наименование, мое поле. Мое поле реквизит не типовой, учавствует в полнотекстовом поиске проиндексирован. Если в разрешенных полях указывать эти четыре поля, то ищет только по первым трем. Если ограничение убрать ищет по всем, в том числе по моему полю
13. alex1004 16.12.21 13:07 Сейчас в теме
"Этот метод не блокирует возможности установки отборов через настройку списка или "быстрых отборов" отдельно выведенных на форму создателями типовых конфигураций."
Насколько понимаю это актуально до тех пор, пока конфигурация не переводится в режим совместимости 8.3.16 или выше.
Начал переводить КА 2.4. на КА 2.5. где сменился режим совместимости с 8.3.14 на 8.3.16 и мой список номенклатуры с данной доработкой, до сих пор прекрасно работавший с дополнительными отборами по полям не указанными в "РазрешенныеПоля", начал вываливаться с ошибками.

В изменениях к платформе 8.3.16 написано.

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

Как стало
При получении данных динамическим списком проверяется наличие всех полей отбора среди доступных полей отбора. При обнаружении первого недоступного для отбора поля генерируется ошибка.
В режиме совместимости с версией 8.3.15 поведение не изменилось.

Результат изменения
Устранено некорректное поведение системы.
14. triviumfan 97 29.08.22 22:19 Сейчас в теме
Блокируются не все поля отбора. Есть поля, которые платформой добавляются, хотя их нету ни в запросе, ни в компановщике настроек.
Например, есть ДС в "Документы.СчетНаОплатуПокупателю.ФормаСписка" в БП3.
Ограничил "Номер, Дата, контрагент и Ссылка". Но в поля отбора попали Договор, Банковский счет и прочие поля. И соответственно я могу обратиться в договор или дальше, и например, сделать отбор Договор.Комментарий Содержит "123".
ЗЫ: или это все поля из ссылки на документ... похоже на то.
15. пользователь 21.02.23 10:39
Сообщение было скрыто модератором.
...
16. sys1c 05.04.23 07:14 Сейчас в теме
Добрый день, сейчас на 8.3.22 УТ 11.5 выше описанный код, в подборе товаров в заказ покупателя,

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

выдает ошибку "Параметры Отбора, Сортировки, Группировки или список отображаемых полей заданы неверно. Не найдено поле отбора Номенклатура.ОблагаетсяНДСУПокупателя"

хелп говорит что с 8.3.19 методы УстановитьОграниченияИспользованияВГруппировке объявлены устаревшими и надо использовать
"ОграничениеИспользования"

кто-нибудь переделывал на новый метод?(10)
DVKas; lisov; DiscordPro; +3 Ответить
18. Vlaxrom 2 18.09.23 15:04 Сейчас в теме
(16) Писал для частного случая (списка справочника), возможно необходимо дополнить для других:

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

Показать
cleaner_it; +1 Ответить
17. ipoloskov 164 07.09.23 13:55 Сейчас в теме
Добавил:

Для Каждого ЭлементОтбора Из Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы Цикл
	РазрешенныеПоля.Добавить(Строка(ЭлементОтбора.ЛевоеЗначение));
КонецЦикла;
23. DVKas 09.02.24 06:46 Сейчас в теме
(17) Режим совместимости Версия 8.3.16 Добавление данного кода не помогло.
19. sys1c 19.09.23 04:59 Сейчас в теме
(18) Скажите пожалуйста, что за свойство у Динамического списка "Поля"? у меня такого нет.
Прикрепленные файлы:
20. Vlaxrom 2 20.09.23 17:43 Сейчас в теме
(19)
о у Динамического списка "Поля"? у меня такого нет.
Прикрепленные файлы:

А какая версия платформы, какой режим совместимости конфигурации?

Должно быть так:
Прикрепленные файлы:
21. sys1c 21.09.23 04:06 Сейчас в теме
(20) 1С:Предприятие 8.3 (8.3.22.1923)
Управление торговлей, редакция 11 (11.5.12.87)
Режим совместимости: Версия 8.3.17

специально проверил на Demo базе от 1с. - нет свойства Поля в ДинамическомСписке
Обработка - ПодборТоваровВДокументПродажи
22. Vlaxrom 2 21.09.23 10:49 Сейчас в теме
(21)
Режим совместимости: Версия 8.3.17

Наверное в этом и проблема, до 8.3.19 видимо стоит использовать "УстановитьОграниченияИспользования"
24. DVKas 13.02.24 07:07 Сейчас в теме
У меня Режим совместимости Версия 8.3.16. Данную ошибку решил удалением реквизита. Два варианта, один через ОбщийМодуль, другой "вручную". Заработало.


// процедура "УстановитьОграничениеДинамическогоСписка" работает при условии удаления поля из-за которого ошибка 
// Вариант 1
ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбораДинамическогоСписка(ЭтаФорма.СписокНоменклатура, "Номенклатура.ОблагаетсяНДСУПокупателя");
	// Вариант 2
	//НастройкиФ = ЭтаФорма.СписокНоменклатура.КомпоновщикНастроек.ФиксированныеНастройки;
	//Для Каждого ЭлементОтбора Из НастройкиФ.Отбор.Элементы Цикл
	//	Если ТипЗнч(ЭлементОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") тогда
	//    	Продолжить; //у групп нет свойства "ЛевоеЗначение"
	//    КонецЕсли;	
	//    Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура.ОблагаетсяНДСУПокупателя") Тогда
	//    	НастройкиФ.Отбор.Элементы.Удалить(ЭлементОтбора);
	//    КонецЕсли;
	//КонецЦикла; 
	
	УстановитьОграничениеДинамическогоСписка(ЭтаФорма.СписокНоменклатура, СтрРазделить("Артикул,Наименование,Код", ",", Ложь));
Показать
25. Stanforeva 26.04.24 11:26 Сейчас в теме
А как в МассивПолей добавить поля из ссылок, например в ERP стандартно подразделение не является колонкой в списке заказов, но пара юзеров его добавила. В настройке формы она называется "Подразделение (Ссылка)". Естественно этого поля нет в Список.КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.Элементы. Можно конечно его добавить в запрос, но большинству юзеров он на форме нафик не сдался. А в поиске нужно чтобы участвовал.
26. Vlaxrom 2 26.04.24 12:18 Сейчас в теме
(25) Поищите в
Список.КомпоновщикНастроек.ПользовательскиеНастройки

или
Список.КомпоновщикНастроек.Настройки.ПользовательскиеПоля
Оставьте свое сообщение