Добрый день, коллеги. Прошу помочь... Одно правило последнее перекрывает первое. И последнее работает, а первое нет. 

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

 

 

Terrasoft.sdk.Model.addBusinessRule("Activity", {
    ruleType: Terrasoft.RuleTypes.Visibility,
    conditionalColumns: [
        {name: "UsrLookupBR", value:"b14640eb-8b89-4fe9-8b00-a51b61ff9430"}
    ],
    triggeredByColumns: ["UsrLookupBR"],
    dependentColumnNames: ["UsrLookupDostup"]
});

Terrasoft.sdk.Model.addBusinessRule("Activity", {
    ruleType: Terrasoft.RuleTypes.Visibility,
    conditionalColumns: [
        {name: "UsrLookupBR", value:"e818a7c2-f351-41a6-a376-7f42762883f2"}
    ],
    triggeredByColumns: ["UsrLookupBR"],
    dependentColumnNames: ["UsrLookupDostup"]
});

Нравится

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

Насколько понимаю, в MobileKnowledgeBaseFileModelConfig именно так и сделано, два правила по двум константам меняют видимость одного поля:

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"]
});
Terrasoft.sdk.Model.addBusinessRule("KnowledgeBaseFile", {
	ruleType: Terrasoft.RuleTypes.Visibility,
	name: "KnowledgeBaseFileVisibleKnowledgeBaseLinkRule",
	conditionalColumns: [
		{name: "Type", value: Terrasoft.Configuration.FileTypeGUID.KnowledgeBaseLink}
	],
	events: [Terrasoft.BusinessRuleEvents.Load],
	dependentColumnNames: ["Name"]
});

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

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

Добрый день, коллеги!
Есть задача написать бизнес правило для страницы обращения портальных пользователей. Т.е. если мы заходим по пользователем портала с типом контакта Клиент, то пользователь видит колонку Конфигурационные единицы. Если заходим по пользователем портала с типом контакта Сотрудник, то нет. Вопрос: как мне с помощью бизнес правила в 7.10 извлечь контакт текущего пользователя и отфильтровать его по типу контакта?

Нравится

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

Добрый день, Елена!

Можете поступить следующим образом - сравнивать значение системной переменной CURRENT_USER_CONTACT.TypeId с необходимым айдишником типа пользователя. Их можно найти в таблице ContactType.

Илья,

"Мотков Илья" написал:CURRENT_USER_CONTACT.TypeId

Захожу под портальным пользователем, на странице портального обращения сделал вывод в консоли:

console.log(Terrasoft.SysValue.CURRENT_USER_CONTACT);

выводится:

Object {primaryImageValue: "00000000-0000-0000-0000-000000000000", value: "fc5a908f-b121-4538-8e87-0bf92b5be23c", displayValue: "Погорелов Геннадий"}

Типа тут нет. Более того, если я попробую сделать запрос по id данных контакта:

var currentUser = Terrasoft.SysValue.CURRENT_USER_CONTACT.value;
				var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
				    rootSchemaName: "Contact"
				});
 
				esq.addColumn("Type");
 
				esq.getEntity(currentUser, function(result) {
				    if (!result.success) {
				        console.log("Ошибка запроса данных");
				        return;
				    }
				    console.log(result)
				    console.log(result.entity.get("Type"));
				}, this);

В консоли выводится null.

Так как получить данные о типе пользователя?

Денис, добрый день.

Прошу извинить, действительно, дезинформировал. Тогда все же прийдется выполнять esq, допустим, в init`e, заносить полученное значение в аттрибут и сравнивать уже его. NULL вы получили по той причине, что колонка называется TypeId.

Илья,

"Мотков Илья" написал:колонка называется TypeId.

Колонка в Contact именно Type. TypeId - такой колонки нет. Если попробовать задать, то result.entity.get вообще выдаёт ошибку.

Object {success: true, entity: null} - вот так выглядит вывод данных по запросу. То есть явно дело не в пустых колонках.

Денис, рекомендую все же посмотреть напрямую в БД, заполнено ли это поле. Вот пример из коробки, модуль CtiPanelIdentificationUtilities:
filterGroup.add("IsEmployeeType", Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "Contact.Type", ConfigurationConstants.ContactType.Employee));

Вопрос был про 7.10, там точно эта колонка используется.

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

Всем привет!
В карточке договора у меня есть поле выбора контраента. Хочу в списке для выбора показывать не
всех контрагентов, а только, принадлежащих одной заранее определенной отрасли.
Создал замещающий объект, добавил бизнес-правило:

rules: {
          "UsrOSAGOPolicyEnsCompany": {
            "FiltrationEnsCompanyByIndustry": {
              "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
              "autocomplete": false,
              "baseAttributePath": "Industry",
              "comparisonType": this.Terrasoft.ComparisonType.EQUAL,
              "type": BusinessRuleModule.enums.ValueType.CONSTANT,
              "value": "ffbf1e56-f36b-1410-c493-00155d043205"
          }
  }
}

Проверяю. Правило не работает (пустой список). В консоли браузера обнаружил сообщение об ошибке:

POST https://myhost/1/DataService/json/SyncReply/SelectQuery 500 (ArgumentNullOrEmptyException)

При выполнении запроса возникла ошибка
        статус ответа: 500 (ArgumentNullOrEmptyException)
        url запроса: ../DataService/json/SyncReply/SelectQuery
        метод: POST
        данные запроса: {"rootSchemaName":"Account","operationType":0,"filters":{"items":{"searchFilter":{"items":{"94caf548-a573-4404-84df-4e20f3ae94cd":{"items":{"undefined...
       
Uncaught Значение аргумента "columnPath" не может быть пустым или неопределенным

Где допустил ошибку?

Нравится

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

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

Вы некорректно используете бизнес правила. Ваш код должен быть приблизительно следующим:

rules: {
                "UsrOSAGOPolicyEnsCompany": {
                    FiltrationEnsCompanyByIndustry: { 
                        ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
                        autocomplete: true,
                        autoClean: true,
                        baseAttributePatch: "Industry",
                        comparisonType: Terrasoft.ComparisonType.EQUAL,
                        type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                        attribute: "Id"
                    }

В случае использования этого кода, значение поля Industry объекта UsrOSAGOPolicyEnsCompany будет сравниваться с значением поля Id объекта Industry.

Более подробно об использовании бизнес правил Вы можете прочитать здесь.

"Демьяник Алексей Олегович" написал:
В случае использования этого кода, значение поля Industry объекта UsrOSAGOPolicyEnsCompany будет сравниваться с значением поля Id объекта Industry.

Дело в том, что мне не нужен биндинг к объекту Industry. Мне просто нужно сделать доступными для выбора только записи с определенным значениемм поля IndustryId.

Попробуйте сделать так:

rules: {
          "UsrOSAGOPolicyEnsCompany": {
            FiltrationEnsCompanyByIndustry: {
              ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
              autocomplete: false,
              baseAttributePatсh: "Industry", /*здесь пропущена буква*/
              comparisonType: this.Terrasoft.ComparisonType.EQUAL,
              type: BusinessRuleModule.enums.ValueType.CONSTANT,
              value: "ffbf1e56-f36b-1410-c493-00155d043205"
          }
  }
}

Точно!
Алексей, спасибо большое! Теперь все получилось (ох, уж эти опечатки) :)

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

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

 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 при загрузке детали не срабатывают, они отработают только если Вы откроете объект детали на редактирование.

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

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

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

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