Добрый день!
в 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.

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

Здравствуйте!
Как можно в BPM 7.4 отобразить деталь по условию?
Пробовал реализовать через Rules - не вышло, для детали, насколько я понял нет свойства visible.

Нравится

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

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

уже разобрался, привязал через bindTo

attributes: {
            //поле от от которого зависит видимость детали
 
            "Type": {
                dependencies: [
                    {
                        columns: ["Type"],
                        methodName: "typeChange"
                    }
                ]
            }
        },
................
diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"name": "VehicleDetail",
		"values": {
			"itemType": 2,
               "visible": {bindTo : 'IsVehicleDetailVisible'}
		},
		"parentName": "AccountPageGeneralTabContainer",
		"propertyName": "items",
		"index": 7
	}
]/**SCHEMA_DIFF*/,
................
methods: {
            typeChange: function () {
                var Type=this.get("Type");
                if (typeof (Type) != "undefined")
                {
                    var isVisibleDetail=((Type.value == Constants.Account.AccountType.Contractor)||
                        (Type.value == Constants.Account.AccountType.OurCompany))
                    this.set("IsVehicleDetailVisible", isVisibleDetail)
                }
            }
        },
Показать все комментарии

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

помогите, пожалуйста со следующим вопросом:
есть кастомное поле (справочник(шаблон инцидента) в инциденте). делаю дополнительный БП который обрабатывает изменение этого поля. Читаем данные инцидента ReadDataUserTask1. Далее требуется через Исключающее ИЛИ расписать дальнейшие варианты действий условными потоками. Вот пример попытки написать условие одного из потоков:

ReadDataUserTask1.ResultEntity.GetTypedColumnValue("TemplateOfIncident.Id") == (Guid)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "StandartIncidentTemplate”)

системную настройку значений полей справочника (например StandartIncidentTemplate) я сделал..

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

понимаю, что нужно указать тип имени TemplateOfIncident.Id(возможно неявного), но как это сделать не знаю.

если в качестве теста использовать стандартное поле и справочник (Сервис) то условие:
ReadDataUserTask1.ResultEntity.GetTypedColumnValue("ServiceId") == (Guid)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "EquipmentReplacementService”)
работает при использовани в Usings - Terrasoft.Configuration

Нравится

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

обходное решение нашлось необчным образом - взял guid поля справочника из таблицы и вставил его в условие:

ReadDataUserTask1.ResultEntity.GetTypedColumnValue("TemplateOfIncidentId") == new Guid("E7496BD4-855C-45E1-AA07-B286CFCD55A7")

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

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

Хочу выводить деталь проекта только для определенного условия

function dlProjectOnDatasetAfterPositionChange(Dataset) {
    if ((Dataset.Values('EssenceType') == 'Work') &&
            (Dataset.Values('TypeID') == '{1142CDEE-FA70-4CB6-8DBC-20C7F68B71BB}') &&
                (Dataset.Values('OfferingTypeID') == '{FCB4DC72-C668-46C8-8BFF-E6ABA7FD9411}')) {
...

выдает ошибку: Поле 'Тип' не активно
почему выскакивает такая ошибка? и как можно решить данную задачу?

Нравится

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

В sq_Project у колонки EssenceType поставьте флажок "Всегда выбирать в запросе"

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

"Штинов Антон Викторович" написал:

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

Лучше использовать GetFieldValueFromDisabledField(Dataset, FieldName).

"Раловец Ольга" написал:Лучше использовать GetFieldValueFromDisabledField(Dataset, FieldName).

Почему?

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

В этой ситуации лучше ставить галочку "Всегда выбирать в запросе". И вот почему
1. В приведенном примере Антон всегда при смене позиции в датасете будет анализировать эти поля
2. функция GetFieldValueFromDisabledField очень тяжела с точки зрения производительности. Если посмотреть на ее реализацию (к реализации вопросов нет, всё сделано корректно), то создается еще один датасет с уже активным нужным полем, и из которого уже берется значение. Получается что при смене позиции в датасете будет открыто еще три (для каждого не активного поля).

Так что наверно проще выбрать еще три поля чем на каждую запись делать еще три запроса.

Евгений, я думала об этом, но не знаю, как сравнить "тяжесть" передачи данных из трех лишних полей с сервера на клиент каждый раз при открытии набора данных и выполнение "тяжелых" операций на клиенте только при определенном запросе, но при условии, что запрос происходит часто. Не знаю, как сравнить количество открытий набора данных проектов без использования деталей с количеством переходов по записям при видимых деталях.
Для трех полей сразу GetDatasetFieldsValuesNamedArray(Dataset, FieldNames), а также при повторном обращении НЕ создается новый экземпляр набора данных, а sq кэшируется в атрибутах набора данных и переоткрывается.

Я просто встречал GetFieldValueFromDisabledField в функциях, которые используются ну очень часто, например раскраска реестра. И 1-2 ИДшника передать для 40 записей будет попроще, чем делать 40 доп.запросов на сервер.

Нужно быть очень осторожным с использованием этой функции.

"Раловец Ольга" написал:Для трех полей сразу GetDatasetFieldsValuesNamedArray(Dataset, FieldNames), а также при повторном обращении НЕ создается новый экземпляр набора данных, а sq кэшируется в атрибутах набора данных и переоткрывается.

Да, действительно есть такая функция, но все равно создается новый экземпляр Dataset

	var Dataset = SelectQuery.Open();

Это на клиентской части. На сервере же, если данные выбираются в едином контексте (одним селектом) - то это проще для сервера, чем создавать отдельный контекст, отдельный курсор и т.д..... Хотя при очень сложных запросах нужно делать разные курсоры...
В общем для разных ситуаций используются разные подходы, и к сожелению, универсального подхода нет :smile:

"Глова Сергей" написал:Нужно быть очень осторожным с использованием этой функции.

Аватарка очень подходит к этой фразе :)
Евгений, ошибочно написала набор данных, имела ввиду сервис запроса.
Да, использование GetDatasetFieldsValuesNamedArray() каждый раз довольно ресурсозатратно, но и включение пары дополнительных полей в запрос повышает время его выполнения от нескольких десятков до сотни миллисекунд на моем примере в 130 записей.

"Раловец Ольга" написал:Глова Сергей пишет:

Нужно быть очень осторожным с использованием этой функции.

Аватарка очень подходит к этой фразе :)

+1 :lol:
В общем, как сказал Евгений, использование зависит от ситуации

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