Платформа 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" все атрибуты (транзитивные и собственные), которые используются. Пример см.ниже "Пример фильтрации от транзитивного атрибута"
Пример фильтрации от собственного атрибута справочника
Справочник "Контрагенты" содержит связный атрибут "Виды контрагентов". Можно создать форму у в которой, при выборе из выпадающего списка "Вида контрагентов", элементы следующего выпадающего списка "Контрагенты" будут только выбранного вида.
1 {
2 "id": 10735,
3 "name": "Пример фильтра от справочника (EntryFilter)",
4 "description": null,
5 "title": "Пример фильтрации_справочник от справочника",
6 "entrySettings": null,
7 "uiSources": [
8 {
9 "dataSourceId": 2,
10 "nameTemplate": "",
11 "displayAttribute": null,
12 "hasMultipleValue": false,
13 "hasNullableValue": false,
14 "maxElements": null,
15 "hasServerFiltration": false,
16 "searchSettings": {
17 "maxElements": null,
18 "minInputChars": 2,
19 "searchMode": "Client",
20 "debounceMs": 300
21 },
22 "id": 1,
23 "caption": "Вид контрагента",
24 "enable": true,
25 "visible": true,
26 "hint": null,
27 "doActionOnChangeValue": true,
28 "onAfterChangeValueConditionalActions": null,
29 "onAfterChangeValueByClientConditionalActions": null,
30 "rebuildDependentsObjectOnChange": true,
31 "enableRuleIds": [],
32 "visibleRuleIds": [],
33 "access": null,
34 "isValueChanged": true,
35 "expressionId": null,
36 "discriminator": "DictionarySourceEntry"
37 },
38 {
39 "dataSourceId": 3,
40 "nameTemplate": "",
41 "displayAttribute": null,
42 "hasMultipleValue": false,
43 "hasNullableValue": false,
44 "maxElements": null,
45 "hasServerFiltration": false,
46 "searchSettings": {
47 "maxElements": null,
48 "minInputChars": 2,
49 "searchMode": "Client",
50 "debounceMs": 300
51 },
52 "id": 2,
53 "caption": "Контрагенты",
54 "enable": true,
55 "visible": true,
56 "hint": null,
57 "doActionOnChangeValue": false,
58 "onAfterChangeValueConditionalActions": null,
59 "onAfterChangeValueByClientConditionalActions": null,
60 "rebuildDependentsObjectOnChange": true,
61 "enableRuleIds": [],
62 "visibleRuleIds": [],
63 "access": null,
64 "isValueChanged": false,
65 "expressionId": null,
66 "discriminator": "DictionarySourceEntry"
67 }
68 ],
69 "entryDataSources": [
70 {
71 "dictionaryId": 10754,
72 "hierarchyId": null,
73 "filter": null,
74 "sortingOptions": null,
75 "groupingOptions": null,
76 "dictionaryAttributes": null,
77 "defaultValue": [],
78 "defaultValueExpressionId": null,
79 "parameterId": null,
80 "dictionarySourceSelectionMode": "None",
81 "dataSourceAttributesAdditionsSettings": [],
82 "externalFileStorageUrl": null,
83 "filePrefix": null,
84 "defaultNewElementSettings": null,
85 "id": 2,
86 "name": "Вид контрагента",
87 "isReadOnly": true,
88 "dataEditRuleIds": [],
89 "beforeSaveDataActions": [],
90 "afterSaveDataActions": [],
91 "discriminator": "DictionaryDataSource"
92 },
93 {
94 "dictionaryId": 10755,
95 "hierarchyId": null,
96 "filter": {
97 "dictionaryEntrySourceId": 2,
98 "sourceAttribute": {
99 "id": 1,
100 "discriminator": "OwnAttributeDefinitionDto"
101 },
102 "attribute": {
103 "id": 21,
104 "discriminator": "OwnAttributeDefinitionDto"
105 },
106 "conditionType": "AttributeInCollection",
107 "inversion": false,
108 "conditionId": null,
109 "discriminator": "EntryFilter"
110 },
111 "sortingOptions": null,
112 "groupingOptions": null,
113 "dictionaryAttributes": [],
114 "defaultValue": [],
115 "defaultValueExpressionId": null,
116 "parameterId": null,
117 "dictionarySourceSelectionMode": "None",
118 "dataSourceAttributesAdditionsSettings": [],
119 "externalFileStorageUrl": null,
120 "filePrefix": null,
121 "defaultNewElementSettings": null,
122 "id": 3,
123 "name": "Контрагенты",
124 "isReadOnly": true,
125 "dataEditRuleIds": [],
126 "beforeSaveDataActions": [],
127 "afterSaveDataActions": [],
128 "discriminator": "DictionaryDataSource"
129 }
130 ],
131 "parameters": [],
132 "binaryConditionsRules": [],
133 "submitValidateRules": [],
134 "expressions": [],
135 "controlsValueCalculateRules": [],
136 "actions": [],
137 "conditionActionIdsOnOpen": [],
138 "conditionalActions": [],
139 "selectionSets": [],
140 "reportTemplates": [],
141 "useNewDependenciesBuilder": null
142 }
Два поля - Выпадающих списка: Вид контрагента и Контрагенты с источниками-справочниками (Справочник видов контрагентов (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 фильтрация от контрагента происходит как для справочника городов, так и для номеров домов и улиц.
1 {
2 "id": 176,
3 "name": "Пример фильтра от транзитивного атрибута справочника (EntryFilter)",
4 "description": null,
5 "title": "Пример фильтра от транзитивного атрибута справочника (EntryFilter)",
6 "entrySettings": null,
7 "uiSources": [
8 {
9 "dataSourceId": 1,
10 "nameTemplate": "",
11 "displayAttribute": null,
12 "hasMultipleValue": false,
13 "hasNullableValue": false,
14 "maxElements": null,
15 "hasServerFiltration": false,
16 "id": 1,
17 "caption": "Контрагенты",
18 "enable": true,
19 "visible": true,
20 "hint": null,
21 "doActionOnChangeValue": true,
22 "onAfterChangeValueConditionalActions": null,
23 "onAfterChangeValueByClientConditionalActions": null,
24 "rebuildDependentsObjectOnChange": true,
25 "enableRuleIds": [],
26 "visibleRuleIds": [],
27 "access": null,
28 "isValueChanged": true,
29 "expressionId": null,
30 "discriminator": "DictionarySourceEntry"
31 },
32 {
33 "dataSourceId": 2,
34 "nameTemplate": "",
35 "displayAttribute": null,
36 "hasMultipleValue": false,
37 "hasNullableValue": false,
38 "maxElements": null,
39 "hasServerFiltration": false,
40 "id": 2,
41 "caption": "Номера домов",
42 "enable": true,
43 "visible": true,
44 "hint": null,
45 "doActionOnChangeValue": true,
46 "onAfterChangeValueConditionalActions": null,
47 "onAfterChangeValueByClientConditionalActions": null,
48 "rebuildDependentsObjectOnChange": true,
49 "enableRuleIds": [],
50 "visibleRuleIds": [],
51 "access": null,
52 "isValueChanged": true,
53 "expressionId": null,
54 "discriminator": "DictionarySourceEntry"
55 },
56 {
57 "dataSourceId": 3,
58 "nameTemplate": "",
59 "displayAttribute": null,
60 "hasMultipleValue": false,
61 "hasNullableValue": false,
62 "maxElements": null,
63 "hasServerFiltration": false,
64 "id": 3,
65 "caption": "Улица",
66 "enable": true,
67 "visible": true,
68 "hint": null,
69 "doActionOnChangeValue": true,
70 "onAfterChangeValueConditionalActions": null,
71 "onAfterChangeValueByClientConditionalActions": null,
72 "rebuildDependentsObjectOnChange": true,
73 "enableRuleIds": [],
74 "visibleRuleIds": [],
75 "access": null,
76 "isValueChanged": true,
77 "expressionId": null,
78 "discriminator": "DictionarySourceEntry"
79 },
80 {
81 "dataSourceId": 4,
82 "nameTemplate": "",
83 "displayAttribute": null,
84 "hasMultipleValue": false,
85 "hasNullableValue": false,
86 "maxElements": null,
87 "hasServerFiltration": false,
88 "id": 4,
89 "caption": "Город",
90 "enable": true,
91 "visible": true,
92 "hint": null,
93 "doActionOnChangeValue": true,
94 "onAfterChangeValueConditionalActions": null,
95 "onAfterChangeValueByClientConditionalActions": null,
96 "rebuildDependentsObjectOnChange": true,
97 "enableRuleIds": [],
98 "visibleRuleIds": [],
99 "access": null,
100 "isValueChanged": true,
101 "expressionId": null,
102 "discriminator": "DictionarySourceEntry"
103 },
104 {
105 "nameTemplate": "",
106 "displayAttribute": null,
107 "hasMultipleValue": false,
108 "hasNullableValue": false,
109 "maxElements": null,
110 "hasServerFiltration": false,
111 "id": 121,
112 "uiDataSource": {
113 "attribute": {
114 "id": 21,
115 "discriminator": "OwnAttributeDefinitionDto"
116 },
117 "attributeId": null,
118 "sourceId": 1,
119 "discriminator": "UiDataSourceDictionary"
120 },
121 "caption": "Полное наименование.Контрагенты",
122 "enable": true,
123 "visible": true,
124 "hint": null,
125 "doActionOnChangeValue": true,
126 "onAfterChangeValueConditionalActions": null,
127 "onAfterChangeValueByClientConditionalActions": null,
128 "rebuildDependentsObjectOnChange": true,
129 "enableRuleIds": [],
130 "visibleRuleIds": [],
131 "access": null,
132 "isValueChanged": true,
133 "expressionId": null,
134 "discriminator": "StringSourceEntry"
135 }
136 ],
137 "entryDataSources": [
138 {
139 "dictionaryId": 174,
140 "hierarchyId": null,
141 "filter": null,
142 "sortingOptions": null,
143 "groupingOptions": null,
144 "dictionaryAttributes": [
145 {
146 "innerAttribute": {
147 "innerAttribute": {
148 "id": 21,
149 "discriminator": "OwnAttributeDefinitionDto"
150 },
151 "id": 21,
152 "discriminator": "TransitiveAttributeDefinitionDto"
153 },
154 "id": 22,
155 "discriminator": "TransitiveAttributeDefinitionDto"
156 },
157 {
158 "innerAttribute": {
159 "id": 21,
160 "discriminator": "OwnAttributeDefinitionDto"
161 },
162 "id": 22,
163 "discriminator": "TransitiveAttributeDefinitionDto"
164 },
165 {
166 "id": 22,
167 "discriminator": "OwnAttributeDefinitionDto"
168 },
169 {
170 "id": 21,
171 "discriminator": "OwnAttributeDefinitionDto"
172 }
173 ],
174 "defaultValue": [],
175 "defaultValueExpressionId": null,
176 "parameterId": null,
177 "dictionarySourceSelectionMode": "None",
178 "dataSourceAttributesAdditionsSettings": [],
179 "externalFileStorageUrl": null,
180 "filePrefix": null,
181 "defaultNewElementSettings": null,
182 "id": 1,
183 "name": "Контрагенты",
184 "isReadOnly": false,
185 "dataEditRuleIds": [],
186 "beforeSaveDataActions": [],
187 "afterSaveDataActions": [],
188 "discriminator": "DictionaryDataSource"
189 },
190 {
191 "dictionaryId": 173,
192 "hierarchyId": null,
193 "filter": {
194 "dictionaryEntrySourceId": 1,
195 "sourceAttributeId": null,
196 "sourceAttribute": {
197 "id": 22,
198 "discriminator": "OwnAttributeDefinitionDto"
199 },
200 "attributeId": null,
201 "attribute": {
202 "id": 1,
203 "discriminator": "OwnAttributeDefinitionDto"
204 },
205 "conditionType": "AttributeInCollection",
206 "inversion": false,
207 "conditionId": null,
208 "discriminator": "EntryFilter"
209 },
210 "sortingOptions": null,
211 "groupingOptions": null,
212 "dictionaryAttributes": null,
213 "defaultValue": [],
214 "defaultValueExpressionId": null,
215 "parameterId": null,
216 "dictionarySourceSelectionMode": "SelectFirst",
217 "dataSourceAttributesAdditionsSettings": [],
218 "externalFileStorageUrl": null,
219 "filePrefix": null,
220 "defaultNewElementSettings": null,
221 "id": 2,
222 "name": "Номер дома",
223 "isReadOnly": true,
224 "dataEditRuleIds": [],
225 "beforeSaveDataActions": [],
226 "afterSaveDataActions": [],
227 "discriminator": "DictionaryDataSource"
228 },
229 {
230 "dictionaryId": 172,
231 "hierarchyId": null,
232 "filter": {
233 "dictionaryEntrySourceId": 1,
234 "sourceAttributeId": null,
235 "sourceAttribute": {
236 "innerAttribute": {
237 "id": 21,
238 "discriminator": "OwnAttributeDefinitionDto"
239 },
240 "id": 22,
241 "discriminator": "TransitiveAttributeDefinitionDto"
242 },
243 "attributeId": null,
244 "attribute": {
245 "id": 1,
246 "discriminator": "OwnAttributeDefinitionDto"
247 },
248 "conditionType": "AttributeInCollection",
249 "inversion": false,
250 "conditionId": null,
251 "discriminator": "EntryFilter"
252 },
253 "sortingOptions": null,
254 "groupingOptions": null,
255 "dictionaryAttributes": [],
256 "defaultValue": [],
257 "defaultValueExpressionId": null,
258 "parameterId": null,
259 "dictionarySourceSelectionMode": "SelectFirst",
260 "dataSourceAttributesAdditionsSettings": [],
261 "externalFileStorageUrl": null,
262 "filePrefix": null,
263 "defaultNewElementSettings": null,
264 "id": 3,
265 "name": "Улицы",
266 "isReadOnly": true,
267 "dataEditRuleIds": [],
268 "beforeSaveDataActions": [],
269 "afterSaveDataActions": [],
270 "discriminator": "DictionaryDataSource"
271 },
272 {
273 "dictionaryId": 170,
274 "hierarchyId": null,
275 "filter": {
276 "dictionaryEntrySourceId": 1,
277 "sourceAttributeId": null,
278 "sourceAttribute": {
279 "innerAttribute": {
280 "innerAttribute": {
281 "id": 21,
282 "discriminator": "OwnAttributeDefinitionDto"
283 },
284 "id": 21,
285 "discriminator": "TransitiveAttributeDefinitionDto"
286 },
287 "id": 22,
288 "discriminator": "TransitiveAttributeDefinitionDto"
289 },
290 "attributeId": null,
291 "attribute": {
292 "id": 1,
293 "discriminator": "OwnAttributeDefinitionDto"
294 },
295 "conditionType": "AttributeInCollection",
296 "inversion": false,
297 "conditionId": null,
298 "discriminator": "EntryFilter"
299 },
300 "sortingOptions": null,
301 "groupingOptions": null,
302 "dictionaryAttributes": [],
303 "defaultValue": [],
304 "defaultValueExpressionId": null,
305 "parameterId": null,
306 "dictionarySourceSelectionMode": "SelectFirst",
307 "dataSourceAttributesAdditionsSettings": [],
308 "externalFileStorageUrl": null,
309 "filePrefix": null,
310 "defaultNewElementSettings": null,
311 "id": 4,
312 "name": "Города",
313 "isReadOnly": true,
314 "dataEditRuleIds": [],
315 "beforeSaveDataActions": [],
316 "afterSaveDataActions": [],
317 "discriminator": "DictionaryDataSource"
318 }
319 ],
320 "parameters": [],
321 "binaryConditionsRules": [],
322 "submitValidateRules": [],
323 "expressions": [],
324 "controlsValueCalculateRules": [],
325 "actions": [],
326 "conditionActionIdsOnOpen": [],
327 "conditionalActions": [],
328 "selectionSets": [],
329 "reportTemplates": [],
330 "useNewDependenciesBuilder": null
331 }