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

Материал из 3v-wiki
Перейти к навигации Перейти к поиску
 
(не показаны 23 промежуточные версии 2 участников)
Строка 1: Строка 1:
'''СТРАНИЦА НАХОДИТСЯ В РАЗРАБОТКЕ'''
+
Фильтр EntryFilter позволяет выбрать данные в справочнике относительно другого связного справочника. Элементы одного справочника будут отображаться в зависимости от выбранных элементов другого справочника. Элемент "filter" добавляется в источник, который необходимо отфильтровать.
 
 
Фильтр EntryFilterDto позволяет выбрать данные в справочнике относительно другого связного справочника. Элементы одного справочника будут отображаться в зависимости от выбранных элементов другого справочника. Элемент "filter" добавляется в источник, который необходимо отфильтровать.
 
 
Фильтр имеет следующую структуру:
 
Фильтр имеет следующую структуру:
 
<syntaxhighlight lang="JSON" line>
 
<syntaxhighlight lang="JSON" line>
Строка 17: Строка 15:
 
         "inversion": false,
 
         "inversion": false,
 
         "conditionId": null,
 
         "conditionId": null,
         "discriminator": "EntryFilterDto"
+
         "discriminator": "EntryFilter"
 
           }
 
           }
 
</syntaxhighlight>
 
</syntaxhighlight>
Строка 23: Строка 21:
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Свойство !! Описание
+
! Свойство !! Обязательность !!Описание
 
|-
 
|-
| dictionaryEntrySourceId || Id источника - справочника, от значений которого будут фильтроваться данные
+
| dictionaryEntrySourceId || + ||Id источника данных на форме с типом "Справочник", от значений которого будут фильтроваться данные
 
|-
 
|-
| sourceAttribute|| [[Платформа_3V/Справочник/Связи_атрибутов_справочников|''' Атрибут''']] справочника, от значений которого будут фильтроваться данные
+
| sourceAttribute|| + || [[Платформа_3V/Справочник/Связи_атрибутов_справочников|''' Идентификатор атрибута''']] справочника, от значений которого будут фильтроваться данные, указанного в dictionaryEntrySourceId
 
|-
 
|-
| attribute|| [[Платформа_3V/Справочник/Связи_атрибутов_справочников|''' Атрибут''']] текущего источника, с которым связано значение справочника от которого идет фильтрация. Указывается номер Id и тип атрибута в данном случае собственный (OwnAttributeDefinitionDto), так как используются данные текущего справочника.
+
| attribute|| + || [[Платформа_3V/Справочник/Связи_атрибутов_справочников|''' Идентификатор атрибута''']] текущего настраиваемого справочника, с которым связано значение справочника от которого идет фильтрация. Указывается номер Id и тип атрибута в данном случае собственный (OwnAttributeDefinitionDto), так как используются данные текущего справочника.  
 
|-
 
|-
| discriminator|| EntryFilterDto
+
| discriminator|| + || EntryFilter
 
|-  
 
|-  
| conditionType || Тип условий
+
| conditionType || - ||[[Платформа_3V/Формы/Источники_данных/Справочник/Фильтрация#Типы%20условий%20фильтрации%20(conditionType)| '''Тип условий''']]
 
|-  
 
|-  
| inversion || В значении "false" фильтр отберет удовлетворяющие ему значения, в значении "true" - все значения, которые наоборот не удовлетворяют ему
+
| inversion || + || В значении "false" источник-справочник принимает значения, которые удовлетворяют фильтру, в значении "true" - все значения, которые наоборот не удовлетворяют ему
 
|-  
 
|-  
| conditionId || [[Платформа_3V/Формы/Правила| '''Условия''']], при которых применяется фильтр  
+
| 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 class="toccolours mw-collapsible mw-collapsed" style="width:800px; overflow:auto;">
Строка 49: Строка 53:
 
{
 
{
 
   "id": 10735,
 
   "id": 10735,
   "name": "Пример фильтра от справочника (EntryFilterDto)",
+
   "name": "Пример фильтра от справочника (EntryFilter)",
 
   "description": null,
 
   "description": null,
 
   "title": "Пример фильтрации_справочник от справочника",
 
   "title": "Пример фильтрации_справочник от справочника",
Строка 55: Строка 59:
 
   "uiSources": [
 
   "uiSources": [
 
     {
 
     {
       "actionConfirmation": {
+
       "dataSourceId": 2,
         "message": null,
+
      "nameTemplate": "",
         "conditionId": null
+
      "displayAttribute": null,
 +
      "hasMultipleValue": false,
 +
      "hasNullableValue": false,
 +
      "maxElements": null,
 +
      "hasServerFiltration": false,
 +
      "searchSettings": {
 +
         "maxElements": null,
 +
         "minInputChars": 2,
 +
        "searchMode": "Client",
 +
        "debounceMs": 300
 
       },
 
       },
      "controlsValueCalculateRulesIds": [],
+
       "id": 1,
      "conditionalActions": [],
+
       "caption": "Вид контрагента",
      "onBeforeClickConditionalActions": [],
 
      "submitRuleIds": [],
 
       "id": 100,
 
       "caption": "Сохранить",
 
 
       "enable": true,
 
       "enable": true,
 
       "visible": true,
 
       "visible": true,
 
       "hint": null,
 
       "hint": null,
      "uiDataSource": null,
 
 
       "doActionOnChangeValue": true,
 
       "doActionOnChangeValue": true,
 
       "onAfterChangeValueConditionalActions": null,
 
       "onAfterChangeValueConditionalActions": null,
 
       "onAfterChangeValueByClientConditionalActions": null,
 
       "onAfterChangeValueByClientConditionalActions": null,
       "rebuildDependentsObjectOnChange": false,
+
       "rebuildDependentsObjectOnChange": true,
 
       "enableRuleIds": [],
 
       "enableRuleIds": [],
 
       "visibleRuleIds": [],
 
       "visibleRuleIds": [],
 
       "access": null,
 
       "access": null,
       "isValueChanged": false,
+
       "isValueChanged": true,
 
       "expressionId": null,
 
       "expressionId": null,
       "discriminator": "ButtonSubmitSourceEntry"
+
       "discriminator": "DictionarySourceEntry"
 
     },
 
     },
 
     {
 
     {
       "dataSourceId": 2,
+
       "dataSourceId": 3,
 
       "nameTemplate": "",
 
       "nameTemplate": "",
 
       "displayAttribute": null,
 
       "displayAttribute": null,
Строка 94: Строка 102:
 
         "debounceMs": 300
 
         "debounceMs": 300
 
       },
 
       },
       "id": 1,
+
       "id": 2,
       "caption": "Вид контрагента",
+
       "caption": "Контрагенты",
 
       "enable": true,
 
       "enable": true,
 
       "visible": true,
 
       "visible": true,
 
       "hint": null,
 
       "hint": null,
       "uiDataSource": {
+
       "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": {
 
         "attribute": {
 
           "id": 21,
 
           "id": 21,
 
           "discriminator": "OwnAttributeDefinitionDto"
 
           "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,
 
         "attributeId": null,
         "sourceId": 1,
+
         "attribute": {
         "discriminator": "UiDataSourceDictionary"
+
          "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,
 
       "doActionOnChangeValue": true,
 
       "onAfterChangeValueConditionalActions": null,
 
       "onAfterChangeValueConditionalActions": null,
Строка 127: Строка 424:
 
       "maxElements": null,
 
       "maxElements": null,
 
       "hasServerFiltration": false,
 
       "hasServerFiltration": false,
      "searchSettings": {
+
       "id": 3,
        "maxElements": null,
+
       "caption": "Улица",
        "minInputChars": 2,
 
        "searchMode": "Client",
 
        "debounceMs": 300
 
      },
 
       "id": 2,
 
       "caption": "Контрагенты",
 
 
       "enable": true,
 
       "enable": true,
 
       "visible": true,
 
       "visible": true,
 
       "hint": null,
 
       "hint": null,
       "doActionOnChangeValue": false,
+
       "doActionOnChangeValue": true,
 
       "onAfterChangeValueConditionalActions": null,
 
       "onAfterChangeValueConditionalActions": null,
 
       "onAfterChangeValueByClientConditionalActions": null,
 
       "onAfterChangeValueByClientConditionalActions": null,
Строка 145: Строка 436:
 
       "visibleRuleIds": [],
 
       "visibleRuleIds": [],
 
       "access": null,
 
       "access": null,
       "isValueChanged": false,
+
       "isValueChanged": true,
 
       "expressionId": null,
 
       "expressionId": null,
 
       "discriminator": "DictionarySourceEntry"
 
       "discriminator": "DictionarySourceEntry"
 
     },
 
     },
 
     {
 
     {
       "trimSpaces": false,
+
       "dataSourceId": 4,
       "defaultValue": null,
+
      "nameTemplate": "",
       "value": null,
+
      "displayAttribute": null,
 +
      "hasMultipleValue": false,
 +
       "hasNullableValue": false,
 +
      "maxElements": null,
 +
       "hasServerFiltration": false,
 
       "id": 4,
 
       "id": 4,
       "caption": "Технический",
+
       "caption": "Город",
 
       "enable": true,
 
       "enable": true,
 
       "visible": true,
 
       "visible": true,
 
       "hint": null,
 
       "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": {
 
       "uiDataSource": {
 
         "attribute": {
 
         "attribute": {
           "id": 2,
+
           "id": 21,
 
           "discriminator": "OwnAttributeDefinitionDto"
 
           "discriminator": "OwnAttributeDefinitionDto"
 
         },
 
         },
Строка 167: Строка 481:
 
         "discriminator": "UiDataSourceDictionary"
 
         "discriminator": "UiDataSourceDictionary"
 
       },
 
       },
 +
      "caption": "Полное наименование.Контрагенты",
 +
      "enable": true,
 +
      "visible": true,
 +
      "hint": null,
 
       "doActionOnChangeValue": true,
 
       "doActionOnChangeValue": true,
 
       "onAfterChangeValueConditionalActions": null,
 
       "onAfterChangeValueConditionalActions": null,
 
       "onAfterChangeValueByClientConditionalActions": null,
 
       "onAfterChangeValueByClientConditionalActions": null,
       "rebuildDependentsObjectOnChange": false,
+
       "rebuildDependentsObjectOnChange": true,
 
       "enableRuleIds": [],
 
       "enableRuleIds": [],
 
       "visibleRuleIds": [],
 
       "visibleRuleIds": [],
 
       "access": null,
 
       "access": null,
       "isValueChanged": false,
+
       "isValueChanged": true,
       "expressionId": 1,
+
       "expressionId": null,
 
       "discriminator": "StringSourceEntry"
 
       "discriminator": "StringSourceEntry"
 
     }
 
     }
Строка 181: Строка 499:
 
   "entryDataSources": [
 
   "entryDataSources": [
 
     {
 
     {
       "dictionaryId": 10736,
+
       "dictionaryId": 174,
 
       "hierarchyId": null,
 
       "hierarchyId": null,
 
       "filter": null,
 
       "filter": null,
 
       "sortingOptions": null,
 
       "sortingOptions": null,
 
       "groupingOptions": null,
 
       "groupingOptions": null,
       "dictionaryAttributes": 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": [],
 
       "defaultValue": [],
 
       "defaultValueExpressionId": null,
 
       "defaultValueExpressionId": null,
Строка 196: Строка 543:
 
       "defaultNewElementSettings": null,
 
       "defaultNewElementSettings": null,
 
       "id": 1,
 
       "id": 1,
       "name": "Справочник. Пример фильтра от справочника",
+
       "name": "Контрагенты",
 
       "isReadOnly": false,
 
       "isReadOnly": false,
 
       "dataEditRuleIds": [],
 
       "dataEditRuleIds": [],
Строка 204: Строка 551:
 
     },
 
     },
 
     {
 
     {
       "dictionaryId": 10754,
+
       "dictionaryId": 173,
 
       "hierarchyId": null,
 
       "hierarchyId": null,
       "filter": 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,
 
       "sortingOptions": null,
 
       "groupingOptions": null,
 
       "groupingOptions": null,
Строка 213: Строка 576:
 
       "defaultValueExpressionId": null,
 
       "defaultValueExpressionId": null,
 
       "parameterId": null,
 
       "parameterId": null,
       "dictionarySourceSelectionMode": "None",
+
       "dictionarySourceSelectionMode": "SelectFirst",
 
       "dataSourceAttributesAdditionsSettings": [],
 
       "dataSourceAttributesAdditionsSettings": [],
 
       "externalFileStorageUrl": null,
 
       "externalFileStorageUrl": null,
Строка 219: Строка 582:
 
       "defaultNewElementSettings": null,
 
       "defaultNewElementSettings": null,
 
       "id": 2,
 
       "id": 2,
       "name": "Вид контрагента",
+
       "name": "Номер дома",
 
       "isReadOnly": true,
 
       "isReadOnly": true,
 
       "dataEditRuleIds": [],
 
       "dataEditRuleIds": [],
Строка 227: Строка 590:
 
     },
 
     },
 
     {
 
     {
       "dictionaryId": 10755,
+
       "dictionaryId": 172,
 
       "hierarchyId": null,
 
       "hierarchyId": null,
 
       "filter": {
 
       "filter": {
         "dictionaryEntrySourceId": 2,
+
         "dictionaryEntrySourceId": 1,
 +
        "sourceAttributeId": null,
 
         "sourceAttribute": {
 
         "sourceAttribute": {
 +
          "innerAttribute": {
 +
            "id": 21,
 +
            "discriminator": "OwnAttributeDefinitionDto"
 +
          },
 +
          "id": 22,
 +
          "discriminator": "TransitiveAttributeDefinitionDto"
 +
        },
 +
        "attributeId": null,
 +
        "attribute": {
 
           "id": 1,
 
           "id": 1,
 
           "discriminator": "OwnAttributeDefinitionDto"
 
           "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": {
 
         "attribute": {
           "id": 21,
+
           "id": 1,
 
           "discriminator": "OwnAttributeDefinitionDto"
 
           "discriminator": "OwnAttributeDefinitionDto"
 
         },
 
         },
Строка 242: Строка 658:
 
         "inversion": false,
 
         "inversion": false,
 
         "conditionId": null,
 
         "conditionId": null,
         "discriminator": "EntryFilterDto"
+
         "discriminator": "EntryFilter"
 
       },
 
       },
 
       "sortingOptions": null,
 
       "sortingOptions": null,
Строка 250: Строка 666:
 
       "defaultValueExpressionId": null,
 
       "defaultValueExpressionId": null,
 
       "parameterId": null,
 
       "parameterId": null,
       "dictionarySourceSelectionMode": "None",
+
       "dictionarySourceSelectionMode": "SelectFirst",
 
       "dataSourceAttributesAdditionsSettings": [],
 
       "dataSourceAttributesAdditionsSettings": [],
 
       "externalFileStorageUrl": null,
 
       "externalFileStorageUrl": null,
 
       "filePrefix": null,
 
       "filePrefix": null,
 
       "defaultNewElementSettings": null,
 
       "defaultNewElementSettings": null,
       "id": 3,
+
       "id": 4,
       "name": "Контрагенты",
+
       "name": "Города",
 
       "isReadOnly": true,
 
       "isReadOnly": true,
 
       "dataEditRuleIds": [],
 
       "dataEditRuleIds": [],
Строка 267: Строка 683:
 
   "binaryConditionsRules": [],
 
   "binaryConditionsRules": [],
 
   "submitValidateRules": [],
 
   "submitValidateRules": [],
   "expressions": [
+
   "expressions": [],
    {
 
      "id": 1,
 
      "expression": "[1]",
 
      "returnFirstParameterValue": false,
 
      "parameters": [
 
        {
 
          "id": 1,
 
          "allowMultipleValues": false,
 
          "discriminator": "EntryExpressionDictionarySourceParameterDto",
 
          "dictionarySourceId": 3,
 
          "attributeId": 2,
 
          "getFirstElementValue": false,
 
          "useAllInstanceElements": false
 
        }
 
      ],
 
      "comment": null
 
    }
 
  ],
 
 
   "controlsValueCalculateRules": [],
 
   "controlsValueCalculateRules": [],
 
   "actions": [],
 
   "actions": [],

Текущая версия на 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" все атрибуты (транзитивные и собственные), которые используются. Пример см.ниже "Пример фильтрации от транзитивного атрибута"

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

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

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 серверной карточки