diff --git "a/src/model/classes/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\220\320\263\320\265\320\275\321\202\320\260\320\274.os" "b/src/model/classes/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\220\320\263\320\265\320\275\321\202\320\260\320\274.os" index d2eac0d..05251e2 100644 --- "a/src/model/classes/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\220\320\263\320\265\320\275\321\202\320\260\320\274.os" +++ "b/src/model/classes/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\220\320\263\320\265\320\275\321\202\320\260\320\274.os" @@ -101,6 +101,10 @@ Для Каждого ТекОписаниеОбъекта Из КэшОписанийОбъектов Цикл + Если НЕ ОбъектСоответствуетПредварительномуФильтру(ТекОписаниеОбъекта, Фильтр) Тогда + Продолжить; + КонецЕсли; + // При необходимости получаем полное описание ИБ или соединения и сохраняем в кэш ЗаполнитьРасширенноеОписаниеОбъекта(ТипОбъекта, ТекОписаниеОбъекта.Значение, Поля, ОбновленныеОписания); @@ -838,3 +842,68 @@ КонецФункции // ТипыОбъектовКластера() #КонецОбласти // СлужебныеПроцедурыИФункции + +#Область ПредварительнаяФильтрацияОбъектов + +// Функция проверяет, относится ли поле к тому списку полей, который может +// использоваться для предварительной фильтрации объектов кластера +// +// Возвращаемое значение: +// Булево - Истина - поле может использоваться для предварительной фильтрации +// +Функция ЭтоПолеПредварительногоФильтраОбъекта(ИмяПоля) + + ПоляПредварительногоФильтра = Новый Соответствие(); + ПоляПредварительногоФильтра.Вставить("ID" , Истина); + ПоляПредварительногоФильтра.Вставить("LABEL" , Истина); + ПоляПредварительногоФильтра.Вставить("AGENT" , Истина); + ПоляПредварительногоФильтра.Вставить("CLUSTER" , Истина); + ПоляПредварительногоФильтра.Вставить("CLUSTER-LABEL", Истина); + ПоляПредварительногоФильтра.Вставить("CLUSTER-HOST" , Истина); + ПоляПредварительногоФильтра.Вставить("CLUSTER-PORT" , Истина); + + Возврат ПоляПредварительногоФильтра[ВРег(ИмяПоля)] <> Неопределено; + +КонецФункции + +// Функция проверяет соответствие значений полей объекта указанному набору сравнений (фильтру) +// результаты сравнений объединяются по "И" +// +// Параметры: +// Объект - Соответствие - проверяемый объект +// Фильтр - Массив из Структура - набор сравнений (фильтр) +// * Оператор - Строка - оператор сравнения +// * Значение - Произвольный - значение для сравнения +// РегистроНезависимо - Булево - Истина - при сравнении на (не)равенство +// +// Возвращаемое значение: +// Булево - Истина - значения полей объекта соответствует фильтру +// +Функция ОбъектСоответствуетПредварительномуФильтру(Объект, Фильтр, РегистроНезависимо = Истина) + + Результат = Истина; + + Если НЕ (ЗначениеЗаполнено(Фильтр) И ТипЗнч(Фильтр) = Тип("Соответствие")) Тогда + Возврат Результат; + КонецЕсли; + + Для Каждого ТекЭлементФильтра Из Фильтр Цикл + Если ЭтоПолеПредварительногоФильтраОбъекта(ТекЭлементФильтра.Ключ) Тогда + Если Объект.Значение[ТекЭлементФильтра.Ключ] = Неопределено Тогда + Результат = Ложь; + Прервать; + КонецЕсли; + Результат = ОбщегоНазначения.ЗначениеСоответствуетФильтру(Объект.Значение[ТекЭлементФильтра.Ключ], + ТекЭлементФильтра.Значение, + РегистроНезависимо); + КонецЕсли; + Если НЕ Результат Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции // ОбъектСоответствуетФильтру() + +#КонецОбласти // ПредварительнаяФильтрацияОбъектов \ No newline at end of file