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

В описании (которого почему-то не нашел в оглавлении) http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/MobileAppli...
для секции ModelDataImportConfig есть пример с макросом. А возможно ли сделать зависимость от какого-то поля контакта пользователя?

Например у Активности есть поле Участок (справочник) и у Контакта есть такое поле Участок. Нужно чтобы Активность загружалась если её участок совпадает с участком указанным в Активности

Нравится

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

Здравствуйте.
Вы пишите "Нужно чтобы Активность загружалась если её участок совпадает с участком указанным в Активности" - это как понимать?
Опишите пожалуйста детальней - что ожидается увидеть на выходе. какой бизнес-кейс решается?

Есть Пользователь П1 (торговый представитель), с ним связан Контакт К1, у которого есть кастомное поле Участок (типа справочник) со значением У1. Есть задачки (простите Активности!) З1, З2, ...., З99999, у которых кроме всего прочего так же есть кастомное поле Участок из того же справочника. Так вот если нет надобности грузить 99999 задачек, а только те у которых поля Участок совпадают с одноименным полем Контакта, то как построить данный фильтр типа Пользователь.Контакт.Участок = Задачка.Участок.

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

В етом случае Вас тоит вносить код в секцию ModelDataImportConfig Манифеста мобильного приложения.

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

ModelDataImportConfig: [
// Конфигурирование модели Activity.
{
Name: 'Activity',
SyncFilter: {
type: 'Terrasoft.FilterTypes.Group',
logicalOperation: 'Terrasoft.FilterLogicalOperations.Or',
subfilters: [
{
property: 'Participant',
modelName: 'ActivityParticipant',
assocProperty: 'Activity',
operation: 'Terrasoft.FilterOperations.Any',
valueIsMacros: true,
value: 'Terrasoft.ValueMacros.CurrentUserContact'
}
]
},
SyncColumns: ['Title', 'StartDate', 'DueDate', 'Status', 'Result', 'DetailedResult', 'ActivityCategory', 'Priority', 'Owner', 'Account', 'Contact',
'Lead', 'Opportunity', 'ShowInScheduler', 'Author', 'Type'
]
},

"Клименко Николай" написал:загружаются только те активности, у которых участником является текущий пользователь.

так ведь нет участников :smile: есть УЧАСТОК

Предоставленый код является примером реализации.
По аналогии, Вы можете настроить свою фильтрацию.

"Клименко Николай" написал:

Предоставленый код является примером реализации.

По аналогии, Вы можете настроить свою фильтрацию.


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

Нужно понимание как сделать фильтры по полям и в левой и в правой части выражения сравнения, что-то типа (ActivityAccount - деталь Контрагенты в Активностях):

ModelDataImportConfig: [
        // Конфигурирование модели Activity.
        {
            Name: 'ActivityAccount',
            SyncFilter: {
                type: 'Terrasoft.FilterTypes.Group',
                logicalOperation: 'Terrasoft.FilterLogicalOperations.Or',
                subfilters: [
                    {
                        property: 'PartOf',
                        valueIsMacros: true,
                        value: 'Terrasoft.ValueMacros.CurrentUserContact.PartOf'
                    }
                ]
            },    

В Вашем случае необходимо применить вариант решения с использоваием view

1. Создать View (например VwActivityAreaByContactArea) с колонками Активности и Контакта

2. Добавить в конфигурацию скрипт (Подразумевается колонка Участок = Area) и установить
------------------------------------------------------------------------
IF EXISTS (SELECT 1 FROM sys.views WHERE name = 'VwActivityAreaByContactArea')
DROP VIEW dbo.VwActivityAreaByContactArea
go
------------------------------------------------------------------------
CREATE VIEW dbo.VwActivityAreaByContactArea AS
SELECT
a.Id,
a.CreatedOn,
a.CreatedById,
a.ModifiedOn,
a.ModifiedById,
a.ProcessListeners,
a.Id as ActivityId,
c.Id as ContactId
FROM Activity a
JOIN Contact c ON c.Area = a.Area
Where c.Area <> ''

3. В манифесте добавить фильтрацию
"ModelDataImportConfig": [
{
"Name": "Activity",
"SyncFilter": {
"type": 'Terrasoft.FilterTypes.Group',
"logicalOperation": 'Terrasoft.FilterLogicalOperations.And',
"subfilters": [
{
"property": 'Participant',
"modelName": 'ActivityParticipant',
"assocProperty": 'Activity',
"operation": 'Terrasoft.FilterOperations.Any',
"valueIsMacros": true,
"value": 'Terrasoft.ValueMacros.CurrentUserContact'
},
{
"property": "Contact",
"modelName": "VwActivityAreaByContactArea",
"assocProperty": "Activity",
"operation": 'Terrasoft.FilterOperations.Any',
"valueIsMacros": true,
"value": "Terrasoft.ValueMacros.CurrentUserContact"
}
]
}
},
{
"Name": "VwActivityAreaByContactArea",
"SyncFilter": {
"property": "Contact",
"valueIsMacros": true,
"value": "Terrasoft.ValueMacros.CurrentUserContact"
}
}
]
И указать модель View

"Models": {
"Activity": {
"Grid": "MobileActivityGridPage",
"Preview": "MobileActivityPreviewPage",
"Edit": "MobileActivityEditPage",
"RequireLookupColumnsModels": true,
"RequiredModels": [

"VwActivityAreaByContactArea"
]
}

"Клименко Николай" написал:В Вашем случае необходимо применить вариант решения с использоваием view

Николай, спасибо большое! Всё гениальное... не так то и просто :sad:

Извините за некропостинг, но может найдется кто, чтобы немного мне объяснить.
Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".
Добавляю в манифест фильтр:

"SyncFilter": {
					"property": "Status",
// Название модели, для которой выполняется фильтрация.
					//"modelName": "Case",
// Колонка связанной модели, по которой осуществляется связь с основной моделью.
					//"assocProperty": "Id",
					//"operation": "Terrasoft.FilterOperations.Any",
					"compareType": "Terrasoft.ComparisonType.NotEqual",
					//"value": {
						//"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",
						//"displayValue": "Закрыт"}
                                        "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
				},

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

"SyncFilter": {
					"type:" "Terrasoft.FilterTypes.Simple",
					"property": "SolutionOverdue",
					"compareType": "Terrasoft.ComparisonType.Equal",
					"value": true
				},

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

Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.

"Михайловский Илья Викторович" написал:

Извините за некропостинг, но может найдется кто, чтобы немного мне объяснить.

Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".

Добавляю в манифест фильтр:

"SyncFilter": {

                                        "property": "Status",

// Название модели, для которой выполняется фильтрация.

                                        //"modelName": "Case",

// Колонка связанной модели, по которой осуществляется связь с основной моделью.

                                        //"assocProperty": "Id",

                                        //"operation": "Terrasoft.FilterOperations.Any",

                                        "compareType": "Terrasoft.ComparisonType.NotEqual",

                                        //"value": {

                                                //"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",

                                                //"displayValue": "Закрыт"}

                                        "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"

                                },

Пробовал и так и сяк, при синхронизации в мобиле выдает ошибку.

Пробовал еще такой фильтр:

"SyncFilter": {

                                        "type:" "Terrasoft.FilterTypes.Simple",

                                        "property": "SolutionOverdue",

                                        "compareType": "Terrasoft.ComparisonType.Equal",

                                        "value": true

                                },

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

Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.

Добрый день, Илья!
Примеры описаны для версии 7.6.
Уточните, пожалуйста, версию системы и мобильного приложения.

"Вильшанский Дмитрий" написал:
Михайловский Илья Викторович пишет:

Извините за некропостинг, но может найдется кто, чтобы немного мне объяснить.

Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".

Добавляю в манифест фильтр:

"SyncFilter": {

                                        "property": "Status",

// Название модели, для которой выполняется фильтрация.

                                        //"modelName": "Case",

// Колонка связанной модели, по которой осуществляется связь с основной моделью.

                                        //"assocProperty": "Id",

                                        //"operation": "Terrasoft.FilterOperations.Any",

                                        "compareType": "Terrasoft.ComparisonType.NotEqual",

                                        //"value": {

                                                //"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",

                                                //"displayValue": "Закрыт"}

                                        "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"

                                },

Пробовал и так и сяк, при синхронизации в мобиле выдает ошибку.

Пробовал еще такой фильтр:

"SyncFilter": {

                                        "type:" "Terrasoft.FilterTypes.Simple",

                                        "property": "SolutionOverdue",

                                        "compareType": "Terrasoft.ComparisonType.Equal",

                                        "value": true

                                },

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

Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.

Добрый день, Илья!

Примеры описаны для версии 7.6.

Уточните, пожалуйста, версию системы и мобильного приложения.

7.8
Я уже сделал, но через модуль, создал с именем UsrMobileCaseModelConfig со след кодом:

Terrasoft.sdk.Module.addFilter("Case", Ext.create("Terrasoft.Filter", {
	name: "CaseCustomFilter",
	type: "Terrasoft.FilterTypes.Group",
	subfilters: [
//Не закрытый статус
		Ext.create("Terrasoft.Filter", {
			name: "CaseStatusFilterValue",
			property: "Status",
			compareType: Terrasoft.ComparisonTypes.NotEqual,
			value: "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
		}),
//Ответственный - текущий пользователь
		Ext.create("Terrasoft.Filter", {
			name: "CaseOwnerFilterValue",
			property: "Status",
			compareType: Terrasoft.ComparisonTypes.Equal,
			valueIsMacros: true,
			value: "Terrasoft.ValueMacros.CurrentUserContact"
		}),
//Не отменен статус
		Ext.create("Terrasoft.Filter", {
			name: "CaseStatusFilterValue",
			property: "Status",
			compareType: Terrasoft.ComparisonTypes.NotEqual,
			value: "6e5f4218-f46b-1410-fe9a-0050ba5d6c38"
		})
	]
}));

И затем в манифесте в PageExists подключил этот модуль, и все заработало.

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