updateFilters: function (filter) {
 
                    var esq = this.getGridDataESQ();
                    switch(filter) {
                        case "TsOwner":
                            var user = this.Terrasoft.SysValue.CURRENT_USER_CONTACT.value;
                           	esq.filters.add("CurrentUser", this.Terrasoft.createColumnFilterWithParameter(
                                this.Terrasoft.ComparisonType.EQUAL, "TsOwner", user)); 
                            break;
                        case "TsOt": 
                            esq.filters.add("NotCurrentUser", this.Terrasoft.createColumnFilterWithParameter(
                                this.Terrasoft.ComparisonType.EQUAL, "TsOwner", user)); 
                            break;   
                    }
                },

Есть такой метод, который должен срабатывать при нажатии на кастомную кнопку в разделе. При нажатии ничего не происходит. Нужна чтобы работала по аналогии базовых фильтров в разделе. 

Нравится

8 комментариев

Добрый день,
предоставьте, пожалуйста, конфигурацию кнопки в массиве diff.

Mykhailo Storozhuk,

 {

                    "operation": "insert",

                    "name": "SearchQueryButton",

                    "parentName": "ActionButtonsContainer",

                    "propertyName": "items",

                    "values": {

                        "caption": "Все клиенты филиала",

                        "itemType": Terrasoft.ViewItemType.BUTTON,

                        "style": Terrasoft.controls.ButtonEnums.style.GREEN,

                        "click": {"bindTo": "TsOwnerQueryFilter"},

                        "layout": {

                            "column": 6,

                            "row": 0,

                            // "colSpan": 9,

                            // "rowSpan": 1,

                        },

                    },

                    "index": 2

                },

 

 

  TsOwnerQueryFilter: function () {

                    this.updateFilters("TsOwner");

                },

После того как Вы добавили фильтр нужно получить данные с новым фильтром и перезагрузить страничку реестра через метод this.refreshGridData().

sad

Не помогло. 

Предоставьте код в методе, пожалуйста

Mykhailo Storozhuk, 

initQueryFilters: function (filter) {

                    var esq = this.getGridDataESQ();

                    if (filter == "TsOwner") {

                        var user = '{218A312F-C5FB-4E8F-E053-223E1EAC50CA}'; 

                        esq.filters.add("CurrentUser",

                        this.Terrasoft.createColumnFilterWithParameter(

                            this.Terrasoft.ComparisonType.EQUAL, "TsOwner", user));

                    }

 

                    else if (filter == "TsNotOwner") {

                        var people = '{B1B7A389-130F-6EDB-E040-007F01000437}';

                        esq.filters.add("CurrenNottUser",

                            this.Terrasoft.createColumnFilterWithParameter(

                                this.Terrasoft.ComparisonType.EQUAL, "TsOwner", people));

                    }

                },

 

                updateFilters: function (filter) {

 

                    var esq = this.getGridDataESQ();

                    switch(filter) {

                        case "TsOwner":

                            var user = this.Terrasoft.SysValue.CURRENT_USER_CONTACT.value;

                            esq.filters.add("CurrentUser", this.Terrasoft.createColumnFilterWithParameter(

                                this.Terrasoft.ComparisonType.EQUAL, "TsOwner", user)); 

                            break;

                        case "TsNotOwner": 

                            esq.filters.add("NotCurrentUser", this.Terrasoft.createColumnFilterWithParameter(

                                this.Terrasoft.ComparisonType.EQUAL, "TsOwner", user)); 

                            break;   

                    }

 

                    this.reloadGridData();

 

                },

 

 

2 метода, ни один не работает. привязаны к кнопке на странице. 

По логике в разделе должен обновлить и применить фильтр 

Прошу прощения, правильнее будет переопределить метод initQueryFilters и потом вызывать метод reloadGridData. Пример кода:
define("ContactSectionV2", [], function() {
    return {
        entitySchemaName: "Contact",
          attributes: {
            "UsrTest": {
                "dataValueType": Terrasoft.DataValueType.BOOLEAN
         }
        },
        methods: {
            onTestClick: function() {
                this.set("UsrTest", true);
                this.reloadGridData();
            },
              initQueryFilters: function(esq) {
                this.callParent(arguments);
                //номер в пп
                var usrTestFilter = this.get("UsrTest");
                if (usrTestFilter) {
                    esq.filters.add("UsrTestFiltertest", 
                      esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Name", "111"));
                }
            }
        },
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "insert",
                "parentName": "ActionButtonsContainer",
                "propertyName": "items",
                "name": "MainContactSectionButton",
                "values": {
                    itemType: Terrasoft.ViewItemType.BUTTON,
                    caption: "Button test",
                    click: { bindTo: "onTestClick" },
                    "layout": {
                        "column": 1,
                        "row": 6,
                        "colSpan": 1
                    }
                }
            }
        ]/**SCHEMA_DIFF*/
    };
});

Показать все комментарии

Всем доброго дня! 

Добавила свои кастомные быстрые фильтры через аттрибуты и переопределение функции initQueryFilters , фильтры работают как нужно. Теперь не могу найти где находится базовый пересчет количества. Может быть кто-то знает.

Прикрепленные файлы

Нравится

5 комментариев
              var activeViewName = this.getActiveViewName();
              if (activeViewName === this.get("AnalyticsDataViewName")) {
                this.sandbox.publish("SectionUpdateFilter",
                                     null, [this.getQuickFilterModuleId()]);
              }

Пробуйте запустить такой код после применения ваших фильтров

не помогло, пробовала также и без проверки условия.

Можете отправить полный код, где делаете фильтр?

Трефилов Павел Сергеевич,

define("OrderSectionV2", ["ProcessModuleUtilities","BaseFiltersGenerateModule","css!UsrStylesOrderSectionV2"], function(ProcessModuleUtilities,BaseFiltersGenerateModule) {
	return {
		entitySchemaName: "Order",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		attributes: {
            "UsrPPNumberFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrPPNumbers": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            },
			"UsrMyNumberFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrMyNumbers": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            },
			"UsrContrFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrContr": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            },
			"UsrNameFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrMyName": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            },
			"UsrQua": {
                "dataValueType": Terrasoft.DataValueType.INTEGER,
                "values": ""
            },
        },
		diff: /**SCHEMA_DIFF*/[	
			{
                "operation": "insert",
                "name": "MyFilterContainer",
                "parentName": "LeftGridUtilsContainer",
                "propertyName": "items",
                "index": 3,
                "values": {
                    "id": "MyFilterContainer",
                    "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                    "items": [],
 
                }
            },
 
 
			{
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "PP_Number",
				"index": 1,
                "values": {
                    "bindTo": "UsrPPNumberFilter",
                    "caption": {"bindTo": "Resources.Strings.UsrPPNumberCaption"},
 
					"controlConfig": {
                        "change": {
                            "bindTo": "ppNumChanged"
                        }
                    }
 
                }
            },
 
			{
					"operation": "insert",
					"parentName": "MyFilterContainer",
					"propertyName": "items",
					"name": "DeleteButton1",
					"index": 2,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "",
						"imageConfig": {"bindTo": "Resources.Images.del_but"},
						"controlConfig": {
						},
						"layout": {
							"column": 0,
							"row": 2,
							"colSpan": 1
						},
						"click": { "bindTo": "onDel" },
					}
			},
			{
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "my_Number",
				"index": 3,
                "values": {
                    "bindTo": "UsrMyNumberFilter",
                    "caption": {"bindTo": "Resources.Strings.myNumber"},
 
					"controlConfig": {
                        "change": {
                            "bindTo": "myNumberChanged"
                        }
                    }
 
                }
            },
			{
					"operation": "insert",
					"parentName": "MyFilterContainer",
					"propertyName": "items",
					"name": "DeleteButton2",
					"index": 4,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "",
						"imageConfig": {"bindTo": "Resources.Images.del_but"},
						"controlConfig": {
						},
						"layout": {
							"column": 0,
							"row": 2,
							"colSpan": 1
						},
						"click": { "bindTo": "onDel2" },
					}
			},
			{
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "my_Contr",
				"index": 5,
                "values": {
                    "bindTo": "UsrContrFilter",
                    "caption": {"bindTo": "Resources.Strings.myContr"},
 
					"controlConfig": {
                        "change": {
                            "bindTo": "myContrChanged"
                        }
                    }
 
                }
            },
			{
					"operation": "insert",
					"parentName": "MyFilterContainer",
					"propertyName": "items",
					"name": "DeleteButton3",
					"index": 6,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "",
						"imageConfig": {"bindTo": "Resources.Images.del_but"},
						"controlConfig": {
						},
						"layout": {
							"column": 0,
							"row": 2,
							"colSpan": 1
						},
						"click": { "bindTo": "onDel3" },
					}
			},
			{
					"operation": "insert",
					"parentName": "MyFilterContainer",
					"propertyName": "items",
					"name": "PeriodSelectButton",
					"index": 7,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "",
						"imageConfig": {"bindTo": "Resources.Images.LookupIcon"},
						"controlConfig": {
						},
						"layout": {
							"column": 0,
							"row": 2,
							"colSpan": 1
						},
						"click": { "bindTo": "openMyLook" },
					}
			},
			{
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "my_Name",
				"index": 8,
                "values": {
                    "bindTo": "UsrNameFilter",
                    "caption": {"bindTo": "Resources.Strings.myName"},
 
					"controlConfig": {
                        "change": {
                            "bindTo": "myNameChanged"
                        }
                    }
 
                }
            },
			{
					"operation": "insert",
					"parentName": "MyFilterContainer",
					"propertyName": "items",
					"name": "DeleteButton4",
					"index": 9,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "",
						"imageConfig": {"bindTo": "Resources.Images.del_but"},
						"controlConfig": {
						},
						"layout": {
							"column": 0,
							"row": 2,
							"colSpan": 1
						},
						"click": { "bindTo": "onDel4" },
					}
			},
 
        ]/**SCHEMA_DIFF*/,
 
		methods: {
 
		clearFilter: function() {
			this.set("UsrPPNumberFilter", "");
			this.onUsrFilterChanged();
		},
 
		onUsrFilterChanged: function() {
			this.reloadGridData();
		},
 
		initQueryFilters: function(esq) {
			this.callParent(arguments);
			//номер в пп
			var usrEmailFilter = this.get("UsrPPNumbers");
			if (usrEmailFilter) {
				esq.filters.add("UsrPPNumberFilter", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.CONTAIN, "UsrNumberInPP".substring(), usrEmailFilter));
			} else {
				esq.filters.removeByKey("UsrPPNumberFilter");
			}		
 
			//Номер
			var usrMyFilter = this.get("UsrMyNumbers");
			if (usrMyFilter) {
				esq.filters.add("UsrMyNumberFilter", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.CONTAIN, "Number".substring(), usrMyFilter));
			} else {
				esq.filters.removeByKey("UsrMyNumberFilter");
			}
			//Контрагент
			var usrContrFilter = this.get("UsrContr");
			if (usrContrFilter) {
				esq.filters.add("UsrContrFilter", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.CONTAIN, "Account.Name".substring(), usrContrFilter));
			} else {
				esq.filters.removeByKey("UsrContrFilter");
			}
			//Название
			var usrNameFilter = this.get("UsrMyName");
			if (usrNameFilter) {
				esq.filters.add("UsrNameFilter", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.CONTAIN, "UsrName".substring(), usrNameFilter));
			} else {
				esq.filters.removeByKey("UsrNameFilter");
			}
 
 
		},
 
		ppNumChanged: function(a, b, c) {
			this.set("UsrPPNumbers", a);
			this.onUsrFilterChanged();
 
		},
 
		myNumberChanged: function(a, b, c) {
			this.set("UsrMyNumbers", a);
			this.onUsrFilterChanged();
		},
 
		myContrChanged: function(a, b, c) {
			this.set("UsrContr", a);
			this.onUsrFilterChanged();
		},
 
		myNameChanged: function(a, b, c) {
			this.set("UsrMyName", a);
			this.onUsrFilterChanged();	
		},
 
		addCallBack: function(args) {
		  this.selectedRows = args.selectedRows.getItems();
 
			var ids = [];
			var names = [];
			this.selectedRows.forEach(function(item) {
				ids.push(item.Id);
				names.push(item.Name);
		   });
			this.set("UsrContr",names);
			document.getElementById('OrderSectionV2my_ContrTextEdit-el').value = names;
			document.getElementById('OrderSectionV2my_ContrTextEdit-el').focus();
			document.getElementById('OrderSectionV2my_ContrTextEdit-el').blur();
		},
 
 		openMyLook: function(){
			var config = {
				entitySchemaName: "Account",
				columns: ["Name"]
			};
			this.openLookup(config, this.addCallBack, this);
		},
		onDel: function(){
			document.getElementById('OrderSectionV2PP_NumberTextEdit-el').value = null;
			this.set("UsrPPNumberFilter", "");
			this.onUsrFilterChanged();
		},
		onDel2: function(){
			document.getElementById('OrderSectionV2my_NumberTextEdit-el').value = null;
			this.set("UsrMyNumberFilter", "");
			this.onUsrFilterChanged();
		},
		onDel3: function(){
			document.getElementById('OrderSectionV2my_ContrTextEdit-el').value = null;
			this.set("UsrContrFilter", "");
			this.onUsrFilterChanged();
		},
		onDel4: function(){
			document.getElementById('OrderSectionV2my_NameTextEdit-el').value = null;
			this.set("UsrNameFilter", "");
			this.onUsrFilterChanged();
		},
 
		}
	};
});

 

Анастасия Шумейко,

Добрый день.

 

Вам нужно проверить уходит ли запрос на получение количества записей.

Если запрос уходит, то нужно проверить фильтрацию которая уходит в запросе. Возможно, что количество обновляется, но неправильно, поскольку используется та же фильтрация.

Если запрос не уходит, то нужно проверить как он формируется в базовой версии и вызвать обновление количества записей.

Показать все комментарии

Всем доброго дня! Подскажите можно ли как-то отфитровать список  в "Фильтры/группы" - "Добавить условие" ? Изменение поведения в Объекте на режим "Никогда" не подходит(нужно видеть фильтры в расширенном режиме). 

Нравится

2 комментария

Анастасия, в каждом разделе системы отображение первого поля при быстром поиске заложено в параметре PRIMARY_DISPLAY_COLUMN (Отображаемое значение). Например, для раздела Контакты это поле [ФИО].
В быстром фильтре указывать приоритетность отображения полей нет возможности. Перечень заложен на уровне конфигурации приложения и пользовательскими средствами решить задачу нет возможности.
На практике для фиксирования определенных полей для фильтрации используются быстрые фильтры - это фильтр, который внедряется на страницу раздела средствами разработкой и помогает закрепить несколько полей в шапке раздела для удобного указания параметров фильтрации.
Однако данный вариант также предполагает использование средств разработки. Более детальнее описано в статье по ссылке: https://academy.terrasoft.ua/docs/developer/elements_and_components/bas…

Алёна Доля,

Хотелось бы отредактировать значения именно в базовом списке, 

в "Фильтры/группы" - "Добавить условие" и повыкидывать оттуда не нужные поля. 

Показать все комментарии
//в diff
"ContractDetailV20ddfbca0": {
    "schemaName": "ContractDetailV2",
     "entitySchemaName": "Contract",
     "filter": {
        "detailColumn": "Account",
         "masterColumn": "Id"
    },   //не забываем здесь поставить запятую
    "filterMethod": "filtrationNrbFinApplicationDoubleDetail" // добавляем такую строчку. Название (справа) может быть любым.
},
 
//в методах
filtrationNrbFinApplicationDoubleDetail: function () {
	var filterGroup = new this.Terrasoft.createFilterGroup(); 
	filterGroup.add("ByIdFilter", this.Terrasoft.createColumnFilterWithParameter(
		this.Terrasoft.ComparisonType.NOT_EQUAL, "Id", this.get("Id"))
	);
	return filterGroup;
},

 

Нравится

Поделиться

0 комментариев
Показать все комментарии

Добрый день, когда пытаюсь в разделе активность вывести все записи с типом Email, то ничего не отображается, хотя если произdодить поиск тем же способом через справочник, то все нормально выводит

 

Нравится

1 комментарий
Лучший ответ

Добрый день.

В разделе [Активности] отображаются все активности, кроме email.

Для работы с письмами на маркетплейсе реализованы дополнительные разделы. Например, Email extension for Creatio.

Добрый день.

В разделе [Активности] отображаются все активности, кроме email.

Для работы с письмами на маркетплейсе реализованы дополнительные разделы. Например, Email extension for Creatio.

Показать все комментарии

Есть справочник "Стадия", по нему нужно сделать быстрый фильтр по типу как в расширенном фильтре(т.е с множественным выбором). Как это можно реализовать?

 

Нравится

3 комментария

Гусейн, судя по одинаковой иконке, Вы добавили логику для справочника стадий по аналогии с выбором ответственного тут же левее. Так там уже есть множественный выбор, только добавлять ответственных нужно по одному:

Если для стадий реализовали аналогично, там тоже должно такое работать.

 

Идея в быстром фильтре добавить возможность множественного выбора значений уже зарегистрирована.

Зверев Александр,
Да, добавил по типу как с ответственным, но если так делать все работает криво(не подстраивается под нужный справочник). Нужен именно множественный выбор с галками и тд.

Атамогланов Гусейн пишет:
все работает криво(не подстраивается под нужный справочник)

Нужно смотреть, как именно доработали в OpportunitySectionV2, что в результате не так отрабатывает для функций из FixedFilterViewV2 и FixedFilterViewModelV2.

Показать все комментарии

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

LDAP Provider Test

 

Для корректной настройки параметров поиска можно использовать утилиту, которая в точности повторяет поисковые запросы используемые в Creatio.

На скриншоте интерфейс утилиты в котором необходимо указать параметры подключения к северу AD и ввести параметры поисковых запросов.

 

В поле LDAPEntry необходимо указать элемент орг. структуры LDAP

В поле LDAPFilter необходимо указать условие для формирования списка групп\пользователей

 

По нажатию на кнопку Find будет выполнен соответствующий поиск по дереву AD и результаты будут выведены в реестр ниже.

Прикрепленные файлы

Нравится

Поделиться

0 комментариев
Показать все комментарии

Добрый день,

 

Необходимо реализовать фильтрацию печатных форм в зависимости от выбранного значения справочника на странице. 

Переопределяя метод initCardPrintForms и в нем добавляя условия для выборки, в режиме отображения карточки все работает как надо.

​
var printFormsMenuCollection = resultCollection.filterByFn(function(item) {
    return item.get("ShowInCard") === true &&(this.getFilterForReportsOrBooleanValue(item));
}, this);
 
​
getFilterForReportsOrBooleanValue(item) {
		var value = this.get("NrbPurchaseMethod");
				switch(value.displayValue) {
					case "Аукцион":
							return	item.get("Caption") === "Извещение Аукцион" || 
									item.get("Caption") === "Документация Аукцион";
				default:
							return false;
		}
},

Но в комбинированном режиме почему-то вызывается опять же этот метод хотя для секции есть свой initSectionPrintForms, и в итоге загрузка страницы прекращается с ошибкой, из-за отсутствия полей.

Как правильно реализовать фильтрацию?

Нравится

1 комментарий

Павел, а в чём проблема, если в обоих случаях будет запускаться одна и та же функция с доработками?

И initCardPrintForms, и initSectionPrintForms применяются в BaseDataView, базовой странице раздела:

/**
 * Initializes print buttons menu.
 * @protected
 * @param {Function} callback Callback function.
 * @param {Object} scope Callback function scope.
 */
initPrintButtonsMenu: function(callback, scope) {
	this.initSectionPrintForms(this.initCardPrintForms, this);
	this.initModulePrintForms(callback, scope);
},

Там есть две кнопки печатных форм: одна — для раздельного режима, другая — для комбинированного:

{
	"operation": "insert",
	"name": "SeparateModeReportsButton",
	"parentName": "SeparateModeActionButtonsRightContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"caption": {"bindTo": "Resources.Strings.PrintButtonCaption"},
		"classes": {"wrapperClass": ["actions-button-margin-right"]},
		"controlConfig": {
			"menu": {"items": {"bindTo": "SectionPrintMenuItems"}},
			"visible": {"bindTo": "IsSectionPrintButtonVisible"}
		}
	}
},
...
{
	"operation": "insert",
	"name": "CombinedModePrintButton",
	"parentName": "CombinedModeActionButtonsCardRightContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"caption": {"bindTo": "Resources.Strings.PrintButtonCaption"},
		"classes": {"wrapperClass": ["actions-button-margin-right"]},
		"controlConfig": {"menu": {"items": {"bindTo": "CardPrintMenuItems"}}},
		"visible": {"bindTo": "IsCardPrintButtonVisible"}
	}
},

 

Показать все комментарии

Здравствуйте, 

Устал искать, инфоромации нигде не нашел.

Есть ли способ почистить этот фильтр от лишних полей, не использующихся в системе в целом, чтобы было удобнее пользоваться быстрым фильтром? 

Нашел в QuickFilterModuleV2 метод initCustomFilterConfig, в котором существует свойство allowedColumns, но если я туда что либо пишу, пропадают вообще все поля без исключения (пробовал писать как-то так:
this.filtersConfig.customFilterConfig.allowedColumns = ["Name", "Owner"];

Нигде использований не нашел. Может кто нибудь пользовался\знает?

Нравится

1 комментарий
Лучший ответ

Ответ оказался прост

Ответ оказался прост

Показать все комментарии

Добрый день.

 

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

Пример: Есть контакты, у них есть некий тип. И есть объект, скажем, "Разрешенные типы контактов". Нужно сделать выбор контактов по следующему условию: тип контакта присутствует в разрешенных (это легко), если разрешенные типы заполнены. Если не заполнены, то разрешен любой тип (вот это не понимаю как добавить в условие) 

Технически мне нужен фильтр на сущность Contact вида

Contact.Type in (AllowedTypes.Id) OR (NOT EXISTS (select * from AllowedTypes))

Проблема в том, что в куске после OR требуется фильтр, никак не связанный с Contact, а построитель путей к колонкам автоматически привязывает всё к корневой схеме.

Нравится

8 комментариев
Лучший ответ

Итак, я всё-таки решил эту интересную головоломку, оставлю ответ тут на случай если кто-то ещё столкнется с подобным.
Подсказку для начала решения нашел вот здесь - это помогло вспомнить, что для subfilter путь к колонке указывается относительно подсхемы вышестоящего фильтра, а не root-схемы всего запроса, то что нужно.
Однако, получается, что всё равно невозможно составить запрос именно в том виде, что я описал изначально, т.к. вышестоящий фильтр всё же должен быть как-то связан с root-схемой. Поэтому здесь мне пришлось немножко одурачить esq и подсунуть связь там, где её на самом деле нет. Это можно сделать с помощью двух вложенных  фильтров - notexists внутри exists, причем внешний exists должен иметь связь с root схемой и быть true всегда. Например, exists (наш статус в справочнике статусов)
Таким образом, изначальный запрос 

select * from Contact where Contact.StateId = @someState
or not exists (select Id from AllowedStates) /* вот эту часть в чистом виде записать на esq нельзя, нет связи с Contact*/

превращается в

select * from Contact where Contact.StateId = @someState 
or exists (select Id from State where State.Id = Contact.StateId /*вот она нужная связь*/ and not exists (select StateId from AllowedStates)) /* true только тогда, когда true нужный нам notexists.*/

или на js это выглядит примерно так (root-схема Contact, код не проверял, т.к. в оригинале объекты совсем другие и связи запутаннее)

var allowedStateFilterGroup = Ext.create("Terrasoft.FilterGroup");
allowedStateFilterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.OR;
var stateFilter = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
	"State", someState);	
var notExistsStateFilter = Terrasoft.createExistsFilter("[State:Id:State].Id");
notExistsStateFilter.subFilters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id", someState));
notExistsStateFilter.subFilters.addItem(Terrasoft.createNotExistsFilter("[AllowedStates:State].Id"));
allowedStateFilterGroup.add("StateFilter", stateFilter);
allowedStateFilterGroup.add("NotExistsStateFilter", notExistsStateFilter);

Esq вообще удивительно гибкая штука, стоит только заглянуть чуть глубже привычного createColumnFilterWithParameter.
Как я предполагал, всё что нужно делается прямо внутри функции filters, не нужны тут никакие view, ужас какой, не путайте людей.

Добрый день.

 

Вы можете реализовать проверку на заполненность таблицы "Разрешенные типы контактов" простым селектом к этой таблице.

 

А потом уже в зависимости от этого условия через if реализовать фильтрацию. Если в разрешенных типах есть записи, то включать первый фильтр тип контакта присутствует в разрешенных, если нет, то отключать.

А чтобы не делать проверку при каждом открытии карточки, можно создать системную настройку логического типа и синхронизировать её значение с этим справочником при добавлении или удалении оттуда. И в карточке ориентироваться на неё.

 

Виталий, а Вы случайно не стандартный механизм деактивации записи в справочнике изобрести пытаетесь?

Если одно или несколько значений справочника устарели и больше не используются, то такие значения можно деактивировать. Деактивированное значение не будет отображаться при выборе значений в справочных полях. При этом пользователи продолжат видеть это значение в тех записях, где оно было указано ранее, и смогут использовать его для фильтрации. По умолчанию возможность деактивировать значения справочника выключена. Разрешить деактивацию записей для нужного справочника можно в разделе [Конфигурация]. Подробнее о настройке читайте в статье “Деактивация записей объектов”.

 

Деактивированное значение справочника [Типы статей базы знаний]

section_lookups_deactivated_record_example.png

 

Коллеги, спасибо за ответы.

Алла, да, обходных путей я могу придумать множество, интересует как это реализовать именно в функции фильтра без предварительных доп. запросов в бд, уверен что это возможно.

Александр, нет, это не деактивация, на самом деле требуемая бизнес-логика сложнее моего примера, я привел максимально упрощенный пример как аналогию на ту часть, которую нужно реализовать. Список "разрешенных" записей разный для разных сущностей и варьируется в ходе заполнения карточки в зависимости от значений других полей. Поэтому интересует ответ именно на сформулированный вопрос.

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

 

Если условие фильтрации меняется уже при открытой карточке в зависимости от вводимых значений полей, то на ходу менять в базе только ради того чтобы в другом поле правильно обработал фильтр, тоже было бы неправильно (если я верно понял причину).

 

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

Виталий Жилин пишет:
да, обходных путей я могу придумать множество, интересует как это реализовать именно в функции фильтра без предварительных доп. запросов в бд, уверен что это возможно.

Некоторые задачи только и решаются обходными путями, но в Вашем варианте может быть иначе. 

 

Уверенна, дорогу осилит идущий...

О, в этой теме ещё через view не предлагали.

Зверев Александр,

Кстати, да, как вариант laugh

Итак, я всё-таки решил эту интересную головоломку, оставлю ответ тут на случай если кто-то ещё столкнется с подобным.
Подсказку для начала решения нашел вот здесь - это помогло вспомнить, что для subfilter путь к колонке указывается относительно подсхемы вышестоящего фильтра, а не root-схемы всего запроса, то что нужно.
Однако, получается, что всё равно невозможно составить запрос именно в том виде, что я описал изначально, т.к. вышестоящий фильтр всё же должен быть как-то связан с root-схемой. Поэтому здесь мне пришлось немножко одурачить esq и подсунуть связь там, где её на самом деле нет. Это можно сделать с помощью двух вложенных  фильтров - notexists внутри exists, причем внешний exists должен иметь связь с root схемой и быть true всегда. Например, exists (наш статус в справочнике статусов)
Таким образом, изначальный запрос 

select * from Contact where Contact.StateId = @someState
or not exists (select Id from AllowedStates) /* вот эту часть в чистом виде записать на esq нельзя, нет связи с Contact*/

превращается в

select * from Contact where Contact.StateId = @someState 
or exists (select Id from State where State.Id = Contact.StateId /*вот она нужная связь*/ and not exists (select StateId from AllowedStates)) /* true только тогда, когда true нужный нам notexists.*/

или на js это выглядит примерно так (root-схема Contact, код не проверял, т.к. в оригинале объекты совсем другие и связи запутаннее)

var allowedStateFilterGroup = Ext.create("Terrasoft.FilterGroup");
allowedStateFilterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.OR;
var stateFilter = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
	"State", someState);	
var notExistsStateFilter = Terrasoft.createExistsFilter("[State:Id:State].Id");
notExistsStateFilter.subFilters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id", someState));
notExistsStateFilter.subFilters.addItem(Terrasoft.createNotExistsFilter("[AllowedStates:State].Id"));
allowedStateFilterGroup.add("StateFilter", stateFilter);
allowedStateFilterGroup.add("NotExistsStateFilter", notExistsStateFilter);

Esq вообще удивительно гибкая штука, стоит только заглянуть чуть глубже привычного createColumnFilterWithParameter.
Как я предполагал, всё что нужно делается прямо внутри функции filters, не нужны тут никакие view, ужас какой, не путайте людей.

Показать все комментарии