Стандартные фильтры

From SunFlurry wiki
Revision as of 11:41, 18 November 2022 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Стандартные фильтры для поиска объекта или группы объектов в базе данных могут быть использованы в двух режимах: простой режим и сложный режим запроса. Фильтры используются в функциях поиска объектов (Find), загрузки объектов (Load), выборки по объектам (Select) и пр.

  • В простом режиме стандартные фильтры представляют собой произвольное количество аргументов, назначение аргументов следующее:
    • <Список реквизитов и особых реквизитов фильтра (STRING)> - (необязательный аргумент) Строковой аргумент, перечисляющий реквизиты объекта с префиксами поиска, по которым будет производиться поиск, все реквизиты должны присутствовать, также принимаются особые (специальные) реквизиты, зависящие от типа объекта поиска, каждый такой реквизит начинается на знак @. Аргумент может начинаться на символ "`" (код 96), данный символ будет пропущен при разборе аргумента и может быть использован для форсирования простого режима фильтров (позволяет использование первого знака "~", без перехода в сложный режим фильтра). Каждый из реквизитов имеет возможный префикс, задающий способ применения фильтра, т.е., формат записи реквизита фильтра следующий [<Префикс>]<Наименование реквизита>. Ниже дан список возможных префиксов и суффиксов:
      • % - префикс, означающий, что фильтром является строка с помощью которой необходимо отфильтровать реквизиты, как содержащие эту подстроку (к примеру, для фрагмента <Объект>.Find("%Комментарий","123") будет найден первый из объектов, содержащий в реквизите Комментарий подстроку "123"). Поиск выполняется без обращения с полнотекстовому поиску
      • ~ - префикс, означающий, что фильтром является строка с помощью которой необходимо отфильтровать реквизиты, как содержащие эту подстроку (к примеру, для фрагмента <Объект>.Find("`~Комментарий","123") будет найден первый из объектов, содержащий в реквизите Комментарий подстроку "123"). Поиск выполняется с помощью полнотекстового поиска, если последний не доступен, префикс будет трактоваться как %.
      • <, >, <=, => - префиксы, означающие меньше, больше, меньше равно или больше равно соответственно, могут использоваться с числовыми, строковыми или аргументами, типа дата и время.
      • = - префикс по умолчанию (его можно опустить), означающий проверку на соответствие реквизиту аргументу. Может использоваться с любыми типами аргументов, кроме списков.
      • <> - префикс, означающий проверку на не соответствие реквизиту аргументу. Может использоваться с любыми типами аргументов, кроме списков.
      • -> - префикс, означающий проверку на то, что искомый реквизит входит в список значений, либо папку элемента справочника, как одно из значений или элемент справочника, находящийся по структуре внутри указанной папки. Данный префикс будет работать по умолчанию, если значением аргумента является папка справочника, либо список, содержащий папки справочника.
      • !-> - префикс, означающий проверку на то, что искомый реквизит не входит в список значений, либо папку элемента справочника, как одно из значений или элемент справочника, находящийся по структуре внутри указанной папки, является противоположным префиксу ->.
      • Ниже дан список возможных особых реквизитов с описанием и указанием на объект, к которому их можно применить:
      • @ELEMENT - указывает на текущий элемент (можно, к примеру, осуществить фильтр по папке(ам) справочника, указав реквизит в виде @ELEMENT-> и аргумент фильтра в виде списка или папки). Реквизит можно использовать для любых объектов (в т.ч. для строчных частей и накопителей, однако, в этом случае, это имеет мало смысла).
      • @HEADER - указывает на элемент или документ при запросах к табличной части объекта.
      • @LINK - для журналов, указывает на оригинальный объект, помещенный в журнал, для накопителей, указывает оригинальный объект (чаще документ), имеющий движения в накопителе.
      • @ISFOLDER - для справочников или журналов, проверяет, является ли текущий (оригинальный) объект папкой или обычным элементом.
      • @FOLDER - для справочников, используется, как указание на папку, в которую помещен текущий элемент (папка). Если элемент не помещен ни в какую папку (элемент верхнего уровня), данный реквизит будет иметь пустое значение.
      • @PARENT - для справочников, используется, как указание на элемент родительского справочника, если справочник имеет заданных родителей.
      • @TRIGGER - для справочников или документов, указывает на текущий триггер изменения элемента (документа). См. также описание функции SetTrigger.
      • @STATUS, @MARK - для справочников, документов или журналов, указывает на текущий статус объекта. Доступны следующие значения: 0 - обычный объект, 1 - удаленный объект, 2 и более - обработанный объект (документ)
      • @LINEID - для строчных частей указывает на номер строки строчной части. Нумерация начинается с единицы.
      • @EXPENSE - для записей накопителей задает флаг расхода (если флаг приход или расход для накопителя разрешен).
      • @DATE - для записей накопителей указывает на дату записи.
      • @LINKTYPE - для журналов и накопителей, указывает на тип оригинального объекта. Аргументом фильтра в этом случае должна быть строка или список, состоящий из строк. Аргумент должен указывать на тип объекта отбора в формате <Тип объекта>.<Вид объекта> (к примеру "Doc.Реализация" будет производить отбор только документов типа реализация для журнала или накопителя).
      • @PARENTDOC - для документов, используется как указание на родительские документы из системной таблицы подчинения документов. Для одного документа может существовать произвольное количество родительских документов (т.е., документов, использующихся в реквизитах этого документа и имеющих пометку IsParentLink).
      • @CHILDDOC - для документов, используется как указание на подчиненные документы из системной таблицы подчинения документов. Для одного документа может существовать произвольное количество подчиненных документов (т.е., документов, в реквизитах которых, имеющих пометку IsParentLink, используется данный документ).
      • @USECONTROLFILTERS - используется, как специальный комбинированный фильтр, в аргументе фильтра должно следовать указание на визуальную таблицу, соответствующую текущему объекту (к примеру, текущий объект является справочником Контрагенты, и визуальная таблица выводит данный справочник на экран для работы пользователя). Любой фильтр, примененный к визуальной таблице (в т.ч. фильтры, заданные в редакторе форм Студии, фильтры, примененные к таблице программно, пользовательские фильтры по части слова, введенные пользователем в столбцы таблицы) будет также применен к поиску элементов.
    • <Значения фильтра 1>[,<Значения фильтра 2>...] - (необязательный аргумент) Количество данных аргументов должно соответствовать количеству реквизитов, перечисленных в предыдущем аргументе. Значениями фильтра могут быть объекты, следующих типов:
      • объект базы данных, строковое значение, числовое значение, дата и время - реквизит будет фильтроваться по указанному значению (или папке справочника в случае, если это значение является папкой справочника)
      • список значений - реквизит будет фильтроваться по всем объектам из списка значений (список может также включать папки справочника)
      • два или более списка значений внутри списка значений - реквизит будет проверен на вхождение в список значений, являющимся первым элементом списка-аргумента, список, являющийся вторым элементом списка-аргумента будет использован, как список для проверки "не вхождения". Данный аргумент соответствует двум операциям -> и !-> с соответствующими списками.
  • В сложном режиме запроса фильтр представляет собой произвольное количество аргументов, каждый из которых является условием, совместимым с условиями языка запросов (см. Объект запрос базы данных). Условия применяются по отдельности, поэтому все условия можно объединить в одно с помощью операторов AND. Аргументы представляют собой строки, первая строка начинается со знака ~, что является указанием на использование сложного фильтра. Каждая строка содержит произвольное логическое выражение, которое должно выполняться, чтобы элемент был включен в результат поиска.
    • При вычислении выражений, доступны следующие математические операторы: +, -, /, *, \ (DIV), % (MOD), ^ (XOR), &, |, ~
    • Логические операторы: NOT, AND, OR, IN, NOT IN, =, >, <, <=, =>, <>
    • Скобки: (, )
    • Функции: ? (_If), _Case, Case, Str, Length, Left, Right, Mid, Pos, Uppercase, Lowercase, Asc, Chr, Replace, RepeatStr, Reverse, Trim, TrimL, TrimR, Abs, Degrees, Radians, Arccos, Arcsin, Round, Cos, Sin, _Pi, _E, Log, Log10, Ln, Sign, Arctg, Arcctg, Tg, Ctg, Sqrt, Exp, Pow, Floor, Ceiling, Trunc, Frac, Number, Int, Sqr, Date, AddMonth, AddDay, BegOfDay, EndOfDay, BegOfMonth, EndOfMonth, EndOfMonthT, BegOfQuarter, EndOfQuarter, EndOfQuarterT, BegOfYear, EndOfYear, EndOfYearT, BegOfWeek, EndOfWeek, EndOfWeekT, GetYear, GetMonth, GetDay, GetHour, GetMinute, GetSecond, GetMSecond, WeekOfYear, DayOfYear, DayOfWeek, Coalesce, FilterProperty, IsNull, IsEmpty, IsType, см. документацию по языку запросов.
    • При указании на реквизит объекта (в т.ч. особенные реквизиты) можно использовать цепочку реквизитов и использовать операции приведения типов (см. описание в статье Объект запрос базы данных). К примеру, Номенклатура.ТоварнаяГруппа.Ответственный..Ref.Контрагенты.Code, создает запрос к реквизиту Code, справочника Контрагенты, когда элемент этого справочника выбран в реквизите Ответственный, справочника ТоварныеГруппы, элементы которого выбраны в реквизите ТоварнаяГруппа справочника Номенклатура, элементы которого выбраны в реквизите Номенклатура объекта, по которому выполняется запрос. В этом примере, реквизит "Ответственный" может иметь несколько видов, поэтому было необходимо отобрать только элементы, со ссылками на справочник Контрагенты.
    • Обращение к реквизитам строчных частей производится с помощью конструкции: <Наименование строчной части>.<Наименование реквизита строчной части>, к примеру, для проверки входит ли реквизит "Номенклатура" любой строки строчной части "Номенклатура" документа Реализация в список спНом, можно использовать проверку: Номенклатура.Номенклатура IN спНом.
    • В выражениях могут участвовать как реквизиты текущего объекта, так и переменные и функции программы. Периодические реквизиты должны включать дату, на которую они находятся (формат записи следующий: <Имя реквизита>(<Дата значения реквизита>)). При компиляции условий, система производит поиск слов в следующем порядке:
      • Происходит поиск внутренних операторов и функций (см. выше)
      • Происходит поиск реквизитов текущего объекта или его строчных частей.
      • Происходит поиск особых реквизитов текущего объекта
      • Происходит поиск внешних констант и переменных
      • Происходит поиск строковых, числовых или констант даты и времени
      • Происходит поиск и выполнение вызовов внешних функций языка (такие функции будут выполняться на этапе компиляции, результат их выполнения будет участвовать в скомпилированном выражении, как обычные данные)

Примеры использования

//Пример использования функции Find в простом режиме
aEl:=Ref.Контрагенты
If aEl.Find("Code","000000001734") Then
  Message("(1) Контрагент с кодом ""000000001734"" найден: "+aEl);
EndIf;

//Пример использования функции Find в режиме запроса
aEl:=Ref.Контрагенты
If aEl.Find("~Code=""000000001734""") Then
  Message("(2) Контрагент с кодом ""000000001734"" найден: "+aEl);
EndIf;


//В данном примере, показана выборка, которая выполняется быстрее и проверяет меньше элементов при использовании режима запроса.
//Список спОтветственные содержит требуемые элементы справочника Контрагенты, которые должны быть выбраны в реквизите Ответственный элементов справочника
//  ГруппыНоменклатуры, элементы которых должны быть выбраны в реквизите Группа справочника Номенклатура, по которому происходит выборка

//Пример использования выборки в простом режиме
aEl:=Ref.Номенклатура
aEl.Select("<>@Status",1);
While aEl.Next() Do
  If not спОтветственные.Contains(aEl.Группа.Ответственный) Then
    Continue;
  EndIf;
  //Выполнение требуемых действий с найденным элементом
  ...
EndDo;

//Пример использования выборки в режиме запроса
aEl:=Ref.Номенклатура
aEl.Select("~(@Status<>1)And(Группа.Ответственный IN спОтветственные)");
While aEl.Next() Do
  //Выполнение требуемых действий с найденным элементом
  ...
EndDo;