Добрый день, уважаемые коллеги!

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

Рассматриваю применение 2-х вариантов:

Бизнес-правило 1: Фильтр записей Подразделений по признаку UsrProhibitSelectionAccount (см. ниже 1-й метод). Метод отрабатывает и при выборе отображает только то, что можно

Бизнес-правило 2: Выдавать сообщение пользователю, если выбранная ранее запись некорректна (см. ниже 2-й метод).  И вот тут почему-то в консоли видно, что не считывается корректно значение поля UsrProhibitSelectionAccount. Оно всегда false. Правда не во всех записях оно заполнено (см. скрин).

Помогите, пожалуйста, определить в чем некорректность 2-го метода. Благодарю за помощь

// Правило 1
/*Terrasoft.sdk.Model.addBusinessRule("Account", {
	ruleType: Terrasoft.RuleTypes.Filtration,
	position: 1,
	triggeredByColumns: ["UsrDepartment"],
	events: [Terrasoft.BusinessRuleEvents.ValueChanged,Terrasoft.BusinessRuleEvents.Load],
	 message: Terrasoft.LocalizableStrings.DepartmentMustBeAllowed,
	 filters: Ext.create("Terrasoft.Filter", {
        modelName: "UsrAccountDepartments",
        property: "UsrProhibitSelectionAccount",
        value: false
    })
});*/
 
// Правило 2
Terrasoft.sdk.Model.addBusinessRule("Account", {
	name: "AccountDepartmentMustBeAllowedRule",
	ruleType: Terrasoft.RuleTypes.Custom,
	triggeredByColumns: ["UsrDepartment"],
	events: [Terrasoft.BusinessRuleEvents.Load,
		Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
	executeFn: function(record, rule, column, customData, callbackConfig) {
		var AccountDepartment = record.get("UsrDepartment");
	var isValid = AccountDepartment.get("UsrProhibitSelectionAccount");
 
		record.changeProperty("UsrDepartment", {
			isValid: {
				value: isValid,
				message: Terrasoft.LocalizableStrings.DepartmentMustBeAllowed
			}
		});
		Ext.callback(callbackConfig.success, callbackConfig.scope, [isValid]);
	}
});

Изображение удалено.

Изображение удалено.

Нравится

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

Марина, а оно точно так должно синхронно читать из объекта справочника так, как у Вас?

В схеме MobileActivityOpportunityModelConfig значение Opportunity.Account читают с асинхронным вызовом так:

Terrasoft.sdk.Model.addBusinessRule("Activity", {
	name: "ActivityAccountOpportunityFiltrationRule",
	ruleType: Terrasoft.RuleTypes.Filtration,
	events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
	triggeredByColumns: ["Account"],
	filteredColumn: "Opportunity",
	filters: Ext.create("Terrasoft.Filter", {
		property: "Account"
	})
});
 
Terrasoft.sdk.Model.addBusinessRule("Activity", {
	name: "ActivityAccountByOpportunityRule",
	ruleType: Terrasoft.RuleTypes.Custom,
	triggeredByColumns: ["Opportunity"],
	events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save,
		Terrasoft.BusinessRuleEvents.Load],
	executeFn: function(record, rule, column, customData, callbackConfig) {
		var opportunityRecord = record.get("Opportunity");
		if (opportunityRecord) {
			var accountRecord = record.get("Account");
			if (!accountRecord) {
				var opportunityModel = Ext.ModelManager.getModel("Opportunity");
				opportunityModel.load(opportunityRecord.getId(), {
					isCancelable: false,
					queryConfig: Ext.create("Terrasoft.QueryConfig", {
						columns: ["Account"],
						modelName: "Opportunity"
					}),
					success: function(loadedRecord) {
						if (loadedRecord) {
							record.set("Account", loadedRecord.get("Account"), true);
						}
						Ext.callback(callbackConfig.success, callbackConfig.scope);
					},
					failure: function(record, operation) {
						var exception = operation.getError();
						Ext.callback(callbackConfig.failure, callbackConfig.scope, [exception]);
					},
					scope: this
				});
				return;
			}
		}
		Ext.callback(callbackConfig.success, callbackConfig.scope);
	},
	position: 1
});

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

Марина, а оно точно так должно синхронно читать из объекта справочника так, как у Вас?

В схеме MobileActivityOpportunityModelConfig значение Opportunity.Account читают с асинхронным вызовом так:

Terrasoft.sdk.Model.addBusinessRule("Activity", {
	name: "ActivityAccountOpportunityFiltrationRule",
	ruleType: Terrasoft.RuleTypes.Filtration,
	events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
	triggeredByColumns: ["Account"],
	filteredColumn: "Opportunity",
	filters: Ext.create("Terrasoft.Filter", {
		property: "Account"
	})
});
 
Terrasoft.sdk.Model.addBusinessRule("Activity", {
	name: "ActivityAccountByOpportunityRule",
	ruleType: Terrasoft.RuleTypes.Custom,
	triggeredByColumns: ["Opportunity"],
	events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save,
		Terrasoft.BusinessRuleEvents.Load],
	executeFn: function(record, rule, column, customData, callbackConfig) {
		var opportunityRecord = record.get("Opportunity");
		if (opportunityRecord) {
			var accountRecord = record.get("Account");
			if (!accountRecord) {
				var opportunityModel = Ext.ModelManager.getModel("Opportunity");
				opportunityModel.load(opportunityRecord.getId(), {
					isCancelable: false,
					queryConfig: Ext.create("Terrasoft.QueryConfig", {
						columns: ["Account"],
						modelName: "Opportunity"
					}),
					success: function(loadedRecord) {
						if (loadedRecord) {
							record.set("Account", loadedRecord.get("Account"), true);
						}
						Ext.callback(callbackConfig.success, callbackConfig.scope);
					},
					failure: function(record, operation) {
						var exception = operation.getError();
						Ext.callback(callbackConfig.failure, callbackConfig.scope, [exception]);
					},
					scope: this
				});
				return;
			}
		}
		Ext.callback(callbackConfig.success, callbackConfig.scope);
	},
	position: 1
});

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

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

 

Александр, большое спасибо за рекомендации. Да, видимо, я неверно читаю объект справочника. Надо попробовать разобраться с асинхронным вызовом. Спасибо за приведенный пример.

Заполнение колонки UsrProhibitSelectionAccount в локальной базе пока не помогло.

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

Добрый день . 

Я создал раздел для портальных пользователей.

Есть два поля , Заказчик и Орг.ДИИС.

Два поля основаны на встроенных справочниках в система  : Контакты и Контрагент.

Как через БП сделать так , что при выборе Заказчика , заполнялось поле Орг.ДИИС в соответствии с контрагентом к которому принадлежит  Заказчик ? 

Есть я так понимаю второй еще вариант это прибегнуть к разработке  но в ней я вообще не силен , да и в построении БП бывают трудности ) . 

Есть идеи  ? 

Нравится

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

Марк, с версии 7.16.2 это можно настроить на уровне бизнес-правил фильтрации:

Появилась возможность с помощью бизнес-правил настроить автоматическое заполнение и очистку значения в поле. Например, при создании бизнес-правила для фильтрации города по стране можно настроить, чтобы страна автоматически указывалась при выборе города, а поле [Город] очищалось при изменении страны.

business_rule.png

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

Добрый день, уважаемые коллеги!

Прошу оказать методическую помощь по правильным шагам при реализации нового бизнес-правила в мобильном приложении. Что имеется:

Задача - на страницу редактирования Активности в мобильном приложении добавить бизнес-правило (доступность). В какой схеме необходимо прописать новое бизнес-правило?

Есть образованные при настройке мастером мобильного приложения кастомные

MobileApplicationManifestFieldForceWorkplace и MobileActivityRecordPageSettingsFieldForceWorkplace.

Правильно ли я понимаю, что шаги должны быть следующие:

  1. Создать схему клиентского модуля, в которой прописать новое бизнес-правило. Схема должна расширить кастомную MobileActivityRecordPageSettingsFieldForceWorkplace? Как правильно связать новую схему с MobileActivityRecordPageSettingsFieldForceWorkplace?
  2. Подключить созданную схему модуля в манифесте мобильного приложения MobileApplicationManifestFieldForceWorkplace

И еще вопрос: в каком случае следует использовать классы бизнес-правил , а в каком пользовательские бизнес-правила.

Благодарю за помощь

Нравится

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

Вообще, бизнес-правила для разных разделов добавляют в схемы с названиями ...ModelConfig, вроде MobileActivityModelConfig. Например, в ней стандартно такое:

Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Requirement,
	triggeredByColumns: ['Number'],
	position: 0
});
 
Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Requirement,
	triggeredByColumns: ['CommunicationType'],
	position: 1
});
 
Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Filtration,
	triggeredByColumns: ['CommunicationType'],
	position: 2,
	filters: Ext.create('Terrasoft.Filter', {
		type: Terrasoft.FilterTypes.Group,
		subfilters: [
			Ext.create('Terrasoft.Filter', {
				property: 'UseforContacts',
				value: true
			}),
			Ext.create('Terrasoft.Filter', {
				property: 'Id',
				funcType: Terrasoft.FilterFunctions.NotIn,
				funcArgs: [Terrasoft.GUID.Twitter, Terrasoft.GUID.Facebook, Terrasoft.GUID.LinkedIn]
			})
		],
		name: 'a4265c53-b393-4e16-be5f-ee0e5a7faa8c'
	})
});

 

По базовым бизнес-правилам можно тут документацию с примерами почитать

https://academy.terrasoft.ru/documents/technic-sdkmob/7-16/biznes-pravila-mobilnogo-prilozheniya

А тут по кастомным

https://academy.terrasoft.ru/documents/technic-sdkmob/7-16/polzovatelskie-biznes-pravila-mobilnogo-prilozheniya

Базовые правила очень простые, и ничего особо сложного на них не сделаешь. Для сложной логики нужны уже пользовательские правила.

 

 

Бершеда Д. Н.,

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

Вообще, бизнес-правила для разных разделов добавляют в схемы с названиями ...ModelConfig, вроде MobileActivityModelConfig. Например, в ней стандартно такое:

Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Requirement,
	triggeredByColumns: ['Number'],
	position: 0
});
 
Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Requirement,
	triggeredByColumns: ['CommunicationType'],
	position: 1
});
 
Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Filtration,
	triggeredByColumns: ['CommunicationType'],
	position: 2,
	filters: Ext.create('Terrasoft.Filter', {
		type: Terrasoft.FilterTypes.Group,
		subfilters: [
			Ext.create('Terrasoft.Filter', {
				property: 'UseforContacts',
				value: true
			}),
			Ext.create('Terrasoft.Filter', {
				property: 'Id',
				funcType: Terrasoft.FilterFunctions.NotIn,
				funcArgs: [Terrasoft.GUID.Twitter, Terrasoft.GUID.Facebook, Terrasoft.GUID.LinkedIn]
			})
		],
		name: 'a4265c53-b393-4e16-be5f-ee0e5a7faa8c'
	})
});

 

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

 

Александр, спасибо за пояснения. Но никак не разберусь).

Имеется решение Sales Enterprise + Field Force. Цель изменить поведение стандартного бизнес-правила Активности заполнения Результата, применив сверху стандартного правила и внешнего пакета. Стандартное бизнес-правило прописано в MobileActivityModelConfig (пакет Mobile) - разрешать редактирование поля Result , если состояние активности имеет признак Конечное. Стандартное правило не именовано,т.е. просто отключить его нельзя

Есть FieldForceMobileActivityModelConfig (пакет FieldForceMobile), где изменяется стандартное бизнес-правило в отношении поля DetailedResult. 

Есть MobileApplicationManifestFieldForceWorkplace (пакет FieldMobile), где для модели Activity прописаны "ModelExtensions":

["MobileActivityModelConfig" (стандартные правила),

"FieldForceMobileActivityModelConfig" (добавленные правила внешнего пакета)]

Есть MobileApplicationManifestFieldForceWorkplace (пакет Custom), создан автоматически с признаком «замещать родителя» да.

Создаю свой модуль UsrFieldForceMobileActivityModelConfig, где прописываю свое бизнес-правило, и затем в MobileApplicationManifestFieldForceWorkplace (пакет Custom), добавляю в "ModelExtensions" свой модуль UsrFieldForceMobileActivityModelConfig

И никак не могу добиться работы своего бизнес-правила (либо работает стандартное, либо ничего не работает :)). Т.е. каким образом можно переопределить стандартное неименованное бизнес-правило на свое?

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

 

Благодарю за помощь) разобралась

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

Предоставить возможность в правилах фильтрации заполнять такие параметры как "autocomplete" и "autoСlean". Сейчас это никак не регулируется. Но при этом, если в сформированом коде прописать  еще одну строку, то начинает работать обратная фильтрация. Но если зайти в мастер, то мастер все сотрет (

"autocomplete": true,

 

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

Здравствуйте, Алексей!

Передали данное пожелание команде разработки для анализа возможности внедрения такой возможности в будущих версиях продукта.

Алексей, спасибо за идею! Ваша идея принята и в ближайших релизах будет реализована. 

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

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

Добрый вечер!

Вопрос по бизнес-правилам.

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

 

Имеется единый справочник тематик, из которого сотрудники выбирают необходимую по окончании общения в чатах и звонках.

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

Цель: сделать так, чтобы для чатов выпадал один список, а для звонков другой, используя один и тот же вышеуказанный справочник.

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

Нравится

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

Николай Ходаковский,

вы для чата указываете значение по умолчанию Чат. для звонка - звонок. Еще раз - на страницы для объектов чат и звонок вы добавляете справочное поле Тип(тот же самый справочник, что вы создали в справочнике Тематики) и для каждого раздела там устанавливаете свое значение по умолчанию. Значение по умолчанию вам нужно будет установить через конфигуратор в свойствах соответствующих объектов (чат и звонок). Понятно объяснил или где-то надо углубится?

Я может быть неправильно вас понял, но по моему ваша задача аналогична фильтру городов по странам. Т.е. в справочнике Тематики создаете поле Тип(Звонок, Чат) и в ваших страницах раздела помещаете этот справочник Тип(можно на страницу редактирования не выводить а просто добавить в объект с соответствующими значениями по умолчанию). Ну и дальше делаете для каждого раздела свое бизнес правило где фильтр справочника строится по значению Тип у раздела.

Сидоров Александр Валерьевич, спасибо за ответ. Значение по умолчанию — это интересная мысль.

Мы используем деталь с тематиками, благодаря чему сотрудник может выбрать несколько тематик в карточке чата. После чего в отдельной таблице собираются все выбранные тематики с указанием id чата/звонка.

Получается следующее, если я добавляю к своему справочнику Тип, то его надо будет всегда выбирать, чтобы подтянуть правильный список со справочника. Как можно сделать, чтобы система сама устанавливала нужный Тип при открытии карточки чата, например? Где задается это умолчание?

Николай Ходаковский,

вы для чата указываете значение по умолчанию Чат. для звонка - звонок. Еще раз - на страницы для объектов чат и звонок вы добавляете справочное поле Тип(тот же самый справочник, что вы создали в справочнике Тематики) и для каждого раздела там устанавливаете свое значение по умолчанию. Значение по умолчанию вам нужно будет установить через конфигуратор в свойствах соответствующих объектов (чат и звонок). Понятно объяснил или где-то надо углубится?

Сидоров Александр Валерьевич, уловил вашу мысль.

Все получилось, спасибо большое!

 

Решил вместо типа всё-таки использовать чекбоксы.

По вашему совету в объектах чатов и звонков создал чекбоксы, где выставил установил по умолчанию "true". Такие же логические чекбоксы сделал для справочника тематик (отдельно для чатов и звонков), где также по для нужных записей выставил 'true'.

Далее к детали тематик привязал правило по этим чекбоксам :)

 

Рад, что смог помочь! Велком)

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

Добрый день.

Правило которое должно сработать если в поле UsrLookupBR выбрано определённое значение. Только вот оно и игнорирует условие срабатывания и просто скрывает навсегда. 

   

Terrasoft.sdk.Model.addBusinessRule("Activity", {

    ruleType: Terrasoft.RuleTypes.Visibility,

    conditionalColumns: [

        {name: "UsrLookupBR", value:"E818A7C2-F351-41A6-A376-7F42762883F2"}

    ],

    triggeredByColumns: ["UsrLookupBR"],

    dependentColumnNames: ["UsrLookupDostup", "Owner"]

});

 

А вот если указать на предмет заполненности  поля    {name: "UsrLookupBR", value: null}, то правило чудесным образом срабатывает. 

Буду очень рад помощи. Заранее спасибо.

Нравится

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

Скорее всего, неправильно сделали сравнение с GUID в фильтре. Если посмотреть похожие случаи, там так:

Terrasoft.sdk.Model.addBusinessRule("KnowledgeBaseFile", {
	ruleType: Terrasoft.RuleTypes.Visibility,
	name: "KnowledgeBaseFileVisibleFileRule",
	conditionalColumns: [
		{name: "Type", value: Terrasoft.Configuration.FileTypeGUID.File}
	],
	events: [Terrasoft.BusinessRuleEvents.Load],
	dependentColumnNames: ["Data"]
});
Terrasoft.sdk.Model.addBusinessRule("KnowledgeBaseFile", {
	ruleType: Terrasoft.RuleTypes.Visibility,
	name: "KnowledgeBaseFileVisibleLinkRule",
	conditionalColumns: [
		{name: "Type", value: Terrasoft.Configuration.FileTypeGUID.Link}
	],
	events: [Terrasoft.BusinessRuleEvents.Load],
	dependentColumnNames: ["Name"]
});

Тут File и Link — две константы, заданные в MobileConstants:

Terrasoft.Configuration.FileTypeGUID = {
	File: "529bc2f8-0ee0-df11-971b-001d60e938c6",
	Link: "539bc2f8-0ee0-df11-971b-001d60e938c6",
	EntityLink: "549bc2f8-0ee0-df11-971b-001d60e938c6"
};

А, может, дело просто в верхнем регистре букв у Вас в константах?

Спасибо большое. Дело было в регистре.

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

Предложения:

1. Добавить в бизнес-правил страницы редактирования возможность создавать вложенные группы условий с возможностью выбора И / ИЛИ

2. Убрать возможность добавления действия по полю, если уже добавлено однотипное правило по этому полю, т.к. такие бизнес-правила не корректно накладываются друг на друга.

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

К сожалению, на данный момент так сделать сейчас нельзя. Сейчас ситуация такая:

1. В 1 бизнес-правиле задается только 1 условие фильтрации по 1 значению.

2. Если создать 2 бизнес-правила фильтрации одного и того же поля по разным условиям, то они будут применяться вместе по правилу "И".

Мы зафиксируем Ваше пожелание для возможной реализации в будущих версиях приложения.

 

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

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

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

Здравствуйте, Кирилл!

Передали данное пожелание команде разработки для анализа возможности внедрения такой возможности в будущих версиях продукта.

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

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

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

"Status": {
		"enabledStatusByUser": {
			"ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
			"property": BusinessRuleModule.enums.Property.ENABLED,
			"logical": Terrasoft.LogicalOperatorType.AND,
			"conditions": [
				{
					"comparisonType": Terrasoft.ComparisonType.EQUAL,
					"leftExpression": {
						"type": BusinessRuleModule.enums.ValueType.SYSVALUE,
						"attribute": "CURRENT_USER"
					},
					"rightExpression": {
						"type": BusinessRuleModule.enums.ValueType.CONSTANT,
						"value": "7f3b869f-34f3-4f20-ab4d-7480a5fdf647"
					}
				}
			]
		}
	}

 

Нравится

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

Добрый день!

Попробуйте такой код в условиях (conditions)

"conditions": [
	{
		"comparisonType": 3,
		"leftExpression": {
			"type": 3,
			"value": "CurrentUser",
			"dataValueType": 10
		},
		"rightExpression": {
			"type": 0,
			"value": "7f3b869f-34f3-4f20-ab4d-7480a5fdf647",
			"dataValueType": 10
		}
	}
]

 

Добрый день!

Попробуйте такой код в условиях (conditions)

"conditions": [
	{
		"comparisonType": 3,
		"leftExpression": {
			"type": 3,
			"value": "CurrentUser",
			"dataValueType": 10
		},
		"rightExpression": {
			"type": 0,
			"value": "7f3b869f-34f3-4f20-ab4d-7480a5fdf647",
			"dataValueType": 10
		}
	}
]

 

Сидоров Александр В.,

Спасибо, работает

Григорий Чех,

Вы имеете ввиду настроить администрирование по колонкам?

Для доступности для редактирования полей действительно было бы уместнее использовать не бизнес-правила, а права доступа на колонки. 

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

Спасибо за совет, буду иметь ввиду

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

Всем доброго времени суток!

Подскажите, есть ли возможность определить роли текущего пользователя в мобильном приложении? Если делать запрос то выдает ошибку - Uncaught Error: [ERROR][Ext.data.Store#setModel] Model with name "SysUserInRole" does not exist.

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

Кто нибудь сталкивался с похожими случаями?

Заранее благодарен!

Нравится

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

Мобильное приложение не загрузило метаданные модели SysUserInRole.

Добавьте в манифест вот такую секцию:

ApplicationRequiredModels: ["SysUserInRole"]

Кривонос Максим,

 Благодарю, сработало.

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