Платформа 3V/Формы/Источники данных/Справочник/Фильтрация/От другого справочника: различия между версиями

Материал из 3v-wiki
Перейти к навигации Перейти к поиску
Строка 23: Строка 23:
 
! Свойство !! Описание
 
! Свойство !! Описание
 
|-
 
|-
| dictionaryEntrySourceId || Id источника - справочника, от значений которого будут фильтроваться данные
+
| dictionaryEntrySourceId || Id источника - справочника в форме, от значений которого будут фильтроваться данные
 
|-
 
|-
 
| sourceAttribute|| [[Платформа_3V/Справочник/Связи_атрибутов_справочников|''' Атрибут''']] справочника, от значений которого будут фильтроваться данные
 
| sourceAttribute|| [[Платформа_3V/Справочник/Связи_атрибутов_справочников|''' Атрибут''']] справочника, от значений которого будут фильтроваться данные
Строка 31: Строка 31:
 
| discriminator|| EntryFilter
 
| discriminator|| EntryFilter
 
|-  
 
|-  
| conditionType || Тип условий
+
| conditionType || [[Платформа_3V/Формы/Источники_данных/Справочник/Фильтрация#Типы%20условий%20фильтрации%20(conditionType)| '''Тип условий''']]
 
|-  
 
|-  
 
| inversion || В значении "false" источник-справочник принимает значения, которые удовлетворяют фильтру, в значении "true" - все значения, которые наоборот не удовлетворяют ему
 
| inversion || В значении "false" источник-справочник принимает значения, которые удовлетворяют фильтру, в значении "true" - все значения, которые наоборот не удовлетворяют ему
Строка 42: Строка 42:
  
 
== Пример фильтрации от собственного атрибута ==
 
== Пример фильтрации от собственного атрибута ==
Справочник "Контрагенты" содержит связный атрибут "Виды контрагентов". Можно создать клиентскую карточку в которой, при выборе из выпадающего списка "Вида контрагентов", элементы следующего выпадающего списка "Контрагенты" будут только выбранного виду.
+
Справочник "Контрагенты" содержит связный атрибут "Виды контрагентов". Можно создать форму у в которой, при выборе из выпадающего списка "Вида контрагентов", элементы следующего выпадающего списка "Контрагенты" будут только выбранного вида.
 
[[Файл:Screenshot 2021-04-15 at 10.34.19.png|400px|безрамки|без]]
 
[[Файл:Screenshot 2021-04-15 at 10.34.19.png|400px|безрамки|без]]
  
Строка 75: Строка 75:
 
       "visible": true,
 
       "visible": true,
 
       "hint": null,
 
       "hint": null,
      "uiDataSource": {
 
        "attribute": {
 
          "id": 21,
 
          "discriminator": "OwnAttributeDefinitionDto"
 
        },
 
        "attributeId": null,
 
        "sourceId": 1,
 
        "discriminator": "UiDataSourceDictionary"
 
      },
 
 
       "doActionOnChangeValue": true,
 
       "doActionOnChangeValue": true,
 
       "onAfterChangeValueConditionalActions": null,
 
       "onAfterChangeValueConditionalActions": null,
Строка 114: Строка 105:
 
       "visible": true,
 
       "visible": true,
 
       "hint": null,
 
       "hint": null,
      "uiDataSource": {
 
        "attribute": {
 
          "id": 2,
 
          "discriminator": "OwnAttributeDefinitionDto"
 
        },
 
        "attributeId": null,
 
        "sourceId": 1,
 
        "discriminator": "UiDataSourceDictionary"
 
      },
 
 
       "doActionOnChangeValue": false,
 
       "doActionOnChangeValue": false,
 
       "onAfterChangeValueConditionalActions": null,
 
       "onAfterChangeValueConditionalActions": null,
Строка 136: Строка 118:
 
   ],
 
   ],
 
   "entryDataSources": [
 
   "entryDataSources": [
    {
 
      "dictionaryId": 10736,
 
      "hierarchyId": null,
 
      "filter": null,
 
      "sortingOptions": null,
 
      "groupingOptions": null,
 
      "dictionaryAttributes": null,
 
      "defaultValue": [],
 
      "defaultValueExpressionId": null,
 
      "parameterId": null,
 
      "dictionarySourceSelectionMode": "None",
 
      "dataSourceAttributesAdditionsSettings": [],
 
      "externalFileStorageUrl": null,
 
      "filePrefix": null,
 
      "defaultNewElementSettings": null,
 
      "id": 1,
 
      "name": "Справочник",
 
      "isReadOnly": false,
 
      "dataEditRuleIds": [],
 
      "beforeSaveDataActions": [],
 
      "afterSaveDataActions": [],
 
      "discriminator": "DictionaryDataSource"
 
    },
 
 
     {
 
     {
 
       "dictionaryId": 10754,
 
       "dictionaryId": 10754,
Строка 234: Строка 193:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
</div></div>
 
</div></div>
Два контрола (uiSources): Вид контрагента (id=1) и Контрагенты (id=2).
+
Два поля - Выпадающих списка: Вид контрагента и Контрагенты с источниками-справочниками (Справочник видов контрагентов (id=2, "dictionaryId": 10754,) и справочник Контрагентов (id=3, "dictionaryId": 10755))
Три источника (entryDataSources): Справочник, куда данные будут записываться (id=1), справочник видов контроля (id=2, "dictionaryId": 10754,) и справочник Контрагентов (id=3, "dictionaryId": 10755).
 
  
 
В источник "Контрагенты" добавлен фильтр, в котором указан "dictionaryEntrySourceId": 2 - справочник видов контроля от значений которого идет фильтрация, далее указан номер атрибута справочника Контрагенты (id=1), в данном случае мы сравниваем по первому атрибуту - идентификатору. Далее обозначен атрибут текущего источника, справочника "Контрагенты", с которым мы сравниваем и в котором указан вид (id=21).
 
В источник "Контрагенты" добавлен фильтр, в котором указан "dictionaryEntrySourceId": 2 - справочник видов контроля от значений которого идет фильтрация, далее указан номер атрибута справочника Контрагенты (id=1), в данном случае мы сравниваем по первому атрибуту - идентификатору. Далее обозначен атрибут текущего источника, справочника "Контрагенты", с которым мы сравниваем и в котором указан вид (id=21).
 +
 +
Таким образом при выборе элемента в поле "Вид контрагента" будет происходить фильтрация в поле "Контрагенты "
 +
 +
Важно! Если необходимо, чтобы фильтрация происходила сразу после выбора "Вида контрагента", необходимо поставить флаг "Выполнить действие при изменении значения", в ином случае будет необходимо [[Платформа_3V/Формы/Действия/обновить источник| '''Условия''']]
 +
 
<syntaxhighlight lang="JSON" line>
 
<syntaxhighlight lang="JSON" line>
 
"filter": {
 
"filter": {

Версия 08:07, 21 января 2022

Фильтр EntryFilter позволяет выбрать данные в справочнике относительно другого связного справочника. Элементы одного справочника будут отображаться в зависимости от выбранных элементов другого справочника. Элемент "filter" добавляется в источник, который необходимо отфильтровать. Фильтр имеет следующую структуру:

 1 "filter": {
 2         "dictionaryEntrySourceId": 2,
 3         "sourceAttribute": {
 4           "id": 21,
 5           "discriminator": "OwnAttributeDefinitionDto"
 6         },
 7         "attribute": {
 8           "id": 1,
 9           "discriminator": "OwnAttributeDefinitionDto"
10         },
11         "conditionType": "AttributeInCollection",
12         "inversion": false,
13         "conditionId": null,
14         "discriminator": "EntryFilter"
15           }

Описание свойств фильтра

Свойство Описание
dictionaryEntrySourceId Id источника - справочника в форме, от значений которого будут фильтроваться данные
sourceAttribute Атрибут справочника, от значений которого будут фильтроваться данные
attribute Атрибут текущего источника, с которым связано значение справочника от которого идет фильтрация. Указывается номер Id и тип атрибута в данном случае собственный (OwnAttributeDefinitionDto), так как используются данные текущего справочника.
discriminator EntryFilter
conditionType Тип условий
inversion В значении "false" источник-справочник принимает значения, которые удовлетворяют фильтру, в значении "true" - все значения, которые наоборот не удовлетворяют ему
conditionId Условия, при которых применяется фильтр

Особенности использования

При использовании в фильтрации источника - справочника транзитивного атрибута другого источника - справочника необходимо обязательно указать в источнике, от которого происходит фильтрация, в блоке "dictionaryAttributes" все атрибуты (транзитивные и собственные), которые используются. Пример см.ниже "Пример фильтрации от транзитивного атрибута"

Пример фильтрации от собственного атрибута

Справочник "Контрагенты" содержит связный атрибут "Виды контрагентов". Можно создать форму у в которой, при выборе из выпадающего списка "Вида контрагентов", элементы следующего выпадающего списка "Контрагенты" будут только выбранного вида.

Screenshot 2021-04-15 at 10.34.19.png
JSON серверной карточки

Два поля - Выпадающих списка: Вид контрагента и Контрагенты с источниками-справочниками (Справочник видов контрагентов (id=2, "dictionaryId": 10754,) и справочник Контрагентов (id=3, "dictionaryId": 10755))

В источник "Контрагенты" добавлен фильтр, в котором указан "dictionaryEntrySourceId": 2 - справочник видов контроля от значений которого идет фильтрация, далее указан номер атрибута справочника Контрагенты (id=1), в данном случае мы сравниваем по первому атрибуту - идентификатору. Далее обозначен атрибут текущего источника, справочника "Контрагенты", с которым мы сравниваем и в котором указан вид (id=21).

Таким образом при выборе элемента в поле "Вид контрагента" будет происходить фильтрация в поле "Контрагенты "

Важно! Если необходимо, чтобы фильтрация происходила сразу после выбора "Вида контрагента", необходимо поставить флаг "Выполнить действие при изменении значения", в ином случае будет необходимо Условия

 1 "filter": {
 2         "dictionaryEntrySourceId": 2,
 3         "sourceAttribute": {
 4           "id": 1,
 5           "discriminator": "OwnAttributeDefinitionDto"
 6         },
 7         "attribute": {
 8           "id": 21,
 9           "discriminator": "OwnAttributeDefinitionDto"
10         },
11         "conditionType": "AttributeInCollection",
12         "inversion": false,
13         "conditionId": null,
14         "discriminator": "EntryFilter"
15       },

Пример фильтрации от транзитивного атрибута

Справочник "Контрагенты" содержит атрибут "Адрес (дома)", который связан со справочником номеров домов, элементы которого в свою очередь имеют связанный атрибут "Улица", который связан со справочником "Города". Таблицы выглядят следующим образом:

Контрагенты

Идентификатор (id=1) Наименование (id=2) Полное наименование (id=21) Адрес (дома) (id=22)
1 Петров П.П Петров Петр Петрович 3 (id=3)
2 Сидоров С.С. Сидоров Семен Сергеевич 30 (id=12)
3 Иванов И.И. Иванов Илья Игоревич 3а (id=15)

Номера домов

Идентификатор (id=1) Номер дома (id=2) Улица (id=21)
1 1 Ленина (id=1)
2 2 Ленина (id=1)
3 3 Ленина (id=1)
... ... ...
12 30 Баумана (id=4)
... ... ...
15 Мира (id=5)

Улицы

Идентификатор (id=1) Наименование (id=2) Город (id=21)
1 Ленина Москва (id=1)
2 Ленина Москва (id=1)
... ... ...
4 Баумана Пермь (id=2)
5 Мира Соликамск (id=3)

Города

Идентификатор (id=1) Наименование (id=2)
1 Москва
2 Пермь
3 Соликамск

Чтобы отфильтровать справочник городов напрямую от справочника контрагентов, необходимо в справочнике - источнике "Города" указать следующий фильтр, где в свойстве "sourceAttribute" указать транзитивную связь от справочника "Контрагенты" до справочника "Города":

 1 "filter": {
 2         "dictionaryEntrySourceId": 1,
 3         "sourceAttributeId": null,
 4         "sourceAttribute": {
 5           "innerAttribute": {
 6             "innerAttribute": {
 7               "id": 21,
 8               "discriminator": "OwnAttributeDefinitionDto"
 9             },
10             "id": 21,
11             "discriminator": "TransitiveAttributeDefinitionDto"
12           },
13           "id": 22,
14           "discriminator": "TransitiveAttributeDefinitionDto"
15         },
16         "attributeId": null,
17         "attribute": {
18           "id": 1,
19           "discriminator": "OwnAttributeDefinitionDto"
20         },
21         "conditionType": "AttributeInCollection",
22         "inversion": false,
23         "conditionId": null,
24         "discriminator": "EntryFilter"
25       }

А также в самом справочнике контрагентов необходимо указать эту же связь до транзитивного атрибута в свойстве "dictionaryAttributes":

 1   "dictionaryAttributes": [
 2         {
 3           "innerAttribute": {
 4             "innerAttribute": {
 5               "id": 21,
 6               "discriminator": "OwnAttributeDefinitionDto"
 7             },
 8             "id": 21,
 9             "discriminator": "TransitiveAttributeDefinitionDto"
10           },
11           "id": 22,
12           "discriminator": "TransitiveAttributeDefinitionDto"
13         }
14       ]

При появлении хотя бы одного атрибута (собственного или транзитивного) в "dictionaryAttributes" все прочие собственные атрибуты данного справочника загружаться в серверную карточку не будут, для этого необходимо указывать все требуемые атрибуты. Например, при появлении фильтрации, которая описана выше, для отображения в карточке атрибута "Полое наименование" (id = 21) необходимо прописать данный атрибут в "dictionaryAttributes":

 1   "dictionaryAttributes": [
 2         {
 3           "innerAttribute": {
 4             "innerAttribute": {
 5               "id": 21,
 6               "discriminator": "OwnAttributeDefinitionDto"
 7             },
 8             "id": 21,
 9             "discriminator": "TransitiveAttributeDefinitionDto"
10           },
11           "id": 22,
12           "discriminator": "TransitiveAttributeDefinitionDto"
13         },
14         {
15           "id": 21,
16           "discriminator": "OwnAttributeDefinitionDto"
17         }
18       ]
фильтр от транизитивного атрибута.gif

В примере JSON фильтрация от контрагента происходит как для справочника городов, так и для номеров домов и улиц.

JSON серверной карточки