Это я потом понял, что всему виной была моя гиперактивность. А как хорошо всё начиналось - обработки работают, солнышко к горизонту клонится, обмен себе знай пыхтит, через хмл-конвертацию данные грузит... Дёрнуло же меня полезть смотреть навскидку выбранный элемент справочника. Чисто для спокойствия. Открыл я, значит, параллельный сеанс базы, нашёл уже прогруженный ранее справочник.
Да, товарищи. Справочником этим была "Номенклатура". Очень такой солидный, немаленький объём данных.
И что сделал типа умный я? Набрал в поиске, который услужливо торчит в форме списка, свои заветные несколько буковок. Цензурных, ясное дело. Но 1С обиделась. Совсем. Потому что стала громко пыхтеть, жрать все ресурсы, какие я мог пронаблюдать, и вообще изображать мировую катастрофу типа "мы все умрём". И умерла через повешение.
Быть палачом и вешателем мне, конечно, не хотелось, поэтому взгрустнул и задумался, это что ж такое я зацепил ненароком? Форма списка в той конфе простая, без закидонов, права и РЛС в норме, запрос у динамического списка кошерный, т.е. соединений со всякой ересью не содержит. Железячные ресурсы тоже, в общем, адекватные, ERP тянут. Архитектура, все дела - не на что грешить.
Тут у читателя возникают вопросы - а) что это за конфа, б) что стряслось. Конфа - BAS для Украины, по сути локализованная УТ с доработками; а что именно стряслось - мне тоже стало интересно, взял лопату и принялся за изучение.
Динамический список, для чистоты эксперимента, я сунул на отдельную форму внешней обработки. В такое мы, крутые разрабы, все умеем) Дальше мысль пошла в сторону настроек оного списка, а это СКД.
Дыра это нора, нора это Кролик...
СКД это настройки отбора, отбор это иерархическая коллекция, смотреть отладчиком - печальненько, поэтому сделал свою функцию. Чтобы все вложенные уровни сразу, текстом, весомо-грубо-зримо.
Как-то так примерно, мне вот внешний вид достаточен.
&НаСервереБезКонтекста
Процедура ПостроитьСтроковоеПредставлениеОтборов(рОтбор, рТекст, Знач рОтступ=0)
рПробелы=" ";
Для каждого элотб Из рОтбор.Элементы Цикл
стрИспользование=?(элотб.Использование,"[V] ","[ ] ");
стрОтступ=?(рОтступ=0,"",Лев(рПробелы,рОтступ));
Если ТипЗнч(элотб)=Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
рТекст.ДобавитьСтроку(стрОтступ+стрИспользование+ВРег(Строка(элотб.ТипГруппы)));
ПостроитьСтроковоеПредставлениеОтборов(элотб, рТекст, рОтступ+5);
Иначе
Если ТипЗнч(элотб.ПравоеЗначение)=Тип("СписокЗначений") Тогда
квоСписка=элотб.ПравоеЗначение.Количество();
Если квоСписка<10 Тогда
стрПравоеЗначение=СтрСоединить(элотб.ПравоеЗначение.ВыгрузитьЗначения(),"; ");
Иначе
стрПравоеЗначение="Список ("+Строка(квоСписка)+")";
КонецЕсли;
Иначе
стрПравоеЗначение=СокрЛП(Строка(элотб.ПравоеЗначение))+" {"+Строка(ТипЗнч(элотб.ПравоеЗначение))+"}";
КонецЕсли;
рТекст.ДобавитьСтроку(стрОтступ+стрИспользование+Строка(элотб.ЛевоеЗначение)+" "+Строка(элотб.ВидСравнения)+" "+стрПравоеЗначение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Поиск, как мы все знаем, кончается именно отбором. А уж вытащить отбор, имея дело с динамическим списком, адски сложное дело типа такого:
ТекстДокумент=Новый ТекстовыйДокумент;
Настройки=Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных(); // это штатный метод платформы
ПостроитьСтроковоеПредставлениеОтборов(Настройки.Отбор, ТекстДокумент); // это моя процедура, если чо
А потом я этот "ТекстДокумент" на клиенте смотрю глазами.
Ииии..
Допустим, я юзверь и хочу найти зверя в базе животных. Шиншиллу, например. Потому как всё происходящее - очень пушной зверёк. Вот и будем искать по первым четырём буквам.
Дальше я проиллюстрирую, что происходило. Я вбивал буквы, ставился отбор, и смотрел, что в настройки СКД напихано - конкретно, в настройку отбора. И вот что получилось.
Динамический список совсем по умолчанию
Всем привычное и вроде как безобидное:
Возник совершенно жуткий отбор - по всем видимым колонкам элемента формы списка. Выглядело это так:
[V] ГРУППА ИЛИ
[V] Наименование Содержит шинш {Строка}
[V] Код Содержит шинш {Строка}
[V] Артикул Содержит шинш {Строка}
[V] ВариантОформленияПродажи В списке
[V] ГРУППА ИЛИ
[V] ВесЕдиницаИзмерения.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] Контрагент.ГоловнойКонтрагент.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] Контрагент.ГоловнойКонтрагент.Партнер.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ВидНоменклатуры.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ГРУППА ИЛИ
[V] ЕдиницаИзмерения.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ГРУППА ИЛИ
[V] ДлинаЕдиницаИзмерения.Наименование Содержит шинш {Строка}
[V] ИспользованиеХарактеристик В списке
[V] КодДляПоиска Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] Марка.Наименование Содержит шинш {Строка}
[V] НаименованиеПолное Содержит шинш {Строка}
[V] Описание Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] Производитель.Наименование Содержит шинш {Строка}
[V] СтавкаНДС В списке
[V] ТипНоменклатуры В списке
[V] ГРУППА ИЛИ
[V] ТоварнаяКатегория.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ФайлКартинки.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ОбъемЕдиницаИзмерения.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ПлощадьЕдиницаИзмерения.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] СхемаОбеспечения.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] СпособОбеспеченияПотребностей.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ШаблонЦенника.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ШаблонЭтикетки.Наименование Содержит шинш {Строка}
[V] ЛьготаНДС Содержит шинш {Строка}
[V] ТекстДляПечатиВКолонкеЦенаНалоговойНакладной Содержит шинш {Строка}
[V] ТекстДляПечатиВКолонкеКоличествоНалоговойНакладной Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ГРУППА ИЛИ
[V] Контрагент.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ГРУППА ИЛИ
[V] НоменклатураГТД.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ВладелецСерий.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ВладелецХарактеристик.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ВладелецТоварныхКатегорий.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] СтатьяДекларацииПоАкцизномуНалогу.Наименование Содержит шинш {Строка}
[V] КодЛьготы Содержит шинш {Строка}
Сразу стало понятно, что добрый механизм платформы ищет по всем строковым реквизитам. Разумеется, и по неиндексируемым. И в случае справочника - и по тем, что для групп, и по тем, что для элементов. И по наименованиям ссылочных реквизитов. Группой "ИЛИ". Видом сравнения "Содержит". Везде.
Хорошо хоть, числовые да булевы, да всякие там гуидные, не припахивает. Правда, если внимательно посмотреть, то на значения перечислений устанавливается отбор "В списке", и списки эти пустые. И ещё вообще пустые группы отборов. Ну... есть многое на свете, друг Горацио, что пропустил дебаг при компиляции...
Ага, подумал я, щас мы его. И поотключал видимость колонок.
Динамический список лишь с несколькими видимыми колонками, из кучи имеющихся в элементе списка
Стало несколько лучше:
[V] ГРУППА ИЛИ
[V] Наименование Содержит шинш {Строка}
[V] Код Содержит шинш {Строка}
[V] Артикул Содержит шинш {Строка}
Поскольку крутизна пёрла из ушей, я вспомнил про флаги "Использовать всегда" и "Получение представлений для невидимых полей". И - о ужас! - оказалось, что ровно никакого влияния на работу этого поиска-отбора они не оказывают.
Далее я сделал произвольный запрос. Он уже порадовал больше.
Динамический список с произвольным запросом
Вроде бы, только те поля, которые я выбирал в запросе:
[V] ГРУППА ИЛИ
[V] Наименование Содержит шинш {Строка}
[V] Код Содержит шинш {Строка}
[V] Артикул Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ГРУППА ИЛИ
[V] ЕдиницаИзмерения.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] НаименованиеПолное Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] Производитель.Наименование Содержит шинш {Строка}
[V] ТипНоменклатуры В списке
[V] ГРУППА ИЛИ
[V] ГРУППА ИЛИ
[V] Контрагент.Наименование Содержит шинш {Строка}
[V] ГРУППА ИЛИ
А ещё добавим-ка веселья полей, которые разыменуют (т.е. через точку) те, что в списке. И добавил - и в режиме Конфигуратор, и в режиме Предприятие, через волшебную "Изменить форму". Натурально, опять забабахал поиск.
Добавленные поля, разыменование и много-много точек
Механизм поиска и по ним отбор устроил:
[V] ГРУППА ИЛИ
[V] Контрагент.ГоловнойКонтрагент.Наименование Содержит шинш {Строка}
и если его разыменовывать, тоже:
[V] ГРУППА ИЛИ
[V] Контрагент.ГоловнойКонтрагент.Партнер.Наименование Содержит шинш {Строка}
А потом я ещё поиграл с видимостью колонок. И понял: единственный фактор, влияющий на наложение отбора - видимо поле или невидимо.
Супер, подумал я, созерцая картину. А ведь есть ещё разные другие поиски. Как они ищут, родимые?
Всё оказалось лучше, чем могло быть:
Он всегда ищет по конкретному полю. Если поле строковое - ставит условие в зависимости от выбранного флажка в панельке поиска.
Отбор, для данного рисунка, выглядит так:
[V] Наименование Содержит *ШИНШИЛЛА {Строка}
[V] Ссылка В группе из списка {Позиция номенклатуры}
Отбор на ссылочное значение простой и скучный:
[V] ВесЕдиницаИзмерения Равно шт {Упаковка} - и он делается, конечно, "По точному совпадению". Зато быстро. Но тоже по любому реквизиту и его разыменованию.
Потом я решил слегка помучить 1С и заставил искать не по ссылке, которую указывал в "Что искать", а по куску строки. Дивно, однако этот кусок строки был применён для поиска ссылочного значения, и-таки отбор по ссылке установился:
Хм, подумали сибирские лесорубы, и указали то, чего быть не может, т.е. подстроку "поступл". 1С старательно поставила пустой отбор на ссылочный реквизит. И отобразила это в жёлтенькой панельке.
Причём в обоих случаях отбор этот был не на равенство, нееет! Отбор был на вхождение в список:
[V] ВариантОформленияПродажи В списке Реализация товаров и услуг
"Найти" - конкретное значение
Это которое отбор по колонке.
Оно не подвело!
Отбор был на равенство:
[V] Код Равно 626226 {Строка}
Правда, эти поиски могут накладываться один на другой. Тогда это выглядит примерно так:
Одновременно "обычный" поиск и "расширенный"
Одновременно установленный "расширенный" поиск и поиск по Ctrl+F
[V] Наименование Содержит *ШИНШИЛЛА {Строка}
[V] Ссылка В группе из списка {Позиция номенклатуры}
[V] ГРУППА ИЛИ
[V] Наименование Содержит шинш {Строка}
[V] Код Содержит шинш {Строка}
[V] Артикул Содержит шинш {Строка}
[V] ГРУППА ИЛИ
[V] ВесЕдиницаИзмерения.Наименование Содержит шинш {Строка}
[V] КодДляПоиска Содержит шинш {Строка}
и тормозит хотя и не столь люто, но изрядно. Имеем верхнее условие по "И".
Одного не знаю - ставится ли отбор на поля неограниченной длины, если их колонки видны в списке. Проверять не тянет, и так кошмары ночью снятся.
В общем, самым прожорливым ресурсоёмким оказался поиск, завсегда каждому доступный. Потому что отбор, генерируемый им, кромешная жуть с точки зрения производительности. Вот оно, смотрите и бойтесь помните:
Мораль: каждый раз, когда юзер вбивает свои поисковые хотелки в это проклятущее поле, где-то в мире плачет одна Патти Сэлинджер. И злобно хохочет один БГН)
А если кто хочет добавки, то вопрос на самостоятельный разбор: у таблиц значений в формах тоже есть поиск. Такой же. Как же он-то себя ведёт?..
Если вам понравилось, то могу рассказать ещё изрядно страшных сказок из повседневной практики)))