Динамический список и поиск... неприятностей

17.03.21

Разработка - Работа с интерфейсом

Страх и ненависть в поиске по динамическому списку, или "Кое-что о неоптимальном отборе".

Это я потом понял, что всему виной была моя гиперактивность. А как хорошо всё начиналось - обработки работают, солнышко к горизонту клонится, обмен себе знай пыхтит, через хмл-конвертацию данные грузит... Дёрнуло же меня полезть смотреть навскидку выбранный элемент справочника. Чисто для спокойствия. Открыл я, значит, параллельный сеанс базы, нашёл уже прогруженный ранее справочник.

Да, товарищи. Справочником этим была "Номенклатура". Очень такой солидный, немаленький объём данных.

 

 

И что сделал типа умный я? Набрал в поиске, который услужливо торчит в форме списка, свои заветные несколько буковок. Цензурных, ясное дело. Но 1С обиделась. Совсем. Потому что стала громко пыхтеть, жрать все ресурсы, какие я мог пронаблюдать, и вообще изображать мировую катастрофу типа "мы все умрём". И умерла через повешение.

Быть палачом и вешателем мне, конечно, не хотелось, поэтому взгрустнул и задумался, это что ж такое я зацепил ненароком? Форма списка в той конфе простая, без закидонов, права и РЛС в норме, запрос у динамического списка кошерный, т.е. соединений со всякой ересью не содержит. Железячные ресурсы тоже, в общем, адекватные, ERP тянут. Архитектура, все дела - не на что грешить.

Тут у читателя возникают вопросы - а) что это за конфа, б) что стряслось. Конфа - BAS для Украины, по сути локализованная УТ с доработками; а что именно стряслось - мне тоже стало интересно, взял лопату и принялся за изучение.

Динамический список, для чистоты эксперимента, я сунул на отдельную форму внешней обработки. В такое мы, крутые разрабы, все умеем) Дальше мысль пошла в сторону настроек оного списка, а это СКД.
Дыра это нора, нора это Кролик...

 

 

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

 
 Отбор СКД текстом

Поиск, как мы все знаем, кончается именно отбором. А уж вытащить отбор, имея дело с динамическим списком, адски сложное дело типа такого:

ТекстДокумент=Новый ТекстовыйДокумент;
Настройки=Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных(); // это штатный метод платформы
ПостроитьСтроковоеПредставлениеОтборов(Настройки.Отбор, ТекстДокумент); // это моя процедура, если чо

А потом я этот "ТекстДокумент" на клиенте смотрю глазами.

Ииии..

Допустим, я юзверь и хочу найти зверя в базе животных. Шиншиллу, например. Потому как всё происходящее - очень пушной зверёк. Вот и будем искать по первым четырём буквам.

 

 

Дальше я проиллюстрирую, что происходило. Я вбивал буквы, ставился отбор, и смотрел, что в настройки СКД напихано - конкретно, в настройку отбора. И вот что получилось.

 
 Динамический список совсем по умолчанию

 

Сразу стало понятно, что добрый механизм платформы ищет по всем строковым реквизитам. Разумеется, и по неиндексируемым. И в случае справочника - и по тем, что для групп, и по тем, что для элементов. И по наименованиям ссылочных реквизитов. Группой "ИЛИ". Видом сравнения "Содержит". Везде.

 

 

Хорошо хоть, числовые да булевы, да всякие там гуидные, не припахивает. Правда, если внимательно посмотреть, то на значения перечислений устанавливается отбор "В списке", и списки эти пустые. И ещё вообще пустые группы отборов. Ну... есть многое на свете, друг Горацио, что пропустил дебаг при компиляции...

Ага, подумал я, щас мы его. И поотключал видимость колонок.

 
 Динамический список лишь с несколькими видимыми колонками, из кучи имеющихся в элементе списка

Поскольку крутизна пёрла из ушей, я вспомнил про флаги "Использовать всегда" и "Получение представлений для невидимых полей". И - о ужас! - оказалось, что ровно никакого влияния на работу этого поиска-отбора они не оказывают.

Далее я сделал произвольный запрос. Он уже порадовал больше.

 
 Динамический список с произвольным запросом

 

А ещё добавим-ка веселья полей, которые разыменуют (т.е. через точку) те, что в списке. И добавил - и в режиме Конфигуратор, и в режиме Предприятие, через волшебную "Изменить форму". Натурально, опять забабахал поиск.

 
 Добавленные поля, разыменование и много-много точек

 

А потом я ещё поиграл с видимостью колонок. И понял: единственный фактор, влияющий на наложение отбора - видимо поле или невидимо.

 

 

Супер, подумал я, созерцая картину. А ведь есть ещё разные другие поиски. Как они ищут, родимые?

Всё оказалось лучше, чем могло быть:

 
 "Расширенный" поиск

 

 
 "Найти" - конкретное значение

 

Правда, эти поиски могут накладываться один на другой. Тогда это выглядит примерно так:

 
 Одновременно "обычный" поиск и "расширенный"

Одновременно установленный "расширенный" поиск и поиск по Ctrl+F

[V] Наименование Содержит *ШИНШИЛЛА {Строка}
[V] Ссылка В группе из списка  {Позиция номенклатуры}
[V] ГРУППА ИЛИ
     [V] Наименование Содержит шинш {Строка}
     [V] Код Содержит шинш {Строка}
     [V] Артикул Содержит шинш {Строка}
     [V] ГРУППА ИЛИ
          [V] ВесЕдиницаИзмерения.Наименование Содержит шинш {Строка}
     [V] КодДляПоиска Содержит шинш {Строка}

и тормозит хотя и не столь люто, но изрядно. Имеем верхнее условие по "И".


Одного не знаю - ставится ли отбор на поля неограниченной длины, если их колонки видны в списке. Проверять не тянет, и так кошмары ночью снятся.

 

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

 


Мораль: каждый раз, когда юзер вбивает свои поисковые хотелки в это проклятущее поле, где-то в мире плачет одна Патти Сэлинджер. И злобно хохочет один БГН)

 

 

А если кто хочет добавки, то вопрос на самостоятельный разбор: у таблиц значений в формах тоже есть поиск. Такой же. Как же он-то себя ведёт?..

 

Если вам понравилось, то могу рассказать ещё изрядно страшных сказок из повседневной практики)))

Страшная сказка Отбор Динамический список Поиск Расширенный поиск

См. также

Управление дашбордами

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    17304    23    4    

37

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    11876    780    elcoan    47    

109

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    10347    157    acces969    31    

120

Модель состояния для MVC

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

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    4299    kalyaka    4    

31

Условное оформление элементов форм в пользовательском режиме 1С (управление видимостью и доступностью элементов форм)

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

Подсистема условного оформления элементов форм (далее подсистема) предназначена для настройки оформления элементов форм (видимость, доступность, цвет фона, цвет текста и прочее) в пользовательском режиме 1С. Также подсистему возможно использовать для ограничения доступа к реквизитам формы для определенных пользователей (или групп пользователей).

6000 руб.

18.01.2022    9175    1    2    

6

Программный интерфейс для доработки форм

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Реализовал простой способ программного создания новых элементов, команд и реквизитов на форме.

25.11.2021    10191    AtamanovYS    19    

142
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 94 17.03.21 12:16 Сейчас в теме
Кстати, на эту тему была интересная статья по ограничению поиска.
adhocprog; artbear; +2 Ответить
2. Yashazz 4752 17.03.21 12:21 Сейчас в теме
(1) Да, конечно) Отписывался там. В первую очередь надо юзать УстановитьОграниченияИспользованияВОтборе, ну и надо учитывать условное оформление и установленные самим пользователем отборы. И программно ставящиеся отборы, если такие есть, тоже.
3. reset2 17 17.03.21 15:23 Сейчас в теме
Полнотекстовый поиск выключен?
4. Yashazz 4752 17.03.21 15:41 Сейчас в теме
(3) а это неважно. Это не имеет значения. Полнотекстовый поиск не имеет к этому отношения.
15. Akcium 311 17.03.21 18:34 Сейчас в теме
(4) Отношение имеет непосредственное. Если в ИБ отключен полнотекстовый поиск, то поиск данных выполнятеся через конструкцию, которую вы привели выше. Если включен, то с использованием индекса полнотекстового поиска, что значительно быстрее.
Поэтому если вы оставляете в динамических списках строку поиска, то полнотекстовый поиск должен быть включен в ИБ и для объекта полнотекстовый поиск должен использоваться.
Irwin; mickey.1cx; awk; +3 Ответить
17. Yashazz 4752 17.03.21 19:21 Сейчас в теме
(15) Конструкция отбора всё равно остаётся ровно той же, что он включён, что он выключен. Я, конечно, скульный план запроса не смотрел, но мне крайне сомнительно, что тут каким-то боком используется полнотекстовый.
И повторюсь - относительно недавно в таблицах значений, НЕ являющихся динамическими списками, сделали такой же функционал поиска. Там тоже, пардон, полнотекстовый заюзали?
user1534961; RustIG; +2 Ответить
18. Akcium 311 17.03.21 23:17 Сейчас в теме
(17) Официальная информация тут: https://its.1c.ru/db/v8315doc#bookmark:dev:TI000001337 (смотреть начиная с "Рассмотрим особенности использования поиска в динамическом списке:")
Старенький разбор на инфостарте по теме тут: https://infostart.ru/1c/articles/292828/

В таблицах значений используется обычный поиск, но объем данных там несопоставим с результатами запроса динамического списка и эти данные полностью есть на клиенте, то есть для поиска даже сервер вызывать не надо, ни то что обращаться к СУБД.
mickey.1cx; awk; user1534961; ixijixi; RustIG; +5 Ответить
19. reset2 17 18.03.21 00:49 Сейчас в теме
(17) Конструкция отбора да - не измениться. Но эти отборы будут "применяться" к уже подготовленным (проиндексированным) данным полнотекстового поиска, за которыми в скуль ходить не надо. Это в разы (РАЗЫ!!!) увеличивает производительность контекстного отбора по большим спискам.
Таблицы значений уже есть на формах целиком (как уже ответили), там по другому достигается производительность.

Конечно есть свои нюансы и особенности связанные с поддержанием актуального индекса... Но если уж морочится с производительностью, то лучше разобраться с ним, чем отключать пользователям удобный инструмент работы в ИБ - с формулировкой "слабый сервер, 1С тупит".
mickey.1cx; Akcium; user1534961; Yashazz; +4 Ответить
20. Yashazz 4752 18.03.21 07:49 Сейчас в теме
(19) Можно подробнее, как и к каким данным будут применяться такие отборы? И ссылку, если есть, пожалуйста. Похоже, я чего-то по-крупному не знаю.
5. IssakN 45 17.03.21 15:58 Сейчас в теме
Статья познавательная спасибо. Плюс.
Вопрос кто такие:
где-то в мире плачет одна Патти Сэлинджер. И злобно хохочет один БГН)
?
triviumfan; rhtr; +2 Ответить
6. rozer 309 17.03.21 16:36 Сейчас в теме
+ статье

(5)
>> БГН
оффтопик: застал времена когда Великий Создатель ОдинЭса приезжал лично на своей "Волге" в каждый новый московский франч - все сидели за праздничным столом и делали "селфи" (хотя тогда и слова-то такого "селфи" не было) ... и радовались ))
8. Yashazz 4752 17.03.21 16:44 Сейчас в теме
9. rozer 309 17.03.21 16:49 Сейчас в теме
16. Yashazz 4752 17.03.21 19:16 Сейчас в теме
(9) и только фирменное занудство удержало меня от потока ностальгических воспоминаний, насколько одинэснее тогда была 1С и как хорошо жилось в 7.5, без таблиц значений и панели окон... Почти как в тонком клиенте недавно)
7. Yashazz 4752 17.03.21 16:43 Сейчас в теме
(5) П.Сэлинджер (Pat Selinger) в 1970-е занималась разработкой cost-based optimizer'а, стоимостного оптимизатора для первого варианта SQL.
Ну а что касается Великого Создателя, думаю, всё очевидно)))
13. IssakN 45 17.03.21 18:04 Сейчас в теме
10. RocKeR_13 1338 17.03.21 17:16 Сейчас в теме
Сразу стало понятно, что добрый механизм платформы ищет по всем строковым реквизитам.

Давно уже так)

Реализовано в версии 8.3.5.1068.

Мы переработали механизм поиска в списках, сделав его более удобным и понятным.
.....
Например, если вы хотите найти, что покупала «Шлюзовая ООО» оптом со среднего склада, то для этого просто наберите на клавиатуре: «шлюз опт сре»:
.....
При этом платформа будет искать во всех колонках списка одновременно по нескольким значениям (фрагментам строк).


Источник
11. Yashazz 4752 17.03.21 17:26 Сейчас в теме
(10) Это я всё в курсе, да только искать можно очень по-разному. Можно дополнительные индексы намутить а-ля полнотекстовый, можно как-то к порции подкачки списка привязаться, или хотя бы начинать с индексированных полей, а потом уж во все тяжкие... но - оно такое.
12. RocKeR_13 1338 17.03.21 17:51 Сейчас в теме
(11) Ну 1С же старалась сделать
его более удобным и понятным

=)))

Поэтому уже давно в более-менее крупных базах использую только расширенный поиск по нужным мне полям. С другой стороны, по приведенному примеру в Зазеркалье понятно, чего они хотели добиться (одновременный поиск по нескольким колонкам по частям введенных строк и в том числе по колонкам, которые добавили сами пользователи через "Изменить форму"), но на практике быстрее установить 3 отбора через расширенный поиск
Кстати, интересно будет взглянуть на установленные отборы, если ввести несколько слов через пробел)))
14. Yashazz 4752 17.03.21 18:31 Сейчас в теме
(12)
интересно будет взглянуть на установленные отборы, если ввести несколько слов через пробел

Вообще полный адЪ будет. Потому что 1С продублирует этот отборище столькими группами, соединёнными "И" на верхнем уровне, сколько текста фрагментов, разделённых пробелами, ввёл пользователь. По блоку на каждый фрагмент.
user1534961; +1 Ответить
21. RustIG 1670 18.03.21 10:05 Сейчас в теме
все по делу. понравился разбор и самописная выгрузка в текстовый документ параметров отбора....я бы сейчас не догадался бы так делать, но во времена 7-ки постоянно так делал...
user1534961; +1 Ответить
22. aleksey2 87 18.03.21 21:44 Сейчас в теме
какой командой на форму кинуть обычный поиск и расширенный ?
23. Yashazz 4752 18.03.21 21:47 Сейчас в теме
(22) а зачем их кидать принудительно, они сами появляются как дочерние объекты динамического списка. Можно отрегулировать их элементы формы, но и всё... Не очень понятен вопрос.
24. Hans 3 18.03.21 22:25 Сейчас в теме
25. Yashazz 4752 18.03.21 22:26 Сейчас в теме
26. Hans 3 19.03.21 09:33 Сейчас в теме
(25) Зачем ты это сюда выложил если это и так всем известно?
27. Yashazz 4752 19.03.21 10:22 Сейчас в теме
(26) А по приколу. Захотелось, понимаешь, публикацию забацать в новомодном духе, с прикольными картинками и минимумом занудства, вот и взял первую попавшуюся фишку. С тем же успехом я мог бы это сделать, допустим, на примере кэширования XDTO, работы с макетом компоновки СКД, или, допустим, разницей в работе ЗаписатьXML на клиенте и на сервере.

ну и потом, а вдруг пацаны не знают?))
vvh74; Deslime; caponid; user1534961; +4 Ответить
31. caponid 19.03.21 11:15 Сейчас в теме
(27) Интриги, скандалы, расследования!
Не переключайтесь, после рекламной паузы на нашем канале ТНТ вы увидите очередную историю!

Хороший кич, зачет)))
32. Yashazz 4752 19.03.21 12:56 Сейчас в теме
(31) Ну да) Смотрите в следующих сериях: "Сообщить, куда надо", "Запись без права записи" и, конечно, "5 способов уронить ЖР в новых релизах" )))
37. Yashazz 4752 05.05.21 13:04 Сейчас в теме
(31) а вообще грустно, конечно. Потому как эта, кхм, "публикация" - действительно просто кич, стёб и издёвка. Это ведь по сути что - пара фактов из разряда общеизвестной хрени, приправленная нарочито придурковатым стилем изложения и не менее дурацкими картиночками. И что? И очень даже наплюсили. В отличие от многих гораздо более серьёзных, трудоёмких и глубоких исследований. Наглядная иллюстрация, и весьма печальная. Слишком многие восприняли всерьёз...
35. Cyberhawk 135 24.03.21 17:39 Сейчас в теме
(27) Про
разницей в работе ЗаписатьXML на клиенте и на сервере
и
кэширования XDTO
почитал бы с интересом.
28. user1534961 19.03.21 10:26 Сейчас в теме
Пока этого поиска на форме не было, выводили окна отбора. В окне отбора по реквизиту тоже выполняется поиск, но только по первым символам наименования и кода. Это не тормозит, но и таких возможностей как в полнотекстовом нет (а очень хотят).
29. Yashazz 4752 19.03.21 10:34 Сейчас в теме
(28) Так это всё равно не полнотекстовый, это чисто виды сравнения СКД, в частности, "начинается с", "заканчивается на". Поэтому и полнотекстовый не получили, и отбор сделали чудовищный.
user1534961; +1 Ответить
30. user1534961 19.03.21 10:39 Сейчас в теме
(29) а в чем проблема использовать сравнения СКД?
Индексы sql на все не включается?
33. Yashazz 4752 19.03.21 12:58 Сейчас в теме
(30) Индексация скуля и полнотекстовый механизм платформы - не синонимы. СКД дин.списка делает отбор на строковые поля, которые отродясь ни в один индекс могли не входить, а в существование волшебного и всепокрывающего я не верю)
user1534961; +1 Ответить
34. user1534961 19.03.21 13:02 Сейчас в теме
Мне непонятно, как полнотекстовый индекс, который обновляется фоновым заданием на сервере, может находиться в клиентском кэше? Простите за глупый вопрос.
36. Cyberhawk 135 24.03.21 17:40 Сейчас в теме
(34)
как полнотекстовый индекс, который обновляется фоновым заданием на сервере, может находиться в клиентском кэше?
А откуда эта информация? Индекс ППД хранится в каталоге кластера 1С (на сервере приложений).
Оставьте свое сообщение