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

 attributes: {
                "Order": {
                    lookupListConfig: {
                        columns: [
                            "Account.SxNAVCode", "SxShippingType.Code",
                            "Owner.SxNAVCode","SxContract.SxNAVCode",
                            "Date","Account.SxCFO.Code","Account.Id","Account.SxTradeChain.SxNAVCode", "Account.SxTradeChain.SxCFO.Code"
                            ,"Account.SxSalesOutletType","SxPaymentFormula","SxPaymentFormula.SxPaymentDelay","SxWarehouse.SxCode"
                        ]
                    }
                },

.........................................
//в секции rules
 "SxDesiredDiscount": {
                    "BindParameterEnabledToPaymentDelay": {
                        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                        "property": BusinessRuleModule.enums.Property.ENABLED,
                        "conditions": [
                            {
                                "leftExpression": {
                                    "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                    "attribute": "Order.SxPaymentFormula.SxPaymentDelay"
                                    attributePath:""
                                },
                                "comparisonType": Terrasoft.ComparisonType.LESS,
                                "rightExpression": {
                                    "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                    "value": 45
                                }
                            }
                        ]
                    }
                },

в детали также добавлены колонки

getGridDataColumns: function() {
                var config = this.callParent(arguments);
                config["Order.Account"]= { path: "Order.Account" };
                config["Order.Date"]= { path: "Order.Date" };
                config["Order.SxPaymentFormula"]= { path: "Order.SxPaymentFormula" };
                config["Order.SxPaymentFormula.SxPaymentDelay"]= { path: "Order.SxPaymentFormula.SxPaymentDelay" };
                config["Order.Account.SxSalesOutletType"]= { path: "Order.Account.SxSalesOutletType" };
                return config;
            }

Проблема в том, что при добавлении требуемое значение при добавлении можно получить как:
this.get("Order")["SxPaymentFormula.SxPaymentDelay"]
а при изменении:
this.get("Order.SxPaymentFormula.SxPaymentDelay"));

Следовательно есть разница в работе правил.

Подскажите пожалуйста, как решить данную проблему? Как верно сформировать конфиг, чтоб он всегда был одинаковым?

Нравится

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

Александр, добрый день!

Попробуйте в leftExpression указать параметры attribute и attributePath так:

"attribute": "Order",
"attributePath":"SxPaymentFormula.SxPaymentDelay"

Я таким образом сразу пробовал. Не помогло. Все равно работает или при добавлении или при изменении.

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

initEntity: function(callback, scope) {
	this.callParent([function() {
		if (!this.get("Order.SxPaymentFormula.SxPaymentDelay")) {
			this.set("Order.SxPaymentFormula.SxPaymentDelay",
				this.get("Order") && this.get("Order")["SxPaymentFormula.SxPaymentDelay"]);
		}
		callback.call(scope || this);
	}, this]);
}

В бизнес-правиле в этом случае необходимо использовать только "attribute": "Order.SxPaymentFormula.SxPaymentDelay".

Олег, работает.
Спасибо за помощь!

Подскажите пожалуйста, пытаюсь добавить фильтрацию, одного поля по значению другого, в редактируемом реестре. - http://www.community.terrasoft.ru/forum/topic/15497

Тут рассматриваеться BINDPARAMETER, возможна ли работа правила FILTRATION?

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

Сергей, спасибо - после вашего комментария все встало на свои места, был не в курсе что нужна страница редактирования, делал напрямую в схеме детали с редактируемым реестром.

подскажите, пожалуйста, как фильтровать значение поля детали по значению поля объекта, в котором деталь. У меня в продажах есть деталь Доп.соглашения,в которой есть поле-ссылка на Договор. Мне нужно фильтровать договора по полю Контрагент - показывать только те договора, которые принадлежат контрагенту текущей продажи.
Я создала карточку редактирования, прописала в ней бизнес правило со ссылкой на атрибут AccountId. Но не могу определить, когда заполнять этот атрибут. в момент, когда срабатывает initEntity в самой сущности Доп.соглашение еще не заполнено поле Продажа. а методы init, onEntityInizialized не срабатывают
Есть какой-то вариант, как я могу получить id текущей сущности(продажи), в которой находится деталь, из карточки редактирования детали (не из схемы детали, а из карточки)?

Добрый день, Любовь.

Насколько я понял Ваш кейс, вы пытаетесь добавить деталь, объект которой - Договор. Достаточно будет связать данную деталь с карточкой следующим образом - объект детали AccountId = объекта карточки AccountId.
Если же Вы пытаетесь добавить деталь, объект которой кастомный, и в нем просто присутствует поле Договор, то реализовать такую логику не получится. Действительно, init/onEntityInizialized при загрузке детали не срабатывают, они отработают только если Вы откроете объект детали на редактирование.

"Мотков Илья" написал:Если же Вы пытаетесь добавить деталь, объект которой кастомный, и в нем просто присутствует поле Договор, то реализовать такую логику не получится. Действительно, init/onEntityInizialized при загрузке детали не срабатывают, они отработают только если Вы откроете объект детали на редактирование.

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

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

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

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