Общая информация
В Визуальном конструкторе услуг разработчикам доступны для использования компоненты, позволяющие подключить справочник на форму: Lookup, MultipleChoiceDictionary, MapService, RestCall и прочие
Зачастую при разработке услуг, где используются справочники, необходимо настроить их фильтрацию. Для настройки фильтрации справочника по атрибуту нужно задать:
- «Фильтрацию по выбранному словарю» в настройках Lookup
- «Опциональный список фильтров для справочника, фильтры соединяются через AND в настройках MultipleChoiceDictionary
- «Настройку фильтрации справочника» в настройках MapService
- «Фильтры справочника» в настройках компонента RestCall
Механизм сложной фильтрации
Сложная фильтрация — универсальный механизм, позволяющий задавать условия фильтрации, передаваемые в запросах к NSI-справочникам. Механизм dictionaryFilterV2 поддерживается в следующих компонентах: Lookup, MultipleChoiceDictionary, механизм ref (тип filterOn)
Новый механизм позволяет задавать любую структуру фильтра, которая поддерживается справочником NSI:
- задавать различные условия (CONDITIONS) для фильтрации: EQUALS, NOT_EQUALS, GREATER_THAN, LESS_THAN, GREATER_THAN_OR_EQUALS, LESS_THAN_OR_EQUALS, CONTAINS, STARTS_WITH, ENDS_WITH, FIAS, ADDRESS
- задавать в фильтре условия подзапроса: IN, EXISTS, NOT_EXISTS
- использовать в фильтре различные условия объединения: OR, AND, различные сочетания OR и AND
Механизм dictionaryFilterV2 позволяет указывать ссылки на значения атрибутов из черновика или текущего экрана, аналогично как при обычной фильтрации
Механизм dictionaryFilterV2 НЕ поддерживается в компонентах: RestCall, BackRestCall, MapService
Если в json компонента одновременно заданы сложная фильтрация и обычная фильтрация, то при формировании фильтра используется сложная фильтрация
В неактивном состоянии данный механизм выглядит следующим образом

При нажатии на кнопку «Да» появляется поле для ввода кода фильтра json

Настройка статической фильтрации
Простая статическая фильтрация
Статическая фильтрация по атрибуту задаётся явным указанием значения атрибута в поле «Константное значение для фильтра»

Сложная статическая фильтрация
Статическое значение, value внутри dictionaryFilterV2 подставляется в запрос в явном виде
В значение подставляется null или подобный сериализованный объект: "value": "{"asString": "text"}"
Подстановка строки
{ "attributeName": "ACTIVE", "condition": "EQUALS", "value": "{"asString":"Y"}", "valueType": "value" } |
Подстановка null
{ "attributeName": "ACTIVE", "condition": "EQUALS", "value": null, "valueType": "value" } |
Пример настройки в компоненте

Пример фильтрации по 2-ум атрибутам с объединением AND
{ "union": { "unionKind": "AND", "subs": [ { "simple": { "attributeName": "ACTIVE_EXTRACT", "condition": "EQUALS", "value": "{"asString":"Y"}", "valueType": "value" } }, { "simple": { "attributeName": "ACTIVE_OBTAIN", "condition": "EQUALS", "value": "{"asString":"Y"}", "valueType": "value" } } ] } } |
Описание атрибутов
Опция | Обязательность/значение по умолчанию | Описание | ||
---|---|---|---|---|
attributeName | Обязательное | Атрибут, по которому производится поиск в справочнике | ||
attributeType |
Необязательное, по умолчанию asString |
Формат данных в котором хранится поле на стороне nsi. Возможные типы: "asString", "asLong", "asDecimal", "asDateTime", "asDate", "asBoolean", "asNumber" |
||
condition | Обязательное |
Условия сравнения:
|
||
value | Обязательное |
Значение, по которому осуществляется фильтрация. Всегда строка, может быть как путь в json, например: "q2.value", или строка — сериализованный объект, например: value: "{"asString": "text"}" |
||
valueType | Обязательное |
Тип значения, по которому осуществляется фильтрация. Подробнее в возможных типах (ValueType) |
||
dateFormat | Необязательное | Если данные являются датой, то они будут отформатированы согласно данному формату | ||
formatValue.additionalString | Необязательное |
Параметры форматирования значения
|
||
additionalString | Необязательное |
"additionalString": "000" Добавляет указанные символы к value |
||
str | Необязательное |
"str": [ 0, 2 ], — при указании подобной конструкции у числа берутся только первые два символа Первый аргумент показывает, с какого по счету символа брать данные, а второй аргумент — по какой символ НЕ включительно |
||
excludeWrapper | Необязательное |
Если задан "excludeWrapper": true, то value передается в таком формате "value": "2", Если "excludeWrapper": false, то value принимает такой формат "value": {asDecimal:"2"} |
Настройка динамической фильтрации
Динамическая фильтрация подразумевает собой изменение значения для фильтра в зависимости от заданных условий. Вместо явного указания значения атрибута в поле «Константное значение для фильтра» может прописываться вычисляемый аргумент linkedValues, переменная, id другого компонента или его атрибут

Простая динамическая фильтрация
Пример динамической фильтрации Lookup по вычисляемому аргументу linkedValues
В данном примере используется справочник территориальных органов Directory_Of_Territorial. Справочник фильтруется по атрибуту ADDRESS, содержащему значение адреса ТО

Отфильтровать значения необходимо по региону из адреса, подтверждённого пользователем в компоненте ConfirmAddress, для этого описан аргумент linkedValues, вычисляемый с помощью JsonLogic — var1
{ "if": [ { "==": [ "answer.c28.value.address.region", "Москва" ] }, "г. Москва", { "==": [ "answer.c28.value.address.region", "Санкт-Петербург" ] }, "г. Санкт-Петербург", ... { "==": [ "answer.c28.value.address.region", "Самарская" ] }, "г. Самара" ] } |
В результате фильтрации выводятся значения справочника, соответствующие региону адреса регистрации пользователя

Пример динамической фильтрации MultipleChoiceDictionary по значению из другого компонента
В данном примере используется справочник типов документов, удостоверяющих личность, IDENTITY_DOC_TYPE. Справочник фильтруется по атрибуту country, содержащему значение страны принадлежности типа документа

Отфильтровать значения необходимо по стране принадлежности типа документа, этот признак определяется ответом пользователя в квизе c5. Условие описывается в аргументе ValueCalculator'а — c4.value.arguments.country
{ "visited": false, "linkedValues": [ { "argument": "country", "jsonLogic": { "if": [ { "==": [ "answer.c5.value", "да" ] }, "RUS", { "==": [ "answer.c5.value", "нет" ] }, "FOREIGN" ] } } ] } |
В результате фильтрации выводятся значения справочника согласно ответу пользователя в квизе о гражданстве

Пример динамической фильтрации справочника в компоненте MapService по глобальной переменной
В данном примере используется справочник организаций PGS_CNSTR_ORG, который фильтруется по глобальной переменной userRegionCode, содержащей значение ОКАТО пользователя

Значение глобальной переменной передаётся в вычисляемый аргумент, используемый в качестве значения для фильтра

В результате фильтрации при изменении региона местонахождения пользователя выводится соответствующий перечень организаций для выбора на карте

Пример динамической фильтрации справочников на одном экране
Для динамической фильтрации одного справочника по атрибуту другого справочника настраивается Зависимость с ранее введёнными данными, типом получения значения для фильтра устанавливается Значение из поддерживаемых. В данном примере справочник grls_ilp_nd, содержащий регистрационные номера лекарственных препаратов, фильтруется по значению id лекарственного препарата из справочника grls_ilp_lp


В результате фильтрации выводятся регистрационные номера выбранного лекарственного средства

Сложная динамическая фильтрация
Пример динамической фильтрации по данным из applicantAnswers
В примере данные берутся из applicantAnswers — заполненных компонентов с предыдущих экранов, в качестве "valueType" указывается "ref". Например:
{ "attributeName": "LIC_TYPE", "attributeType": "asDecimal", "condition": "EQUALS", "value": "s6lookup.value.originalItem.attributeValues.CODE", "valueType": "ref", "excludeWrapper": true, } |
Если задан "excludeWrapper": true, то value передается в таком формате "value": "2"
Если "excludeWrapper": false, то value принимает такой формат "value": {asDecimal:"2"}
Пример динамической фильтрации по данным из serviceInfo
В данном случае фильтр нужен для обращения к блоку serviceInfo в scenarioDto, в качестве "valueType" указывается "serviceInfo"

Пример:
{ "attributeName": "REGOKATO", "condition": "EQUALS", "value": "infSysCode", "valueType": "serviceInfo" } |
Пример динамической фильтрации по значениям компонентов текущего экрана
Позволяет использовать данные других компонентов текущего экрана, т.е. данных ещё нет в applicantAnswers, в качестве "valueType" указывается "formValue"
Используется при фильтрации внутри зависимостей (filterOn)
{ "attributeName": "REGOKATO", "condition": "EQUALS", "valueType": "formValue", "attributeType": "asString", "value": "VKRegionName.value.id" } |
Пример динамической фильтрации по вычисляемым аргументам
Аргументы для вычисления в expr берутся из applicantAnswers и задаются, как в ref, в качестве "valueType" указывается "calc"
{ "attributeName": "address", "condition": "EQUALS", "attributeType": "asDecimal", "value": "", "expr": [ "$dict2_SanCheRest_is_fell.value.attributeValues.ADDRESS != '' ? $dict2_SanCheRest_is_fell.value.attributeValues.ADDRESS : ''", "$dict2_SanCheRest_is_good.value.attributeValues.address != '' ? $dict2_SanCheRest_is_good.value.attributeValues.address : ''", "$dict3_SanCheRest_is_fell.value.attributeValues.ADDRESS != '' ? $dict3_SanCheRest_is_fell.value.attributeValues.ADDRESS : ''", "$dict3_SanCheRest_is_good.value.attributeValues.address != '' ? $dict3_SanCheRest_is_good.value.attributeValues.address : ''" ], "valueType": "calc" } |