Бизнес-правила мобильного приложения. Булево значение для фильтра
Добрый день, уважаемые коллеги!
Есть задача в мобильном приложении (уже давно функционирующем) изменить на карточке Контрагента логику поля Подразделение . В справочнике Подразделений добавлено булево поле 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]); } });
Нравится
Марина, а оно точно так должно синхронно читать из объекта справочника так, как у Вас?
В схеме 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 в локальной базе пока не помогло.