Платформа 3V/Формы/Источники данных/Справочник/Фильтрация/От другого справочника
Фильтр 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 | + | Идентификатор атрибута справочника, от значений которого будут фильтроваться данные, указанного в dictionaryEntrySourceId |
attribute | + | Идентификатор атрибута текущего настраиваемого справочника, с которым связано значение справочника от которого идет фильтрация. Указывается номер Id и тип атрибута в данном случае собственный (OwnAttributeDefinitionDto), так как используются данные текущего справочника. |
discriminator | + | EntryFilter |
conditionType | - | Тип условий |
inversion | + | В значении "false" источник-справочник принимает значения, которые удовлетворяют фильтру, в значении "true" - все значения, которые наоборот не удовлетворяют ему |
conditionId | - | Условия, при которых применяется фильтр |
Особенности использования
Важно, если фильтрация происходит по связанному атрибуту с типом "Элемент справочника", фильтрация, т.е. связь sourceAttribute и attribute будет происходить по атрибуту "Идентификатор", а не по атрибуту "Наименование"!
При использовании в фильтрации источника - справочника транзитивного атрибута другого источника - справочника необходимо обязательно указать в источнике, от которого происходит фильтрация, в блоке "dictionaryAttributes" все атрибуты (транзитивные и собственные), которые используются. Пример см.ниже "Пример фильтрации от транзитивного атрибута"
Пример фильтрации от собственного атрибута справочника
Справочник "Контрагенты" содержит связный атрибут "Виды контрагентов". Можно создать форму у в которой, при выборе из выпадающего списка "Вида контрагентов", элементы следующего выпадающего списка "Контрагенты" будут только выбранного вида.
Два поля - Выпадающих списка: Вид контрагента и Контрагенты с источниками-справочниками (Справочник видов контрагентов (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 | 3а | Мира (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 ]
В примере JSON фильтрация от контрагента происходит как для справочника городов, так и для номеров домов и улиц.