Всем доброго времени! Есть вопрос на примере простенького процесса:

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

 

Если пользователь выбирает вариант:

"Отлично" - шаг должен завершится без обязательного заполнения поля "комментарий".

"Плохо" - шаг должен завершится с обязательным заполнением поля "комментарий".

 

Как проще реализовать проверку факта заполнения поля в зависимости от нажатой кнопки?

 

Нравится

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

Сделайте поле "Комментарий" обязательным

И при кнопке "Хорошо" уберите проверку обязательности

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сделайте поле "Комментарий" обязательным

И при кнопке "Хорошо" уберите проверку обязательности

t.ponomarov,

спасибо, этот вариант не хотел использовать чтобы не "отлучать" пользователя от информации на главной странице.

Владимир Соколов,

спасибо, как то не сообразил за эту функцию. 

 

Если в один элемент, то только через преднастроенную страницу.

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

Создана преднастроенная страница.

При открытии два обязательных поля

Проблема. Обязательность первого поля не работает. Система позволяет сохранить данные с незаполненным полемИзображение удалено.

В конфигурации страницы добавлен признак обязательности

Так же на атрибут повешен признак isRequired: true

Однако это не дает ровным счетом ничего

Так же, ни последующая валидация при сохранении, ни правила не помогли

Если кто сталкивался с подобным, подскажите как выходили из ситуации

Спасибо

 

Нравится

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

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

Подробнее почитайте о пользовательской функциональности настройки бизнес-правил и настройке бизнес-правил в схемах в конфигурации.

Алла Савельева, Пробовал бизнес-правила. Не помогло.

Спасибо

Дубов Андрей Владимирович,

Приведите пример Вашего кода

Без изучения кода карточки сложно сказать.

Как обходной вариант, на уровне БП проверять значение, если пусто, показывать сообщение и карточку повторно, пока не заполнит правильно.

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

Коллеги, всем доброго времени суток!

Подскажите, есть ли возможность проставить признак обязательности заполнения(*), при этом не устанавливая параметр на уровне БД?

http://prntscr.com/ocz7r9

Есть ли какие то методы при помощи которых можно выполнить такую настройку?

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

Нравится

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

В 7.Х вообще не стоит устанавливать обязательность поля на уровне базы, достаточно на уровне объекта.

Если же нужно кодом на мобильной странице, см. эту и эту темы.

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

Добрый день. Подскажите, пожалуйста, как разрешить следующую проблему.

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

 

PS. Может, я чего-то не знаю и возможность удаления без удаления связанных записей можно отключить?

Нравится

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

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

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

Вы можете полностью заместить и изменить схему GridUtilitiesService для решения вашей бизнес цели.

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

Добрый день!
в BPM есть возможность сделать поле обязательным по какому-то условию
с помощью BINDPARAMETER

по правилу
rules: {
"Fieldname": {
BindParameterRequiredAccountByType: {
ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
property: BusinessRuleModule.enums.Property.REQUIRED,

conditions: [{
// Выражение левой части условия.
leftExpression: {
type:
attribute:
attributePath:
},
comparisonType: Terrasoft.ComparisonType.NOTEQUAL,
rightExpression: {
type: ,
value:
}
}]
}
}

Скажите, пожалуйста, если я хочу, чтобы условие было следующим
Terrasoft.CurrentUser.userType != Terrasoft.UserType.SSP
( т.е. текущий пользователь не является пользователем веб-портала)

то что я должна написать в левой части условия и в правой?
что необходимо указывать в type, attribute, attributePath
для Terrasoft.CurrentUser.userType
type в этом случае BusinessRuleModule.enums.ValueType.CONSTANT?
а что тогда attribute, attributepath?

правая часть выражения Terrasoft.UserType.SSP в этом случае как должна выглядеть?
type тоже в этом случае BusinessRuleModule.enums.ValueType.CONSTANT,
а value это Terrasoft.UserType.SSP ?

P.S. в каком пакете сейчас находится модуль BusinessRuleModule? где можно его посмотреть?(версия 7.6)

Нравится

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

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

Для решения задачи рекомендуем ознакомится со статьей “Как сделать поле обязательным для заполнения по определенному условию”
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/RequiredFi…

В версии 7.6 схема BusinessRuleModule находится в пакете NUI.

Добрый день! Спасибо, я эту статью читала.
Там в примере - Правило зависимости обязательности поля [Контрагент] от значения в поле [Тип].
там понятно, что указывать в левой и в правой части условия.
мне не понятно, как должна выглядеть левая часть условия в данном выражении,
если левая часть условия - это Terrasoft.CurrentUser.userType

Какой тип выражения должен быть в данном случае?
Возможные значения: ATTRIBUTE, CONSTANT, SYSSETTING, SYSVALUE, CARDSTATE
Тип текущего пользователя - это же не аттрибут модели представления и не константа, не
системная настройка, не системное значение и не состояние карточки.
Тогда что это? какое значения для type выбрать в этом случае?

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

Если бы необходимо было использовать в сравнении значение Terrasoft.CurrentUser - тип выражения должен быть SYSVALUE. Но в Вашем случае можно использовать следующий подход:

1) для правого выражения указать тип CONSTANT и значение Terrasoft.UserType.SSP;
2) создать в блоке attributes атрибут

"CurrentUserType": {
	dataValueType: Terrasoft.DataValueType.TEXT,
	value: Terrasoft.CurrentUser.userType 
}

3) для левого выражения указать тип ATTRIBUTE и атрибут CurrentUserType.

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

В SDK bpm'online в подраздел "Примеры решения типовых задач" добавлены решения кейсов, связанных с разработкой пользовательского интерфейса и бизнес-логики приложения.
Заходите на сайт Terrasoft Academy в раздел "Документация SDK" и узнайте как:

Статьи расположены в разделе "Примеры решения типовых задач"

Нравится

Поделиться

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

А что за функция asyncValidate в InvoicePageV2? Это какой-то другой способ валидации?

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

Здравствуйте!
Есть проблема со свойством 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, то пропадает только красненький текст валидации, а само поле продолжает вести себя как обязательное.. т.е. сильно просит заполнить себя....

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

Есть необходимость сделать обязательным поле "Ответственный" в карточке контрагента, так чтобы нельзя было сохранить карточку с пустым полем.
Где это можно сделать в TSAdmin? Или есть другие варианты?
Заранее спасибо!

Нравится

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

Откройте в TSAdmin сервис ds_Account, спозиционируйтесь на поле Owner и поставьте галочку "Обязательное для заполнения".

Здравствуйте, Дмитрий!
если поле все время должно быть обязательным, то достаточно поставить галочку "обязательное" в датасете:
датасет
если обязательность зависит от определенного условия, то скриптом это можно реализовать так:

if(условие) {
Dataset.DataFields('OwnerID').IsRequired = true;
}
else {
Dataset.DataFields('OwnerID').IsRequired = false;
}

этот код нужно вставить на опрепаре окна и туда, где будет менятся условие.

Да, надо чтобы постоянно.
Все сделал! Спасибо обеим Ольгам :)

"Ольга Прилипко" написал:

Здравствуйте, Дмитрий!



если обязательность зависит от определенного условия, то скриптом это можно реализовать так:

if(условие) {

Dataset.DataFields('OwnerID').IsRequired = true;

}

else {

Dataset.DataFields('OwnerID').IsRequired = false;

}

этот код нужно вставить на опрепаре окна и туда, где будет менятся условие.

Ольга, а как быть, если работа ведется в окне без датасета(просто окно с полями, которые необходимо делать обязательными для заполнения в зависимости от условий)?

Аналогично:

<имя поля>.IsRequired = <условие>;

"Раловец Ольга" написал:

Аналогично:

<имя поля>.IsRequired = <условие>;

Пробовал, не получается

Возможно необходимо подключить какой-то скрипт(подключен только scr_WindowUtils)?

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

Спасибо, такое решение я знаю, описывать подробно нет необходимости.

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

Здравствуйте!
Вопросов два:
1. как определяется обязательность заполнения полей в карточках редактирования? Какого-либо свойства не нашел.
2. в какой именно функции идет отрисовка карточки редактирования? требуется на определенный статус одного из полей карточки залочить от редактирования часть полей (реализовать невозможность редактирования задач и продаж со статусами "Выполнена").

Нравится

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

"Мамедов Фариз Эльдарович" написал:1. как определяется обязательность заполнения полей в карточках редактирования? Какого-либо свойства не нашел.

Признак "Обязательное" у поля в датасете, признак "Обязательное" у поля в таблице
"Мамедов Фариз Эльдарович" написал:2. в какой именно функции идет отрисовка карточки редактирования? требуется на определенный статус одного из полей карточки залочить от редактирования часть полей (реализовать невозможность редактирования задач и продаж со статусами "Выполнена").

попробуйте обрабатывать событие OnPrepare окна

"Кулак Олег" написал:Признак "Обязательное" у поля в датасете, признак "Обязательное" у поля в таблице

Аааа, спасибо, а я в wnd_ всяких искал )

"Кулак Олег" написал:попробуйте обрабатывать событие OnPrepare окна

ок, будем копать, спасибо.

В функции на событие OnPrepare воткнул такой код:

var TaskStatus = Dataset.Values('StatusID');
if (TaskStatus = '{F598ECDB-4EEF-4FA8-9E69-A36B053501E5}'){
edtTitle.IsEnabled = false;
} else {
edtTitle.IsEnabled = true;
}

Статус Айди соответствует айди статусы "Выполнена". При открытие карточки задачи со сатутсом выполнена все правильно - Тайтл заблочен от редактирования. Проблем в том, что после первого такого случая, ВСЕ остальные задачи, независимо от статуса открываются с заблоченным тайтлом...

"Мамедов Фариз Эльдарович" написал:if (TaskStatus = '{F598ECDB-4EEF-4FA8-9E69-A36B053501E5}'){

замените на if (TaskStatus == '{F598ECDB-4EEF-4FA8-9E69-A36B053501E5}'){

Вариант записи покороче

var TaskStatus = Dataset.Values('StatusID');
edtTitle.IsEnabled = (TaskStatus != '{F598ECDB-4EEF-4FA8-9E69-A36B053501E5}')
Показать все комментарии

Здравствуйте. У меня CRM X15 версии 3.2.0.11 стандартной конфигурации. Стоят следующии задачи:
1) при создании новой задачи автоматически запускать таймер (аналогично "действия->запустить таймер", только делать это программно).
2) при закрытии задачи сделать обязательным поле "подробный результат". То есть чтобы пользователь не мог закрыть задачу, не заполнив это поле.
Как мне это сделать? Заранее большое спасибо за помощь!

Нравится

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

1)var Timer = System.CreateObject('TSWindowLibrary.Timer');
зачем его создавать , я понять немогу
2) в окне редактирования задач , на событии OnDatasetDataChange

function dlDataOnDatasetDataChange(DataField) {
if (!Assigned(DataField)) {
return;
}
var DataFieldName = DataField.Name;
if (DataFieldName == 'StatusID'){
if (DataField.Value == 'айдишник состояния выполнено' ){
dlData.Dataset.DataFields('ResultID').IsRequired = true;
} else {
dlData.Dataset.DataFields('ResultID').IsRequired = false;
}

}
}

Вместо последнего if я бы написал

dlData.Dataset.DataFields('ResultID').IsRequired = (DataField.Value == 'айдишник состояния выполнено');

Спасибо, со 2-м пунктом разобрался, а вот с первым нет. Имелось ввиду что менеджеры, когда создают задачу (чаще всего они создают ее себе сами) часто забывают запутить таймер ее выполнения со всеми вытекающими отсюда последствиями.
Руководитель отдела попросил меня, чтобы это делалось автоматически, т.к. в 90% случаев факт того, что менеджер завел задачу ознает что он уже начал ее выполнять, то есть логично было бы запускать его автоматически, а не совершать дополнительное ручное действие.

Заранее спасибо за помощь!

можно попробовать изменить под себя функцию StartTimer()
которая находится в scr_TasksWorkspace
но она может неработать для вновь созданых задачь

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