Платформа 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 | Атрибут справочника, от значений которого будут фильтроваться данные |
attribute | Атрибут текущего источника, с которым связано значение справочника от которого идет фильтрация. Указывается номер Id и тип атрибута в данном случае собственный (OwnAttributeDefinitionDto), так как используются данные текущего справочника. |
discriminator | EntryFilter |
conditionType | Тип условий |
inversion | В значении "false" источник-справочник принимает значения, которые удовлетворяют фильтру, в значении "true" - все значения, которые наоборот не удовлетворяют ему |
conditionId | Условия, при которых применяется фильтр |
Особенности использования
При использовании в фильтрации источника - справочника транзитивного атрибута другого источника - справочника необходимо обязательно указать в источнике, от которого происходит фильтрация, в блоке "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 "uiDataSource": {
28 "attribute": {
29 "id": 21,
30 "discriminator": "OwnAttributeDefinitionDto"
31 },
32 "attributeId": null,
33 "sourceId": 1,
34 "discriminator": "UiDataSourceDictionary"
35 },
36 "doActionOnChangeValue": true,
37 "onAfterChangeValueConditionalActions": null,
38 "onAfterChangeValueByClientConditionalActions": null,
39 "rebuildDependentsObjectOnChange": true,
40 "enableRuleIds": [],
41 "visibleRuleIds": [],
42 "access": null,
43 "isValueChanged": true,
44 "expressionId": null,
45 "discriminator": "DictionarySourceEntry"
46 },
47 {
48 "dataSourceId": 3,
49 "nameTemplate": "",
50 "displayAttribute": null,
51 "hasMultipleValue": false,
52 "hasNullableValue": false,
53 "maxElements": null,
54 "hasServerFiltration": false,
55 "searchSettings": {
56 "maxElements": null,
57 "minInputChars": 2,
58 "searchMode": "Client",
59 "debounceMs": 300
60 },
61 "id": 2,
62 "caption": "Контрагенты",
63 "enable": true,
64 "visible": true,
65 "hint": null,
66 "uiDataSource": {
67 "attribute": {
68 "id": 2,
69 "discriminator": "OwnAttributeDefinitionDto"
70 },
71 "attributeId": null,
72 "sourceId": 1,
73 "discriminator": "UiDataSourceDictionary"
74 },
75 "doActionOnChangeValue": false,
76 "onAfterChangeValueConditionalActions": null,
77 "onAfterChangeValueByClientConditionalActions": null,
78 "rebuildDependentsObjectOnChange": true,
79 "enableRuleIds": [],
80 "visibleRuleIds": [],
81 "access": null,
82 "isValueChanged": false,
83 "expressionId": null,
84 "discriminator": "DictionarySourceEntry"
85 }
86 ],
87 "entryDataSources": [
88 {
89 "dictionaryId": 10736,
90 "hierarchyId": null,
91 "filter": null,
92 "sortingOptions": null,
93 "groupingOptions": null,
94 "dictionaryAttributes": null,
95 "defaultValue": [],
96 "defaultValueExpressionId": null,
97 "parameterId": null,
98 "dictionarySourceSelectionMode": "None",
99 "dataSourceAttributesAdditionsSettings": [],
100 "externalFileStorageUrl": null,
101 "filePrefix": null,
102 "defaultNewElementSettings": null,
103 "id": 1,
104 "name": "Справочник",
105 "isReadOnly": false,
106 "dataEditRuleIds": [],
107 "beforeSaveDataActions": [],
108 "afterSaveDataActions": [],
109 "discriminator": "DictionaryDataSource"
110 },
111 {
112 "dictionaryId": 10754,
113 "hierarchyId": null,
114 "filter": null,
115 "sortingOptions": null,
116 "groupingOptions": null,
117 "dictionaryAttributes": null,
118 "defaultValue": [],
119 "defaultValueExpressionId": null,
120 "parameterId": null,
121 "dictionarySourceSelectionMode": "None",
122 "dataSourceAttributesAdditionsSettings": [],
123 "externalFileStorageUrl": null,
124 "filePrefix": null,
125 "defaultNewElementSettings": null,
126 "id": 2,
127 "name": "Вид контрагента",
128 "isReadOnly": true,
129 "dataEditRuleIds": [],
130 "beforeSaveDataActions": [],
131 "afterSaveDataActions": [],
132 "discriminator": "DictionaryDataSource"
133 },
134 {
135 "dictionaryId": 10755,
136 "hierarchyId": null,
137 "filter": {
138 "dictionaryEntrySourceId": 2,
139 "sourceAttribute": {
140 "id": 1,
141 "discriminator": "OwnAttributeDefinitionDto"
142 },
143 "attribute": {
144 "id": 21,
145 "discriminator": "OwnAttributeDefinitionDto"
146 },
147 "conditionType": "AttributeInCollection",
148 "inversion": false,
149 "conditionId": null,
150 "discriminator": "EntryFilter"
151 },
152 "sortingOptions": null,
153 "groupingOptions": null,
154 "dictionaryAttributes": [],
155 "defaultValue": [],
156 "defaultValueExpressionId": null,
157 "parameterId": null,
158 "dictionarySourceSelectionMode": "None",
159 "dataSourceAttributesAdditionsSettings": [],
160 "externalFileStorageUrl": null,
161 "filePrefix": null,
162 "defaultNewElementSettings": null,
163 "id": 3,
164 "name": "Контрагенты",
165 "isReadOnly": true,
166 "dataEditRuleIds": [],
167 "beforeSaveDataActions": [],
168 "afterSaveDataActions": [],
169 "discriminator": "DictionaryDataSource"
170 }
171 ],
172 "parameters": [],
173 "binaryConditionsRules": [],
174 "submitValidateRules": [],
175 "expressions": [],
176 "controlsValueCalculateRules": [],
177 "actions": [],
178 "conditionActionIdsOnOpen": [],
179 "conditionalActions": [],
180 "selectionSets": [],
181 "reportTemplates": [],
182 "useNewDependenciesBuilder": null
183 }
Два контрола (uiSources): Вид контрагента (id=1) и Контрагенты (id=2). Три источника (entryDataSources): Справочник, куда данные будут записываться (id=1), справочник видов контроля (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 }