Возникла задача:

Необходимо установить признак обязательности поля UsrDeviationReason, если даты UsrDatePlan и UsrDateActual не равны друг другу и UsrDateActual заполнена:

Написали правило:

"UsrDeviationReason":{
        "BindParameterRequiredDeviationReason": {
        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
        "property": BusinessRuleModule.enums.Property.REQUIRED,
        "logical": Terrasoft.LogicalOperatorType.AND,
        "conditions": [
                {
                        "leftExpression": {
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                "attribute": "UsrDatePlan"
                        },
                        "comparisonType": Terrasoft.ComparisonType.NOT_EQUAL,
                        "rightExpression": {
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                "attribute": "UsrDateActual"
                        }
                },
                {
                        "leftExpression": {
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                "attribute": "UsrDateActual"
                        },
                        "comparisonType": Terrasoft.ComparisonType.IS_NOT_NULL
                }
        ]
}

В итоге два вопроса:
1) По UsrDateActual IS_NOT_NULL работает (т.е., если поле UsrDateActual не заполнено, то признак обязательности не появляется).
Но при равенстве UsrDatePlan и UsrDateActual признак обязательности всё равно остаётся. Что указано не так?
2) Даже если признак обязательности исчезает, всё равно остаётся подсказка заполнить это поле и никак не исчезает.

Спасибо за помощь!

Нравится

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

Может, конечно, я тупость скажу, но условие "не равно" вроде бы без нижнего подчеркивания, просто NotEqual.
Информацию брал отсюда https://www.bpmonline.com/bpmonlinesdken/Terrasoft.Core~Terrasoft.Core…

Хотя и IsNotNull там тоже без нижних подчеркиваний написано, но у вас работает.

Владимир, добрый день!

Как вариант, данное поведение может возникать если у двух дат, с которыми происходит сравнение, разница, например, в миллисекундах. В приложении есть особенность, что даже если разница составляет миллисекунды, то приложение эти значения считает разными.
Проверьте, чтобы даты были абсолютно идентичными.

"Демьяник Алексей Олегович" написал:Проверьте, чтобы даты были абсолютно идентичными

Формат полей date, а не datetime, и в них нет времени.

"Сазанов Александр Владимирович" написал:Хотя и IsNotNull там тоже без нижних подчеркиваний написано, но у вас работает.

В логике карточек вижу, что с подчеркиваниями. и NOT_EQUAL тоже видел. А в процессах, кажется, без подчеркивания.

Владимир, добрый день!

Типы сравнений EQUAL и NOT_EQUAL не совсем корректно работают в случае сравнения дат, поскольку в JavaScript даты являются объектами, а два объекта никогда не будут равными друг другу, если это не один и тот же объект.

Рекомендую для изменения обязательности поля использовать не бизнес-правило, а создать отдельное свойство модели, значение которого связать с атрибутом isRequired нужного поля в блоке diff:

{
	"operation": "insert",
	"parentName": "Header",
	"propertyName": "items",
	"name": "UsrDeviationReason",
	"values": {
		"layout": {"column": 12, "row": 0},
		"isRequired": {"bindTo": "IsUsrDeviationReasonRequired"}
	}
}

Инициализировать это свойство можно при инициализации страницы, а также при изменении полей плановой и фактической даты.

Поделюсь результатом:

IsUsrDeviationReasonRequired: function(columnName) {
	var endDate = this.get("EndDate");
	var deadline = this.get("Deadline");
	var isRequired = false;
	if ((endDate) && (deadline)) {
		isRequired = (endDate.toDateString() !== deadline.toDateString());
	}
	var column = this.columns[columnName];
	if (column) {
		column.isRequired = isRequired;
		this.validateColumn(columnName);
	}
	return isRequired;
}
Показать все комментарии

Здравствуйте!
Есть проблема со свойством isRequired.
При установке значения isRequired: true система отображает * возле поля, но позволяет сохранить карточку с пустым значением (свойство обязательности не срабатывает)
При использовании бизнес-правил все работает корректно.

Тестировалось на релизах BPMOnline Sales 7.4
Omnichannel, Версия 7.4.0.2924
Team, Версия 7.4.0.2628

Нравится

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

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

Здравствуйте, Александр!
Ошибку не удалось воспроизвести.
Пожалуйста, уточните тип поля, для которого устанавливается обязательность, а также приведите фрагмент кода, где это происходит.
Спасибо!

Здравствуйте, Александр!
Ошибку не удалось воспроизвести.
Пожалуйста, уточните тип поля, для которого устанавливается обязательность, а также приведите фрагмент кода, где это происходит.
Спасибо!

Используется справочное поле(обязательно для заполнения по условию) и метод setSxAffiliateTransVisible для установки свойства обязательности
Также пробовал привязать в булевому полю.
Результат одинаковый: Звездочка возле обязательного поля появляется, но карточку можно сохранить не заполнив его.

define('SxServicePage', ['GeneralDetails','terrasoft','Constants','BusinessRuleModule'],
function(GeneralDetails,Terrasoft,Constants,BusinessRuleModule) {
	return {
		entitySchemaName: 'SxService',
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "SxType",
					"values": {
						"layout": {
							"column": 12,
							"row": 0,
							"colSpan": 12,
							"rowSpan": 1
						},
						"contentType": 3
					},
					"parentName": "Header",
					"propertyName": "items"
				},
				{
					"operation": "insert",
					"name": "SxAffiliateTransp",
					"values": {
						"layout": {
							"column": 12,
							"row": 2,
							"colSpan": 12,
							"rowSpan": 1
						},
						"visible": {"bindTo":"IsSxAffiliateTransVisible"},
						"isRequired": {"bindTo":"IsSxAffiliateTransVisible"}
						//"isRequired": true // тоже не работает
					},
					"parentName": "Header",
					"propertyName": "items"
				}
			]/**SCHEMA_DIFF*/,
		attributes: {
			/*
			 * Зависимость поля Филиал* от поля тип.
			 * Скрытие по условию. Для тип=Транспортировка
			 * */
			"SxType": {
				dependencies: [
					{
						columns: ["SxType"],
						methodName: "setSxAffiliateTransVisible"
					}
				]
			}
		},
		methods: {
			setSxAffiliateTransVisible:function () {
				var type= this.get("SxType");
				if (type!=undefined && type.value==Constants.ServiceType.Transportation) {
					this.set("IsSxAffiliateTransVisible",true);
 
				}
				else {
					this.set("IsSxAffiliateTransVisible",false);
					this.set("SxAffiliateTransp", null);
				}
			}
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.setSxAffiliateTransVisible();
			}
		},
		rules: {
//C ДАННЫМ ПРАВИЛОМ РАБОТАЕТ КОРРЕКТНО
			/*"SxAffiliateTransp":{
				"BindParameterRequiredSxAffiliateTranspToSxType": {
					ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
					property: BusinessRuleModule.enums.Property.REQUIRED,
					conditions: [
						{
							"leftExpression": {
								"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
								"attribute": "SxType"//,
								//"attributePath": "Finish"
							},
							"comparisonType": Terrasoft.ComparisonType.EQUAL,
							"rightExpression": {
								"type": BusinessRuleModule.enums.ValueType.CONSTANT,
								"value": Constants.ServiceType.Transportation
							}
						}
					]
				}
			}*/
		},
		userCode: {}
	};
});

Александр, неправильно делаете. Нужно это свойство задавать атрибуту, к которому привязан контрол, а не контролу. Вот так:

attributes: {
//...
	"SxAffiliateTransp": {
		"isRequired": {"bindTo":"IsSxAffiliateTransVisible"}	
	}
}

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

Попробовал, работает не так (BPM 7.5 off-site) - если поле уже обязательное по условию, и условие меняется так, что функция возвращает false, то пропадает только красненький текст валидации, а само поле продолжает вести себя как обязательное.. т.е. сильно просит заполнить себя....

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

Вот такой код

Page.SomeEdit.Required = Page.DataSource.ActiveRow.GetTypedColumnValuebool>("SomeOtherField");

размещенный на PageLoadComplete успешно делает поле обязательным либо нет при открытии карточки.
А вот если разместить его в скрипте вызываемом по событию OnChange нужного поля - не срабатывает. То есть SomeEdit не становится "красным" и не становится обязательным динамически.
Что я делаю не так? Похоже нужно дописать что-то еще...

Нравится

3 комментария
Page.SomeEdit.SetRequired(Page.DataSource.ActiveRow.GetTypedColumnValue<bool>("SomeOtherField"));

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

О как. Пригодится, как раз вчера думал какого

Page.SomeEdit.Required = false;

не отрабатывает в скрипте на изменение поля.
:smile:

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