Платформа 3V/Формы/Источники данных/Справочник/Фильтрация/От другого справочника: различия между версиями
(не показано 28 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
− | + | Фильтр EntryFilter позволяет выбрать данные в справочнике относительно другого связного справочника. Элементы одного справочника будут отображаться в зависимости от выбранных элементов другого справочника. Элемент "filter" добавляется в источник, который необходимо отфильтровать. | |
− | |||
− | Фильтр | ||
Фильтр имеет следующую структуру: | Фильтр имеет следующую структуру: | ||
<syntaxhighlight lang="JSON" line> | <syntaxhighlight lang="JSON" line> | ||
Строка 17: | Строка 15: | ||
"inversion": false, | "inversion": false, | ||
"conditionId": null, | "conditionId": null, | ||
− | "discriminator": " | + | "discriminator": "EntryFilter" |
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 23: | Строка 21: | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
− | ! Свойство !! Описание | + | ! Свойство !! Обязательность !!Описание |
|- | |- | ||
− | | dictionaryEntrySourceId || Id источника | + | | dictionaryEntrySourceId || + ||Id источника данных на форме с типом "Справочник", от значений которого будут фильтроваться данные |
|- | |- | ||
− | | sourceAttribute|| | + | | sourceAttribute|| + || [[Платформа_3V/Справочник/Связи_атрибутов_справочников|''' Идентификатор атрибута''']] справочника, от значений которого будут фильтроваться данные, указанного в dictionaryEntrySourceId |
|- | |- | ||
− | | attribute|| [[Платформа_3V/Справочник/Связи_атрибутов_справочников|''' | + | | attribute|| + || [[Платформа_3V/Справочник/Связи_атрибутов_справочников|''' Идентификатор атрибута''']] текущего настраиваемого справочника, с которым связано значение справочника от которого идет фильтрация. Указывается номер Id и тип атрибута в данном случае собственный (OwnAttributeDefinitionDto), так как используются данные текущего справочника. |
|- | |- | ||
− | | discriminator|| | + | | discriminator|| + || EntryFilter |
|- | |- | ||
− | | conditionType || Тип условий | + | | conditionType || - ||[[Платформа_3V/Формы/Источники_данных/Справочник/Фильтрация#Типы%20условий%20фильтрации%20(conditionType)| '''Тип условий''']] |
|- | |- | ||
− | | inversion || В значении "false" | + | | inversion || + || В значении "false" источник-справочник принимает значения, которые удовлетворяют фильтру, в значении "true" - все значения, которые наоборот не удовлетворяют ему |
|- | |- | ||
− | | conditionId || | + | | conditionId || - || [[Платформа_3V/Формы/Правила| '''Условия''']], при которых применяется фильтр |
+ | |} | ||
+ | |||
+ | == Особенности использования == | ||
+ | Важно, если фильтрация происходит по связанному атрибуту с типом "Элемент справочника", фильтрация, т.е. связь sourceAttribute и attribute будет происходить по атрибуту "Идентификатор", а не по атрибуту "Наименование"! | ||
+ | |||
+ | При использовании в фильтрации источника - справочника транзитивного атрибута другого источника - справочника необходимо обязательно указать в источнике, от которого происходит фильтрация, в блоке "dictionaryAttributes" [[Платформа_3V/Справочник/Связи_атрибутов_справочников|'''все атрибуты (транзитивные и собственные)''']], которые используются. Пример см.ниже "Пример фильтрации от транзитивного атрибута" | ||
+ | |||
+ | == Пример фильтрации от собственного атрибута справочника== | ||
+ | Справочник "Контрагенты" содержит связный атрибут "Виды контрагентов". Можно создать форму у в которой, при выборе из выпадающего списка "Вида контрагентов", элементы следующего выпадающего списка "Контрагенты" будут только выбранного вида. | ||
+ | [[Файл:Screenshot 2021-04-15 at 10.34.19.png|400px|безрамки|без]] | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="width:800px; overflow:auto;"> | ||
+ | <div style="font-weight:bold;line-height:1.6;">JSON серверной карточки</div> | ||
+ | <div class="mw-collapsible-content mw-collapsed-content"> | ||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | { | ||
+ | "id": 10735, | ||
+ | "name": "Пример фильтра от справочника (EntryFilter)", | ||
+ | "description": null, | ||
+ | "title": "Пример фильтрации_справочник от справочника", | ||
+ | "entrySettings": null, | ||
+ | "uiSources": [ | ||
+ | { | ||
+ | "dataSourceId": 2, | ||
+ | "nameTemplate": "", | ||
+ | "displayAttribute": null, | ||
+ | "hasMultipleValue": false, | ||
+ | "hasNullableValue": false, | ||
+ | "maxElements": null, | ||
+ | "hasServerFiltration": false, | ||
+ | "searchSettings": { | ||
+ | "maxElements": null, | ||
+ | "minInputChars": 2, | ||
+ | "searchMode": "Client", | ||
+ | "debounceMs": 300 | ||
+ | }, | ||
+ | "id": 1, | ||
+ | "caption": "Вид контрагента", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "hint": null, | ||
+ | "doActionOnChangeValue": true, | ||
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "rebuildDependentsObjectOnChange": true, | ||
+ | "enableRuleIds": [], | ||
+ | "visibleRuleIds": [], | ||
+ | "access": null, | ||
+ | "isValueChanged": true, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "DictionarySourceEntry" | ||
+ | }, | ||
+ | { | ||
+ | "dataSourceId": 3, | ||
+ | "nameTemplate": "", | ||
+ | "displayAttribute": null, | ||
+ | "hasMultipleValue": false, | ||
+ | "hasNullableValue": false, | ||
+ | "maxElements": null, | ||
+ | "hasServerFiltration": false, | ||
+ | "searchSettings": { | ||
+ | "maxElements": null, | ||
+ | "minInputChars": 2, | ||
+ | "searchMode": "Client", | ||
+ | "debounceMs": 300 | ||
+ | }, | ||
+ | "id": 2, | ||
+ | "caption": "Контрагенты", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "hint": null, | ||
+ | "doActionOnChangeValue": false, | ||
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "rebuildDependentsObjectOnChange": true, | ||
+ | "enableRuleIds": [], | ||
+ | "visibleRuleIds": [], | ||
+ | "access": null, | ||
+ | "isValueChanged": false, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "DictionarySourceEntry" | ||
+ | } | ||
+ | ], | ||
+ | "entryDataSources": [ | ||
+ | { | ||
+ | "dictionaryId": 10754, | ||
+ | "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": 2, | ||
+ | "name": "Вид контрагента", | ||
+ | "isReadOnly": true, | ||
+ | "dataEditRuleIds": [], | ||
+ | "beforeSaveDataActions": [], | ||
+ | "afterSaveDataActions": [], | ||
+ | "discriminator": "DictionaryDataSource" | ||
+ | }, | ||
+ | { | ||
+ | "dictionaryId": 10755, | ||
+ | "hierarchyId": null, | ||
+ | "filter": { | ||
+ | "dictionaryEntrySourceId": 2, | ||
+ | "sourceAttribute": { | ||
+ | "id": 1, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "attribute": { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "conditionType": "AttributeInCollection", | ||
+ | "inversion": false, | ||
+ | "conditionId": null, | ||
+ | "discriminator": "EntryFilter" | ||
+ | }, | ||
+ | "sortingOptions": null, | ||
+ | "groupingOptions": null, | ||
+ | "dictionaryAttributes": [], | ||
+ | "defaultValue": [], | ||
+ | "defaultValueExpressionId": null, | ||
+ | "parameterId": null, | ||
+ | "dictionarySourceSelectionMode": "None", | ||
+ | "dataSourceAttributesAdditionsSettings": [], | ||
+ | "externalFileStorageUrl": null, | ||
+ | "filePrefix": null, | ||
+ | "defaultNewElementSettings": null, | ||
+ | "id": 3, | ||
+ | "name": "Контрагенты", | ||
+ | "isReadOnly": true, | ||
+ | "dataEditRuleIds": [], | ||
+ | "beforeSaveDataActions": [], | ||
+ | "afterSaveDataActions": [], | ||
+ | "discriminator": "DictionaryDataSource" | ||
+ | } | ||
+ | ], | ||
+ | "parameters": [], | ||
+ | "binaryConditionsRules": [], | ||
+ | "submitValidateRules": [], | ||
+ | "expressions": [], | ||
+ | "controlsValueCalculateRules": [], | ||
+ | "actions": [], | ||
+ | "conditionActionIdsOnOpen": [], | ||
+ | "conditionalActions": [], | ||
+ | "selectionSets": [], | ||
+ | "reportTemplates": [], | ||
+ | "useNewDependenciesBuilder": null | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div></div> | ||
+ | Два поля - Выпадающих списка: Вид контрагента и Контрагенты с источниками-справочниками (Справочник видов контрагентов (id=2, "dictionaryId": 10754,) и справочник Контрагентов (id=3, "dictionaryId": 10755)) | ||
+ | |||
+ | В источник "Контрагенты" добавлен фильтр, в котором указан "dictionaryEntrySourceId": 2 - справочник видов контроля от значений которого идет фильтрация, далее указан номер атрибута справочника Контрагенты (id=1), в данном случае мы сравниваем по первому атрибуту - идентификатору. Далее обозначен атрибут текущего источника, справочника "Контрагенты", с которым мы сравниваем и в котором указан вид (id=21). | ||
+ | |||
+ | Таким образом при выборе элемента в поле "Вид контрагента" будет происходить фильтрация в поле "Контрагенты " | ||
+ | |||
+ | Важно! Если необходимо, чтобы фильтрация происходила сразу после выбора "Вида контрагента", необходимо поставить флаг "Выполнить действие при изменении значения", в ином случае будет необходимо [[Платформа_3V/Формы/Действия/обновить источник| '''Условия''']] | ||
+ | |||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | "filter": { | ||
+ | "dictionaryEntrySourceId": 2, | ||
+ | "sourceAttribute": { | ||
+ | "id": 1, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "attribute": { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "conditionType": "AttributeInCollection", | ||
+ | "inversion": false, | ||
+ | "conditionId": null, | ||
+ | "discriminator": "EntryFilter" | ||
+ | }, | ||
+ | </syntaxhighlight> | ||
+ | == Пример фильтрации от транзитивного атрибута == | ||
+ | Справочник "Контрагенты" содержит атрибут "Адрес (дома)", который связан со справочником номеров домов, элементы которого в свою очередь имеют связанный атрибут "Улица", который связан со справочником "Города". Таблицы выглядят следующим образом: | ||
+ | |||
+ | '''Контрагенты''' | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Идентификатор (id=1) !! Наименование (id=2) !! Полное наименование (id=21) !! Адрес (дома) (id=22) | ||
+ | |- | ||
+ | | 1 || Петров П.П || Петров Петр Петрович || 3 (id=3) | ||
+ | |- | ||
+ | | 2 || Сидоров С.С. || Сидоров Семен Сергеевич || 30 (id=12) | ||
+ | |- | ||
+ | | 3 || Иванов И.И. || Иванов Илья Игоревич || 3а (id=15) | ||
+ | |} | ||
+ | |||
+ | '''Номера домов''' | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Идентификатор (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) | ||
|} | |} | ||
+ | '''Улицы''' | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Идентификатор (id=1) !! Наименование (id=2) !! Город (id=21) | ||
+ | |- | ||
+ | | 1 || Ленина || Москва (id=1) | ||
+ | |- | ||
+ | | 2 || Ленина || Москва (id=1) | ||
+ | |- | ||
+ | | ... || ... || ... | ||
+ | |- | ||
+ | | 4 || Баумана || Пермь (id=2) | ||
+ | |- | ||
+ | | 5 || Мира || Соликамск (id=3) | ||
+ | |} | ||
− | + | '''Города''' | |
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Идентификатор (id=1) !! Наименование (id=2) | ||
+ | |- | ||
+ | | 1 || Москва | ||
+ | |- | ||
+ | | 2 || Пермь | ||
+ | |- | ||
+ | | 3 || Соликамск | ||
+ | |} | ||
+ | |||
+ | Чтобы отфильтровать справочник городов напрямую от справочника контрагентов, необходимо в справочнике - источнике "Города" указать следующий фильтр, где в свойстве '''"sourceAttribute"''' указать транзитивную связь от справочника "Контрагенты" до справочника "Города": | ||
+ | |||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | "filter": { | ||
+ | "dictionaryEntrySourceId": 1, | ||
+ | "sourceAttributeId": null, | ||
+ | "sourceAttribute": { | ||
+ | "innerAttribute": { | ||
+ | "innerAttribute": { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 21, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 22, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | }, | ||
+ | "attributeId": null, | ||
+ | "attribute": { | ||
+ | "id": 1, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "conditionType": "AttributeInCollection", | ||
+ | "inversion": false, | ||
+ | "conditionId": null, | ||
+ | "discriminator": "EntryFilter" | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | А также в самом справочнике контрагентов необходимо указать эту же связь до транзитивного атрибута в свойстве '''"dictionaryAttributes"''': | ||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | "dictionaryAttributes": [ | ||
+ | { | ||
+ | "innerAttribute": { | ||
+ | "innerAttribute": { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 21, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 22, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | } | ||
+ | ] | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | При появлении хотя бы одного атрибута (собственного или транзитивного) в '''"dictionaryAttributes"''' все прочие собственные атрибуты данного справочника загружаться в серверную карточку не будут, для этого необходимо указывать все требуемые атрибуты. Например, при появлении фильтрации, которая описана выше, для отображения в карточке атрибута "Полое наименование" (id = 21) необходимо прописать данный атрибут в '''"dictionaryAttributes"''': | ||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | "dictionaryAttributes": [ | ||
+ | { | ||
+ | "innerAttribute": { | ||
+ | "innerAttribute": { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 21, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 22, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | }, | ||
+ | { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | } | ||
+ | ] | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | [[Файл:фильтр от транизитивного атрибута.gif|400px|безрамки|без]] | ||
+ | |||
+ | В примере JSON фильтрация от контрагента происходит как для справочника городов, так и для номеров домов и улиц. | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="width:800px; overflow:auto;"> | ||
+ | <div style="font-weight:bold;line-height:1.6;">JSON серверной карточки</div> | ||
+ | <div class="mw-collapsible-content mw-collapsed-content"> | ||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | { | ||
+ | "id": 176, | ||
+ | "name": "Пример фильтра от транзитивного атрибута справочника (EntryFilter)", | ||
+ | "description": null, | ||
+ | "title": "Пример фильтра от транзитивного атрибута справочника (EntryFilter)", | ||
+ | "entrySettings": null, | ||
+ | "uiSources": [ | ||
+ | { | ||
+ | "dataSourceId": 1, | ||
+ | "nameTemplate": "", | ||
+ | "displayAttribute": null, | ||
+ | "hasMultipleValue": false, | ||
+ | "hasNullableValue": false, | ||
+ | "maxElements": null, | ||
+ | "hasServerFiltration": false, | ||
+ | "id": 1, | ||
+ | "caption": "Контрагенты", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "hint": null, | ||
+ | "doActionOnChangeValue": true, | ||
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "rebuildDependentsObjectOnChange": true, | ||
+ | "enableRuleIds": [], | ||
+ | "visibleRuleIds": [], | ||
+ | "access": null, | ||
+ | "isValueChanged": true, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "DictionarySourceEntry" | ||
+ | }, | ||
+ | { | ||
+ | "dataSourceId": 2, | ||
+ | "nameTemplate": "", | ||
+ | "displayAttribute": null, | ||
+ | "hasMultipleValue": false, | ||
+ | "hasNullableValue": false, | ||
+ | "maxElements": null, | ||
+ | "hasServerFiltration": false, | ||
+ | "id": 2, | ||
+ | "caption": "Номера домов", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "hint": null, | ||
+ | "doActionOnChangeValue": true, | ||
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "rebuildDependentsObjectOnChange": true, | ||
+ | "enableRuleIds": [], | ||
+ | "visibleRuleIds": [], | ||
+ | "access": null, | ||
+ | "isValueChanged": true, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "DictionarySourceEntry" | ||
+ | }, | ||
+ | { | ||
+ | "dataSourceId": 3, | ||
+ | "nameTemplate": "", | ||
+ | "displayAttribute": null, | ||
+ | "hasMultipleValue": false, | ||
+ | "hasNullableValue": false, | ||
+ | "maxElements": null, | ||
+ | "hasServerFiltration": false, | ||
+ | "id": 3, | ||
+ | "caption": "Улица", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "hint": null, | ||
+ | "doActionOnChangeValue": true, | ||
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "rebuildDependentsObjectOnChange": true, | ||
+ | "enableRuleIds": [], | ||
+ | "visibleRuleIds": [], | ||
+ | "access": null, | ||
+ | "isValueChanged": true, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "DictionarySourceEntry" | ||
+ | }, | ||
+ | { | ||
+ | "dataSourceId": 4, | ||
+ | "nameTemplate": "", | ||
+ | "displayAttribute": null, | ||
+ | "hasMultipleValue": false, | ||
+ | "hasNullableValue": false, | ||
+ | "maxElements": null, | ||
+ | "hasServerFiltration": false, | ||
+ | "id": 4, | ||
+ | "caption": "Город", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "hint": null, | ||
+ | "doActionOnChangeValue": true, | ||
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "rebuildDependentsObjectOnChange": true, | ||
+ | "enableRuleIds": [], | ||
+ | "visibleRuleIds": [], | ||
+ | "access": null, | ||
+ | "isValueChanged": true, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "DictionarySourceEntry" | ||
+ | }, | ||
+ | { | ||
+ | "nameTemplate": "", | ||
+ | "displayAttribute": null, | ||
+ | "hasMultipleValue": false, | ||
+ | "hasNullableValue": false, | ||
+ | "maxElements": null, | ||
+ | "hasServerFiltration": false, | ||
+ | "id": 121, | ||
+ | "uiDataSource": { | ||
+ | "attribute": { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "attributeId": null, | ||
+ | "sourceId": 1, | ||
+ | "discriminator": "UiDataSourceDictionary" | ||
+ | }, | ||
+ | "caption": "Полное наименование.Контрагенты", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "hint": null, | ||
+ | "doActionOnChangeValue": true, | ||
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "rebuildDependentsObjectOnChange": true, | ||
+ | "enableRuleIds": [], | ||
+ | "visibleRuleIds": [], | ||
+ | "access": null, | ||
+ | "isValueChanged": true, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "StringSourceEntry" | ||
+ | } | ||
+ | ], | ||
+ | "entryDataSources": [ | ||
+ | { | ||
+ | "dictionaryId": 174, | ||
+ | "hierarchyId": null, | ||
+ | "filter": null, | ||
+ | "sortingOptions": null, | ||
+ | "groupingOptions": null, | ||
+ | "dictionaryAttributes": [ | ||
+ | { | ||
+ | "innerAttribute": { | ||
+ | "innerAttribute": { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 21, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 22, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | }, | ||
+ | { | ||
+ | "innerAttribute": { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 22, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | }, | ||
+ | { | ||
+ | "id": 22, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | } | ||
+ | ], | ||
+ | "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": 173, | ||
+ | "hierarchyId": null, | ||
+ | "filter": { | ||
+ | "dictionaryEntrySourceId": 1, | ||
+ | "sourceAttributeId": null, | ||
+ | "sourceAttribute": { | ||
+ | "id": 22, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "attributeId": null, | ||
+ | "attribute": { | ||
+ | "id": 1, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "conditionType": "AttributeInCollection", | ||
+ | "inversion": false, | ||
+ | "conditionId": null, | ||
+ | "discriminator": "EntryFilter" | ||
+ | }, | ||
+ | "sortingOptions": null, | ||
+ | "groupingOptions": null, | ||
+ | "dictionaryAttributes": null, | ||
+ | "defaultValue": [], | ||
+ | "defaultValueExpressionId": null, | ||
+ | "parameterId": null, | ||
+ | "dictionarySourceSelectionMode": "SelectFirst", | ||
+ | "dataSourceAttributesAdditionsSettings": [], | ||
+ | "externalFileStorageUrl": null, | ||
+ | "filePrefix": null, | ||
+ | "defaultNewElementSettings": null, | ||
+ | "id": 2, | ||
+ | "name": "Номер дома", | ||
+ | "isReadOnly": true, | ||
+ | "dataEditRuleIds": [], | ||
+ | "beforeSaveDataActions": [], | ||
+ | "afterSaveDataActions": [], | ||
+ | "discriminator": "DictionaryDataSource" | ||
+ | }, | ||
+ | { | ||
+ | "dictionaryId": 172, | ||
+ | "hierarchyId": null, | ||
+ | "filter": { | ||
+ | "dictionaryEntrySourceId": 1, | ||
+ | "sourceAttributeId": null, | ||
+ | "sourceAttribute": { | ||
+ | "innerAttribute": { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 22, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | }, | ||
+ | "attributeId": null, | ||
+ | "attribute": { | ||
+ | "id": 1, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "conditionType": "AttributeInCollection", | ||
+ | "inversion": false, | ||
+ | "conditionId": null, | ||
+ | "discriminator": "EntryFilter" | ||
+ | }, | ||
+ | "sortingOptions": null, | ||
+ | "groupingOptions": null, | ||
+ | "dictionaryAttributes": [], | ||
+ | "defaultValue": [], | ||
+ | "defaultValueExpressionId": null, | ||
+ | "parameterId": null, | ||
+ | "dictionarySourceSelectionMode": "SelectFirst", | ||
+ | "dataSourceAttributesAdditionsSettings": [], | ||
+ | "externalFileStorageUrl": null, | ||
+ | "filePrefix": null, | ||
+ | "defaultNewElementSettings": null, | ||
+ | "id": 3, | ||
+ | "name": "Улицы", | ||
+ | "isReadOnly": true, | ||
+ | "dataEditRuleIds": [], | ||
+ | "beforeSaveDataActions": [], | ||
+ | "afterSaveDataActions": [], | ||
+ | "discriminator": "DictionaryDataSource" | ||
+ | }, | ||
+ | { | ||
+ | "dictionaryId": 170, | ||
+ | "hierarchyId": null, | ||
+ | "filter": { | ||
+ | "dictionaryEntrySourceId": 1, | ||
+ | "sourceAttributeId": null, | ||
+ | "sourceAttribute": { | ||
+ | "innerAttribute": { | ||
+ | "innerAttribute": { | ||
+ | "id": 21, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 21, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | }, | ||
+ | "id": 22, | ||
+ | "discriminator": "TransitiveAttributeDefinitionDto" | ||
+ | }, | ||
+ | "attributeId": null, | ||
+ | "attribute": { | ||
+ | "id": 1, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "conditionType": "AttributeInCollection", | ||
+ | "inversion": false, | ||
+ | "conditionId": null, | ||
+ | "discriminator": "EntryFilter" | ||
+ | }, | ||
+ | "sortingOptions": null, | ||
+ | "groupingOptions": null, | ||
+ | "dictionaryAttributes": [], | ||
+ | "defaultValue": [], | ||
+ | "defaultValueExpressionId": null, | ||
+ | "parameterId": null, | ||
+ | "dictionarySourceSelectionMode": "SelectFirst", | ||
+ | "dataSourceAttributesAdditionsSettings": [], | ||
+ | "externalFileStorageUrl": null, | ||
+ | "filePrefix": null, | ||
+ | "defaultNewElementSettings": null, | ||
+ | "id": 4, | ||
+ | "name": "Города", | ||
+ | "isReadOnly": true, | ||
+ | "dataEditRuleIds": [], | ||
+ | "beforeSaveDataActions": [], | ||
+ | "afterSaveDataActions": [], | ||
+ | "discriminator": "DictionaryDataSource" | ||
+ | } | ||
+ | ], | ||
+ | "parameters": [], | ||
+ | "binaryConditionsRules": [], | ||
+ | "submitValidateRules": [], | ||
+ | "expressions": [], | ||
+ | "controlsValueCalculateRules": [], | ||
+ | "actions": [], | ||
+ | "conditionActionIdsOnOpen": [], | ||
+ | "conditionalActions": [], | ||
+ | "selectionSets": [], | ||
+ | "reportTemplates": [], | ||
+ | "useNewDependenciesBuilder": null | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div></div> |
Текущая версия на 07:52, 12 октября 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 | + | Идентификатор атрибута справочника, от значений которого будут фильтроваться данные, указанного в 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 фильтрация от контрагента происходит как для справочника городов, так и для номеров домов и улиц.