В статье показан пример, как скрыть "злосчастную" линию поиска в динамических списках, которая порождает тяжелые запросы и сильно нагружает базу (особенно в моменты активной работы пользователей). На оригинальность решения не претендую - возможно, кто-то что-то подобное уже сделал.
Итак: первое действие - сделать поле поиска невидимым в форме. Как правило, во всех формах типовых конфигураций есть общий глобальный метод модуля, который вызывается "ПриСозданииНаСервере". В УТ11 это
СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
Если у вас много самописных документов и других объектов - желательно обойти все формы и не полениться вписать эту строку в событие "ПриСозданииНаСервере".
Далее нужно вписать глобальный код по скрытию "ненужного" элемента. Для этого берем расширение, переопределяем в нем модуль "СобытияФорм", вписываем в нем что-то вроде
&После("ПриСозданииНаСервере")
Процедура add_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка, ДополнительныеПараметры)
Для Каждого ПолеПоиска Из Форма.Элементы Цикл
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ПолеПоиска, "Вид") И
ПолеПоиска.Вид = ВидДополненияЭлементаФормы.ОтображениеСтрокиПоиска Тогда
ПолеПоиска.Видимость = Ложь;
КонецЕсли;
КонецЦикла;
// Для списка номенклатуры скрываем группу с "линией поиска".
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Форма, "ИмяФормы") И Найти(Форма.ИмяФормы, "Номенклатура") И
ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Форма.Элементы, "РасширенныйПоиск") Тогда
Форма.Элементы.РасширенныйПоиск.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
Этого действия было бы достаточно, если бы различные объекты: документы, справочники имели бы определенную форму списка с вписанной строкой "СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);", НО есть же объекты "вообще без форм" - и таковых, как правило, много.
Для "объектов без форм" придуман некий прием по самостоятельной генерации динамического списка на форме.
1. Создаем в том же расширении простую общую форму, кладем на нее пустой реквизит формы "Динамический список" вообще без всего: без основной таблицы, реквизитов... И бросаем его на форму:
2. Создаем подписку на событие следующего вида:
Цель: переопределить форму списка для всех объектов системы, у которых нет программной формы.
Код подписки следующий:
Процедура ПолучитьФорму(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
Если ВидФормы = "ФормаСписка" Тогда
Если СтрНачинаетсяС(Источник, "РегистрСведенийМенеджер.") ИЛИ
СтрНачинаетсяС(Источник, "РегистрНакопленияМенеджер.") Тогда
Пустое = Источник.ПустойКлюч();
ВыбМетаданные = Пустое.Метаданные();
Если ВыбМетаданные.ОсновнаяФормаСписка = Неопределено Тогда
СтандартнаяОбработка = Ложь;
Параметры.Вставить("ТипМД1", ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ВыбМетаданные));
Параметры.Вставить("ТипМД2", СтрЗаменить(Параметры.ТипМД1, "Регистры", "Регистр"));
Параметры.Вставить("ИмяМД", ВыбМетаданные.Имя);
ВыбраннаяФорма = "ОбщаяФорма.add_ФормаСпискаОбщая";
КонецЕсли;
ИначеЕсли СтрНачинаетсяС(Источник, "СправочникМенеджер.") ИЛИ
СтрНачинаетсяС(Источник, "ДокументМенеджер.") Тогда
Пустое = Источник.ПустаяСсылка();
ВыбМетаданные = Пустое.Метаданные();
Если ВыбМетаданные.ОсновнаяФормаСписка = Неопределено Тогда
СтандартнаяОбработка = Ложь;
Параметры.Вставить("ТипМД1", ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ВыбМетаданные));
Параметры.Вставить("ТипМД2", ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗнч(Пустое)));
Параметры.Вставить("ИмяМД", ВыбМетаданные.Имя);
ВыбраннаяФорма = "ОбщаяФорма.add_ФормаСпискаОбщая";
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
3. Теперь остается в самой форме программно обработать динамический список, чтобы он показал нам нужный список данных. Пишем код в форме "add_ФормаСпискаОбщая.ПриСозданииНаСервере":
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Список.ОсновнаяТаблица = Параметры.ТипМД2 + "." + Параметры.ИмяМД;
ВыбМетаданные = Метаданные[Параметры.ТипМД1][Параметры.ИмяМД];
Если СтрНачинаетсяС(Параметры.ТипМД2, "РегистрСведений") Тогда
Если СокрЛП(ВыбМетаданные.ПериодичностьРегистраСведений) <> "Непериодический" Тогда
НовЭл = Элементы.Добавить("СписокПериод",Тип("ПолеФормы"), Элементы.Список);
НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
НовЭл.ПутьКДанным = "Список.Период";
КонецЕсли;
Если СокрЛП(ВыбМетаданные.РежимЗаписи) = "ПодчинениеРегистратору" Тогда
НовЭл = Элементы.Добавить("СписокПериод",Тип("ПолеФормы"), Элементы.Список);
НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
НовЭл.ПутьКДанным = "Список.Период";
КонецЕсли;
ИначеЕсли СтрНачинаетсяС(Параметры.ТипМД2, "РегистрНакопления") Тогда
НовЭл = Элементы.Добавить("СписокПериод",Тип("ПолеФормы"), Элементы.Список);
НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
НовЭл.ПутьКДанным = "Список.Период";
НовЭл = Элементы.Добавить("СписокПериод",Тип("ПолеФормы"), Элементы.Список);
НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
НовЭл.ПутьКДанным = "Список.Период";
ИначеЕсли СтрНачинаетсяС(Параметры.ТипМД2, "Справочник") Тогда
Если ВыбМетаданные.ДлинаКода Тогда
НовЭл = Элементы.Добавить("СписокКод",Тип("ПолеФормы"), Элементы.Список);
НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
НовЭл.ПутьКДанным = "Список.Код";
КонецЕсли;
Если ВыбМетаданные.ДлинаНаименования Тогда
НовЭл = Элементы.Добавить("СписокНаименование",Тип("ПолеФормы"), Элементы.Список);
НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
НовЭл.ПутьКДанным = "Список.Наименование";
КонецЕсли;
ИначеЕсли СтрНачинаетсяС(Параметры.ТипМД2, "Документ") Тогда
НовЭл = Элементы.Добавить("СписокДата",Тип("ПолеФормы"), Элементы.Список);
НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
НовЭл.ПутьКДанным = "Список.Дата";
Если ВыбМетаданные.ДлинаНомера Тогда
НовЭл = Элементы.Добавить("СписокНомер",Тип("ПолеФормы"), Элементы.Список);
НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
НовЭл.ПутьКДанным = "Список.Номер";
КонецЕсли;
КонецЕсли;
Если СтрНачинаетсяС(Параметры.ТипМД2, "Регистр") Тогда
Для каждого ТекМД Из ВыбМетаданные.Измерения Цикл
НовЭл = Элементы.Добавить("Список" + ТекМД.Имя,Тип("ПолеФормы"), Элементы.Список);
НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
НовЭл.ПутьКДанным = "Список." + ТекМД.Имя;
КонецЦикла;
Для каждого ТекМД Из ВыбМетаданные.Ресурсы Цикл
НовЭл = Элементы.Добавить("Список" + ТекМД.Имя,Тип("ПолеФормы"), Элементы.Список);
НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
НовЭл.ПутьКДанным = "Список." + ТекМД.Имя;
КонецЦикла;
КонецЕсли;
Для каждого ТекМД Из ВыбМетаданные.Реквизиты Цикл
НовЭл = Элементы.Добавить("Список" + ТекМД.Имя,Тип("ПолеФормы"), Элементы.Список);
НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
НовЭл.ПутьКДанным = "Список." + ТекМД.Имя;
КонецЦикла;
СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
КонецПроцедуры
Вот в целом и все. Конечно, всех проблем "неоптимального ввода отборов пользователей" оно не решит, но нагрузку на СУБД все-таки облегчает.