Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Предварительная фильтрации объектов кластера #9 #10

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions src/model/classes/ПодключениеКАгентам.os
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@

Для Каждого ТекОписаниеОбъекта Из КэшОписанийОбъектов Цикл

Если НЕ ОбъектСоответствуетПредварительномуФильтру(ТекОписаниеОбъекта, Фильтр) Тогда
Продолжить;
КонецЕсли;

// При необходимости получаем полное описание ИБ или соединения и сохраняем в кэш
ЗаполнитьРасширенноеОписаниеОбъекта(ТипОбъекта, ТекОписаниеОбъекта.Значение, Поля, ОбновленныеОписания);

Expand Down Expand Up @@ -838,3 +842,68 @@
КонецФункции // ТипыОбъектовКластера()

#КонецОбласти // СлужебныеПроцедурыИФункции

#Область ПредварительнаяФильтрацияОбъектов

// Функция проверяет, относится ли поле к тому списку полей, который может
// использоваться для предварительной фильтрации объектов кластера
//
// Возвращаемое значение:
// Булево - Истина - поле может использоваться для предварительной фильтрации
//
Функция ЭтоПолеПредварительногоФильтраОбъекта(ИмяПоля)

ПоляПредварительногоФильтра = Новый Соответствие();
ПоляПредварительногоФильтра.Вставить("ID" , Истина);
ПоляПредварительногоФильтра.Вставить("LABEL" , Истина);
ПоляПредварительногоФильтра.Вставить("AGENT" , Истина);
ПоляПредварительногоФильтра.Вставить("CLUSTER" , Истина);
ПоляПредварительногоФильтра.Вставить("CLUSTER-LABEL", Истина);
ПоляПредварительногоФильтра.Вставить("CLUSTER-HOST" , Истина);
ПоляПредварительногоФильтра.Вставить("CLUSTER-PORT" , Истина);

Возврат ПоляПредварительногоФильтра[ВРег(ИмяПоля)] <> Неопределено;

КонецФункции

// Функция проверяет соответствие значений полей объекта указанному набору сравнений (фильтру)
// результаты сравнений объединяются по "И"
//
// Параметры:
// Объект - Соответствие - проверяемый объект
// Фильтр - Массив из Структура - набор сравнений (фильтр)
// * Оператор - Строка - оператор сравнения
// * Значение - Произвольный - значение для сравнения
// РегистроНезависимо - Булево - Истина - при сравнении на (не)равенство
//
// Возвращаемое значение:
// Булево - Истина - значения полей объекта соответствует фильтру
//
Функция ОбъектСоответствуетПредварительномуФильтру(Объект, Фильтр, РегистроНезависимо = Истина)

Результат = Истина;

Если НЕ (ЗначениеЗаполнено(Фильтр) И ТипЗнч(Фильтр) = Тип("Соответствие")) Тогда
Возврат Результат;
КонецЕсли;

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

Возврат Результат;

КонецФункции // ОбъектСоответствуетФильтру()

#КонецОбласти // ПредварительнаяФильтрацияОбъектов