Скрываем линию поиска

18.04.24

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

Как скрыть линию поиска во всех формах конфигурации.

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

Итак: первое действие - сделать поле поиска невидимым в форме.  Как правило, во всех формах типовых конфигураций есть общий глобальный метод модуля, который вызывается "ПриСозданииНаСервере". В УТ11 это 

СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);

Если у вас много самописных документов и других объектов - желательно обойти все формы и не полениться вписать эту строку в событие "ПриСозданииНаСервере".

Далее нужно вписать глобальный код по скрытию "ненужного" элемента. Для этого берем расширение, переопределяем в нем модуль "СобытияФорм", вписываем в нем что-то вроде

&После("ПриСозданииНаСервере")
Процедура add_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка, ДополнительныеПараметры)

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

КонецПроцедуры

Этого действия было бы достаточно, если бы различные объекты: документы, справочники имели бы определенную форму списка с вписанной строкой "СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);", НО есть же объекты "вообще без форм" - и таковых, как правило, много.

Для "объектов без форм" придуман некий прием по самостоятельной генерации динамического списка на форме.

1. Создаем в том же расширении простую общую форму, кладем на нее пустой реквизит формы "Динамический список" вообще без всего: без основной таблицы, реквизитов... И бросаем его на форму:

 

 

 

2. Создаем подписку на событие следующего вида:

 

 

Цель: переопределить форму списка для всех объектов системы, у которых нет программной формы.

Код подписки следующий:

 
 Код подписки получения формы

 

Процедура ПолучитьФорму(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
	
	Если ВидФормы = "ФормаСписка" Тогда
		
		Если СтрНачинаетсяС(Источник, "РегистрСведенийМенеджер.") ИЛИ
			СтрНачинаетсяС(Источник, "РегистрНакопленияМенеджер.") Тогда
			
			Пустое = Источник.ПустойКлюч();
			ВыбМетаданные = Пустое.Метаданные();
			Если ВыбМетаданные.ОсновнаяФормаСписка = Неопределено Тогда  
				
				СтандартнаяОбработка = Ложь;
				Параметры.Вставить("ТипМД1", ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ВыбМетаданные));  
				Параметры.Вставить("ТипМД2", СтрЗаменить(Параметры.ТипМД1, "Регистры", "Регистр"));
				Параметры.Вставить("ИмяМД", ВыбМетаданные.Имя);  
				ВыбраннаяФорма = "ОбщаяФорма.add_ФормаСпискаОбщая";
				
			КонецЕсли;
			
		ИначеЕсли СтрНачинаетсяС(Источник, "СправочникМенеджер.") ИЛИ
			 	СтрНачинаетсяС(Источник, "ДокументМенеджер.") Тогда  
				
			Пустое = Источник.ПустаяСсылка();
			ВыбМетаданные = Пустое.Метаданные();
			Если ВыбМетаданные.ОсновнаяФормаСписка = Неопределено Тогда  
				
				СтандартнаяОбработка = Ложь;
				Параметры.Вставить("ТипМД1", ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ВыбМетаданные));  
				Параметры.Вставить("ТипМД2", ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗнч(Пустое)));
				Параметры.Вставить("ИмяМД", ВыбМетаданные.Имя);  
				ВыбраннаяФорма = "ОбщаяФорма.add_ФормаСпискаОбщая";
				
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

 

 

3. Теперь остается в самой форме программно обработать динамический список, чтобы он показал нам нужный список данных. Пишем код в форме "add_ФормаСпискаОбщая.ПриСозданииНаСервере":

 
 Обработка универсального динамического списка

 

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
				
	Список.ОсновнаяТаблица = Параметры.ТипМД2 + "." + Параметры.ИмяМД; 
	
	ВыбМетаданные = Метаданные[Параметры.ТипМД1][Параметры.ИмяМД];
	
	Если СтрНачинаетсяС(Параметры.ТипМД2, "РегистрСведений") Тогда   
		
		Если СокрЛП(ВыбМетаданные.ПериодичностьРегистраСведений) <> "Непериодический" Тогда
			НовЭл = Элементы.Добавить("СписокПериод",Тип("ПолеФормы"), Элементы.Список);
			НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
			НовЭл.ПутьКДанным = "Список.Период";
		КонецЕсли;
		Если СокрЛП(ВыбМетаданные.РежимЗаписи) = "ПодчинениеРегистратору" Тогда
			НовЭл = Элементы.Добавить("СписокПериод",Тип("ПолеФормы"), Элементы.Список);
			НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
			НовЭл.ПутьКДанным = "Список.Период";
		КонецЕсли;                                
		
	ИначеЕсли СтрНачинаетсяС(Параметры.ТипМД2, "РегистрНакопления") Тогда    
		
		НовЭл = Элементы.Добавить("СписокПериод",Тип("ПолеФормы"), Элементы.Список);
		НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
		НовЭл.ПутьКДанным = "Список.Период";
		НовЭл = Элементы.Добавить("СписокПериод",Тип("ПолеФормы"), Элементы.Список);
		НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
		НовЭл.ПутьКДанным = "Список.Период";   
		
	ИначеЕсли СтрНачинаетсяС(Параметры.ТипМД2, "Справочник") Тогда
		
		Если ВыбМетаданные.ДлинаКода Тогда
			НовЭл = Элементы.Добавить("СписокКод",Тип("ПолеФормы"), Элементы.Список);
			НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
			НовЭл.ПутьКДанным = "Список.Код";
		КонецЕсли;
		Если ВыбМетаданные.ДлинаНаименования Тогда
			НовЭл = Элементы.Добавить("СписокНаименование",Тип("ПолеФормы"), Элементы.Список);
			НовЭл.Вид = ВидПоляФормы.ПолеНадписи;
			НовЭл.ПутьКДанным = "Список.Наименование";
		КонецЕсли;                                

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

 

 

Вот в целом и все. Конечно, всех проблем "неоптимального ввода отборов пользователей" оно не решит, но нагрузку на СУБД все-таки облегчает.

См. также

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

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

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

2400 руб.

29.06.2020    17244    23    4    

37

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

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

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

27.12.2023    11772    777    elcoan    47    

109

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

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

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

2 стартмани

10.04.2023    10275    157    acces969    31    

120

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

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

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

1 стартмани

05.07.2022    4248    kalyaka    4    

31

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

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

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

6000 руб.

18.01.2022    9136    1    2    

6

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

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

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

25.11.2021    10097    AtamanovYS    19    

142
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. BackinSoda 18.04.24 09:27 Сейчас в теме
С переопределением формы хорошо придумано!
Рамзес; Vasvas05; ixijixi; +3 Ответить
2. SlavaKron 18.04.24 13:36 Сейчас в теме
линию поиска в динамических списках, которая порождает тяжелые запросы и сильно нагружает базу
Лечится методом элемента списка УстановитьОграниченияИспользованияВОтборе
3. RocKeR_13 1335 18.04.24 14:10 Сейчас в теме
Как правило, во всех формах типовых конфигураций есть общий глобальный метод модуля, который вызывается "ПриСозданииНаСервере".

Увы, в той же бухгалтерии далеко не во всех формах подключены процедуры переопределения форм. Более того, где подключены - там создан отдельный общий модуль для конкретных документов, например, "РеализацияТоваровУслугФормы", "ПоступлениеНаРасчетныйСчетФормы" и т.д.

А так вообще зачастую достаточно напомнить пользователям про расширенный поиск: там, где строка поиска сильно тормозит, они сами переходят на расширенный поиск.
4. Vasvas05 24 18.04.24 16:29 Сейчас в теме
включение старого поиска CTRL+F
Список = Форма.Элементы.Найти("Список");
	Если Список = Неопределено или Найти(Форма.ИмяФормы,"ФормаСписка")=0 Тогда
		Возврат;
	КонецЕсли;
	
	Список.ПоложениеСтрокиПоиска = ПоложениеСтрокиПоиска.Нет;
	
	ДополнениеСтрокаПоиска = Форма.Элементы.Найти("ДополнениеСтрокаПоиска");
	Если НЕ ДополнениеСтрокаПоиска = Неопределено Тогда
		ДополнениеСтрокаПоиска.Видимость = Ложь;
	КонецЕсли;
	

Показать
METAL; Рамзес; artkor; Поручик; bulpi; Dolour; +6 Ответить
5. PerlAmutor 129 19.04.24 04:08 Сейчас в теме
Мне запретили отключать. Народ стал жаловаться руководству, что это было удобно и т.д. Так что если отключаете, то делайте это еще на этапе внедрения, чтобы никто даже не догадывался о существовании этого демона.
BomjBandit; +1 Ответить
6. ixijixi 1818 19.04.24 09:41 Сейчас в теме
скрыть "злосчастную" линию поиска в динамических списках, которая порождает тяжелые запросы и сильно нагружает базу

Для того чтобы поиском было удобно пользоваться (в том числе и с точки зрения быстродействия) необходимо включить полнотекстовый поиск для всех объектов конфигурации, которые могут использоваться в качестве основной таблицы динамического списка. Также в полнотекстовом поиске должны участвовать все реквизиты объектов конфигурации, которые могут отображаться в динамическом списке и по которым может потребоваться поиск.

https://its.1c.ru/db/v8315doc#bookmark:dev:TI000001337
METAL; YA_418728146; +2 Ответить
9. artkor 284 22.04.24 09:17 Сейчас в теме
(6) У нас по политическим причинам админы отключили его совсем на основной большой базе. Есть плюсы, но есть и минусы:
- результат полнотекстового поиска "напихивает" найденные ссылки во временные таблицы - это сильно грузит темпДБ
- в версии ПП v2 какие-то странные тормоза наблюдаются, обновление индекса не помогает совсем - поиск так и не отрабатывает. Мы на другой маленькой БД сначала отключили ПП насовсем, потом перевели на v1: стало работать буквально за 1 секунду.
Может неправ - но ПП оправдан только для небольших дин-списков
7. leosoft 166 19.04.24 10:51 Сейчас в теме
(6) Тут недавно обнаружил, что на типовой Бухгалтерии полнотекстовый поиск создает файл по размерам как файл базы данных .1CD! Например, база - 6 ГБ, а файлы поиска - 4 ГБ! Может кто знает - как с этим бороться?
10. artkor 284 22.04.24 09:22 Сейчас в теме
(7) вот есть статья в помощь: https://is1c.ru/about/pc/article/upravlenie-polnotekstovym-poiskom/
Имхо если каждый объект конфы участвует в индексе ПП - это вполне логичный объем :)
Попробуйте обновить индекс ПП, или сначала отключить потом переформировать, опыт будет )
11. leosoft 166 22.04.24 10:34 Сейчас в теме
(10) Отключал, все равно при включении восстанавливается прежний размер папки поиска!
Более того - беру базу к себе на комп без папки поиска - у меня тут же идет восстановление...
Понятно, что надо отключать на копии, хотя поиск тогда не будет работать.
8. Dimel 19.04.24 13:24 Сейчас в теме
Я делал подобный функционал, только для подключения к подсистеме "ПодключаемыеКоманды".

Пару замечаний:
1) Необходимо в глобальной подписке на получение формы делать проверку параметра "ВыбраннаяФорма" - форму могли уже переопределить в модуле менеджера объекта.
2) Модуль в котором отрабатывает подписка должен иметь признак "Внешнее соединение". Вроде бы интерфейсное событие, но при обращении через COM будет ломаться.
3) В параметрах необходимо задавать "КлючНазначенияИспользования" иначе у вас перестанет работать сохранение настроек формы.
4) При выводе надо анализировать права на стандартный реквизит или прочие данные - могли ограничить правами часть данных.
5) Анализировать типы не отображаемые пользователю, например "ХранилищеЗначения".
sergey82vladik; ixijixi; artkor; mszsuz; +4 Ответить
12. JohnyDeath 301 23.04.24 22:00 Сейчас в теме
Я у себя все формы списка документов (а именно там чаще всего и тупит база на ПП) ограничил отбором в "1 год" через расширение
Прикрепленные файлы:
13. demonisius 24.04.24 14:03 Сейчас в теме
(12)
Было бы любопытно посмотреть на Вашу реализацию ограничения.
14. JohnyDeath 301 24.04.24 14:28 Сейчас в теме
(13) Расширяем ОбщийМодуль.ПодключаемыеКоманды и его процедуру "ПриСозданииНаСервере"
&После("ПриСозданииНаСервере")
Процедура ОграничениеПериодаЖурналов_ПриСозданииНаСервере(Форма, Знач ПараметрыРазмещения) Экспорт
	Если Форма.Элементы.Найти("Список") = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если НЕ СтрНачинаетсяС(Форма.Список.ОсновнаяТаблица, "Документ.") 
		И НЕ СтрНачинаетсяС(Форма.Список.ОсновнаяТаблица, "ЖурналДокументов.")
		Тогда
		Возврат;
	КонецЕсли;
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
		Форма.Список,
		"Дата",
		НачалоДня(ДобавитьМесяц(ТекущаяДатаСеанса(), ОграничениеПериодаЖурналов_Общий.СдвигЖурналовМесяцев())),
		ВидСравненияКомпоновкиДанных.БольшеИлиРавно,
		"Ограничить 1 годом",
		Истина,
		РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ		
	);
КонецПроцедуры
Показать
artkor; Рамзес; +2 Ответить
15. artkor 284 24.04.24 22:49 Сейчас в теме
(14) решение неплохое, но когда 1000 заказов в день в то и больше-все равно сканы появляются. По статистике самый распространённый запрос поиска-по куску номера документа без нулей: ... like %3452%. В свободное время 'колдуем' как ограничить отбор чтобы в индекс попадал
16. JohnyDeath 301 25.04.24 10:16 Сейчас в теме
(15) я поэтому ограничение периода и вынес в настройку "ОграничениеПериодаЖурналов_Общий.СдвигЖурналовМесяцев()"
Но там надо и название фильтра соот-но менять, а я немного поленился и бросил, потому что этот вариант пока устраивает )

У меня часто ищут не номер, а по имени контрагента. Разговоры о том, что есть быстрый фильтр по контрагенту или быстрый поиск по одной колонке не помогают. Подавляющее большинство всё равно будут вбивать свою строку в этот полнотекстовый поиск и ждать...
не знаю как с этим бороться, но отключать полностью это поле означает подписать себе смертный приговор ) Бунт начнется в ту же минуту
17. artkor 284 25.04.24 21:54 Сейчас в теме
(16) до этого еще подбор товаров изменили: в дин.списке можно отключить типовой подбор и сортировку это очень полезно оказалось. Сортировка СУБД мучает намного сильнее чем отбор: надо запрещать 'тыкать на шапку индексированных колонок' и ставить сортировку по умолчанию. После этого свои программные прибамбасы сделали: выпадающие списки колонок сортировки и отбора. Менеджеры поругались поплевались немного, потом привыкли) главное удобный интерфейс придумать с минимумом телодвижений
18. JohnyDeath 301 25.04.24 22:10 Сейчас в теме
(17) у меня еще веселей было. Одна из пользователей сделала группировку в журнале документов "по дням". Отбора по периоду не стояло.
Вот так просто она вешала всю базу.
19. artkor 284 26.04.24 22:07 Сейчас в теме
(18)интересно. хорошо что у нас юзеры про эту возможность не знают)
Оставьте свое сообщение