Добрый день.
В договоре сделал бизнес правило для блокировки всех полей в заголовке если поле "Состояние" выбрано: Подписан.
1F703F42-F7E8-4E3F-9B54-2B85F62EA507 - это id состояния "Подписан"
В общем поля блокируются в любом случае даже если выбрано другое состояние, а мне надо, блокировать поля в случае если выбрано только значение "Подписан".

Как исправить?

rules: {
        "Number": {
                // Правило зависимости доступности поля [Рабочий телефон] от значения в поле [Мобильный телефон].
                "BindParameterDisabledNumber": {
                        // Тип правила BINDPARAMETER.
                        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                        // Правило регулирует свойство ENABLED.
                        "property": BusinessRuleModule.enums.Property.ENABLED,
                        // Массив условий, при выполнении которых отрабатывает правило. В данном
                        // случае массив содержит одно условие для определения, установлено ли значение.
                        "conditions": [{
                                // Выражение левой части условия.
                                "leftExpression": {
                                        // Тип выражения ATTRIBUTE указывает на то, что в качестве выражения выступает
                                        // атрибут (колонка) модели представления.
                                        "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                        // Название колонки модели представления, значение которой сравнивается в выражении.
                                        "attribute": "State"
                                },
                                // Тип операции сравнения.
                                "comparisonType": Terrasoft.ComparisonType.EQUAL,
                                // Выражение правой части условия.
                                "rightExpression": {
                                        // Тип выражения CONSTANT указывает на то, что в качестве значения выражения выступает
                                        // константное значение.
                                        "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                        // Значение, с которым сравнивается выражение левой части.
                                        "value": "1F703F42-F7E8-4E3F-9B54-2B85F62EA507"
                                }
                        }]
                }
        },
        "Owner": {
                // Правило зависимости доступности поля [Рабочий телефон] от значения в поле [Мобильный телефон].
                "BindParameterEnabledOwnerr": {
                        // Тип правила BINDPARAMETER.
                        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                        // Правило регулирует свойство ENABLED.
                        "property": BusinessRuleModule.enums.Property.ENABLED,
                        // Массив условий, при выполнении которых отрабатывает правило. В данном
                        // случае массив содержит одно условие для определения, установлено ли значение.
                        "conditions": [{
                                // Выражение левой части условия.
                                "leftExpression": {
                                        // Тип выражения ATTRIBUTE указывает на то, что в качестве выражения выступает
                                        // атрибут (колонка) модели представления.
                                        "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                        // Название колонки модели представления, значение которой сравнивается в выражении.
                                        "attribute": "State"
                                },
                                // Тип операции сравнения — не равно.
                                "comparisonType": Terrasoft.ComparisonType.EQUAL,
                                // Выражение правой части условия.
                                "rightExpression": {
                                        // Тип выражения CONSTANT указывает на то, что в качестве значения выражения выступает
                                        // константное значение.
                                        "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                        // Значение, с которым сравнивается выражение левой части.
                                        "value": "1F703F42-F7E8-4E3F-9B54-2B85F62EA507"
                                }
                        }]
                }
        },
        "Type": {
                // Правило зависимости доступности поля [Рабочий телефон] от значения в поле [Мобильный телефон].
                "BindParameterEnabledType": {
                        // Тип правила BINDPARAMETER.
                        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                        // Правило регулирует свойство ENABLED.
                        "property": BusinessRuleModule.enums.Property.ENABLED,
                        // Массив условий, при выполнении которых отрабатывает правило. В данном
                        // случае массив содержит одно условие для определения, установлено ли значение.
                        "conditions": [{
                                // Выражение левой части условия.
                                "leftExpression": {
                                        // Тип выражения ATTRIBUTE указывает на то, что в качестве выражения выступает
                                        // атрибут (колонка) модели представления.
                                        "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                        // Название колонки модели представления, значение которой сравнивается в выражении.
                                        "attribute": "State"
                                },
                                // Тип операции сравнения.
                                "comparisonType": Terrasoft.ComparisonType.EQUAL,
                                // Выражение правой части условия.
                                "rightExpression": {
                                        // Тип выражения CONSTANT указывает на то, что в качестве значения выражения выступает
                                        // константное значение.
                                        "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                        // Значение, с которым сравнивается выражение левой части.
                                        "value": "1F703F42-F7E8-4E3F-9B54-2B85F62EA507"
                                }
                        }]
                }
        },
        "StartDate": {
                // Правило зависимости доступности поля [Рабочий телефон] от значения в поле [Мобильный телефон].
                "BindParameterEnabledStartDater": {
                        // Тип правила BINDPARAMETER.
                        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                        // Правило регулирует свойство ENABLED.
                        "property": BusinessRuleModule.enums.Property.ENABLED,
                        // Массив условий, при выполнении которых отрабатывает правило. В данном
                        // случае массив содержит одно условие для определения, установлено ли значение.
                        "conditions": [{
                                // Выражение левой части условия.
                                "leftExpression": {
                                        // Тип выражения ATTRIBUTE указывает на то, что в качестве выражения выступает
                                        // атрибут (колонка) модели представления.
                                        "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                        // Название колонки модели представления, значение которой сравнивается в выражении.
                                        "attribute": "State"
                                },
                                // Тип операции сравнения.
                                "comparisonType": Terrasoft.ComparisonType.EQUAL,
                                // Выражение правой части условия.
                                "rightExpression": {
                                        // Тип выражения CONSTANT указывает на то, что в качестве значения выражения выступает
                                        // константное значение.
                                        "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                        // Значение, с которым сравнивается выражение левой части.
                                        "value": "1F703F42-F7E8-4E3F-9B54-2B85F62EA507"
                                }
                        }]
                }
        },
        "EndDate": {
                // Правило зависимости доступности поля [Рабочий телефон] от значения в поле [Мобильный телефон].
                "BindParameterEnabledEndDate": {
                        // Тип правила BINDPARAMETER.
                        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                        // Правило регулирует свойство ENABLED.
                        "property": BusinessRuleModule.enums.Property.ENABLED,
                        // Массив условий, при выполнении которых отрабатывает правило. В данном
                        // случае массив содержит одно условие для определения, установлено ли значение.
                        "conditions": [{
                                // Выражение левой части условия.
                                "leftExpression": {
                                        // Тип выражения ATTRIBUTE указывает на то, что в качестве выражения выступает
                                        // атрибут (колонка) модели представления.
                                        "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                        // Название колонки модели представления, значение которой сравнивается в выражении.
                                        "attribute": "State"
                                },
                                // Тип операции сравнения.
                                "comparisonType": Terrasoft.ComparisonType.EQUAL,
                                // Выражение правой части условия.
                                "rightExpression": {
                                        // Тип выражения CONSTANT указывает на то, что в качестве значения выражения выступает
                                        // константное значение.
                                        "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                        // Значение, с которым сравнивается выражение левой части.
                                        "value": "1F703F42-F7E8-4E3F-9B54-2B85F62EA507"
                                }
                        }]
                }
        },
        "qrtOrderPaymentList": {
                // Правило зависимости доступности поля [Рабочий телефон] от значения в поле [Мобильный телефон].
                "BindParameterEnabledqrtOrderPaymentList": {
                        // Тип правила BINDPARAMETER.
                        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                        // Правило регулирует свойство ENABLED.
                        "property": BusinessRuleModule.enums.Property.ENABLED,
                        // Массив условий, при выполнении которых отрабатывает правило. В данном
                        // случае массив содержит одно условие для определения, установлено ли значение.
                        "conditions": [{
                                // Выражение левой части условия.
                                "leftExpression": {
                                        // Тип выражения ATTRIBUTE указывает на то, что в качестве выражения выступает
                                        // атрибут (колонка) модели представления.
                                        "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                        // Название колонки модели представления, значение которой сравнивается в выражении.
                                        "attribute": "State"
                                },
                                // Тип операции сравнения.
                                "comparisonType": Terrasoft.ComparisonType.EQUAL,
                                // Выражение правой части условия.
                                "rightExpression": {
                                        // Тип выражения CONSTANT указывает на то, что в качестве значения выражения выступает
                                        // константное значение.
                                        "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                        // Значение, с которым сравнивается выражение левой части.
                                        "value": "1F703F42-F7E8-4E3F-9B54-2B85F62EA507"
                                }
                        }]
                }
        },
        "qrtOriginalDoc": {
                // Правило зависимости доступности поля [Рабочий телефон] от значения в поле [Мобильный телефон].
                "BindParameterEnabledqrtOriginalDoc": {
                        // Тип правила BINDPARAMETER.
                        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                        // Правило регулирует свойство ENABLED.
                        "property": BusinessRuleModule.enums.Property.ENABLED,
                        // Массив условий, при выполнении которых отрабатывает правило. В данном
                        // случае массив содержит одно условие для определения, установлено ли значение.
                        "conditions": [{
                                // Выражение левой части условия.
                                "leftExpression": {
                                        // Тип выражения ATTRIBUTE указывает на то, что в качестве выражения выступает
                                        // атрибут (колонка) модели представления.
                                        "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                        // Название колонки модели представления, значение которой сравнивается в выражении.
                                        "attribute": "State"
                                },
                                // Тип операции сравнения.
                                "comparisonType": Terrasoft.ComparisonType.EQUAL,
                                // Выражение правой части условия.
                                "rightExpression": {
                                        // Тип выражения CONSTANT указывает на то, что в качестве значения выражения выступает
                                        // константное значение.
                                        "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                        // Значение, с которым сравнивается выражение левой части.
                                        "value": "1F703F42-F7E8-4E3F-9B54-2B85F62EA507"
                                }
                        }]
                }
        }
}

Нравится

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

у меня такое правило вроде отрабатывает

"Number": {
    "BindParameterDisabledNumber": {
        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
        "property": BusinessRuleModule.enums.Property.ENABLED,
        "conditions": [{
            "leftExpression": {
                    "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                    "attribute": "State"
            },
            "comparisonType": Terrasoft.ComparisonType.NOT_EQUAL,
            "rightExpression": {
                    "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                    "value": "1f703f42-f7e8-4e3f-9b54-2b85f62ea507"
            }
        }]
    }
}

ВИдимо вы напутали с comparisonType

Добрый день, Максим.

Скорей всего, Вам стоит поменять comparisonType на Terrasoft.ComparisonType.NOT_EQUAL.

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

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

Добрый день.
Версия 7.9.0

Пробую добавить валидацию полей в редактируемую деталь с реестром и вычислаемы полями по примеру
https://academy.terrasoft.ru/documents/technic-sdk/7-9/dobavlenie-valida...

Но пример для страницы редактирования раздела. Может я не в ту схему вставляю методы? Или же я просто не вижу ошибку которую допускаю ? Буду признателен за подсказку

 

define("UsrUsrOrderOnField1Page", [], function() {
        return {
                entitySchemaName: "UsrOrderOnField",
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                attributes: {
                        "UsrReservRemains": {
                                dataValueType: Terrasoft.DataValueType.INTEGER,
                                dependencies: [
                                        {
                                                columns: ["UsrQuantity"],
                                                methodName: "calculateUsrReservRemains"
                                        }
                                ]
                        }
                },
                diff: /**SCHEMA_DIFF*/[
                        {
                                "operation": "insert",
                                "name": "UsrQuantityWorkOrdere",
                                "values": {
                                        "layout": {     "colSpan": 12,"rowSpan": 1,"column": 12,"row": 4,"layoutName": "Header"},
                                        "bindTo": "UsrQuantityWorkOrder"
                                },
                                "parentName": "Header",
                                "propertyName": "items",
                                "index": 4
                        },
                        {
                                "operation": "insert",
                                "name": "UsrQuantity",
                                "values": {
                                        "layout": {"colSpan": 12,"rowSpan": 1,"column": 0,"row": 3,"layoutName": "Header"
                                        },
                                        "bindTo": "UsrQuantity"
                                },
                                "parentName": "Header",
                                "propertyName": "items",
                                "index": 5
                        },
                        {
                                "operation": "insert",
                                "name": "UsrReservRemains",
                                "values": {
                                        "layout": {"colSpan": 12,"rowSpan": 1,"column": 0,"row": 4,"layoutName": "Header"
                                        },
                                        "bindTo": "UsrReservRemains"
                                },
                                "parentName": "Header",
                                "propertyName": "items",
                                "index": 6
                        },
                        {
                                "operation": "insert",
                                "name": "UsrToWorkOrder",
                                "values": {
                                        "layout": {"colSpan": 12,"rowSpan": 1,"column": 12,"row": 3,"layoutName": "Header"
                                        },
                                        "bindTo": "UsrToWorkOrder"
                                },
                                "parentName": "Header",
                                "propertyName": "items",
                                "index": 7
                        }
                ]/**SCHEMA_DIFF*/,
                methods: {
                        calculateUsrReservRemains: function() {
                                if (!this.get("UsrLastQuantity")) {
                                        this.set("UsrLastQuantity", 0);
                                }
                                if (!this.get("UsrReservRemains")) {
                                        this.set("UsrReservRemains", 0);
                                }
                                var result = this.get("UsrReservRemains") + this.get("UsrQuantity") - this.get("UsrLastQuantity");
                               
                                this.set("UsrReservRemains", result);
                                this.set("UsrLastQuantity", this.get("UsrQuantity"));
                        },
                        quantityVlidator: function() {
                                var invalidMessage = "";
                                if (this.get("UsrQuantity") this.get("UsrReservRemains")) {
                                        invalidMessage = this.get("Resources.Strings.ValueOfReservGraterThenQuantity");
                                }
                                return {
                                        fullInvalidMessage: invalidMessage
                                        invalidMessage: invalidMessage
                                };
                        },
                        setValidationConfig: function() {
                                this.callParent(arguments);
                                this.addColumnValidator("UsrQuantity", this.quantityVlidator);
                                this.addColumnValidator("UsrReservRemains", this.quantityVlidator);
                        }
                },
                rules: {}
        };
});

 

Нравится

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

"Сергей Джулай" написал:Буду признателен за подсказку

Скрин консоли с ошибкой приложите, пожалуйста

Да дело в том что ошибки в консоли нету. На странице редактирования заказа деталь с редактируемым реестром(21.jpg), и валидация там не работает (но и ошибок нет). Когда же на странице редактирования самой детали работает все отлично(20.jpg).
А нужна валидация, что бы не открывать новую страницу.

А код немного сменил (Упростил)

quantityVlidator: function() {
    var invalidMessage = "";
        if (this.get("UsrQuantity") < 1) {
            nvalidMessage = this.get("Resources.Strings.ValueOfReservGraterThenQuantity");
        }
    return {
        fullInvalidMessage: invalidMessage,
        invalidMessage: invalidMessage
    };
},
setValidationConfig: function() {
    this.callParent(arguments);
    this.addColumnValidator("UsrQuantity", this.quantityVlidator);
}

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

save: function() {
	if (this.get("UsrString").length === 12) {
		this.callParent(arguments);
	} else {
		this.showInformationDialog("Колонка String должна содержать 12 символов!");
	}
}

Спасибо Максим. Я так и реализовал валидацию, но это слабовато, так как в РР если внести неверное значение, то оно все равно сохранится, хоть и выдаст информационное окно с ошибкой. А это уже риск сломать некую логику. Может можно как то реализовать некую валидацию в момент события сохранения в GRIDе ? Например на событие выделения строки, поля которые должны проверяться сохраняются в временные переменные, а по событию save происходит валидация и если она не проходит, то значения возвращаются с временных переменных.

Посмотрите в сторону ConfigurationGridUtilities, там есть onActiveRowAction, можете переопределить его, и добавить валидацию там. Переопределять этот метод необходимо на схеме детали, и общатся со схемой карточки через sandbox.

Спасибо Максим. За подсказку - буду дальше размышлять в подсказанном направлении.

Сергей,

Поделитесь, пожалуйста, решением данной задачи.

Добрый день Алла. К сожалению до правильной реализации руки так и не дошли. Сейчас проверки выполнена с помощью предупреждения.

attributes: {
	"UsrQuantityWorkOrder": {
		dataValueType: Terrasoft.DataValueType.INTEGER,
		dependencies: [
			{
				columns: ["UsrQuantityWorkOrder"],
				methodName: "validationUsrQuantityWorkOrdere"
			}
		]
	}
},
methods: {
	validationUsrQuantityWorkOrdere: function() {
		if (this.get("UsrQuantityWorkOrder") > this.get("UsrReservRemains")) {
			this.showInformationDialog("Значение больше чем значиние Остаток в резерве");
		}
	}
}

Сергей, спасибо за информацию.

Получается, что пользователь при такой реализации может всё-таки внести некорректные данные, но при этом он будет предупрежден.

Кстати, интересно реализована ли валидация для редактируемого реестра в версии 7.10?

Кто в курсе?

Да, вы правы, пользователь может внести неверное значение, нужно все таки разобраться с sandbox и ConfigurationGridUtilities.

Как собственно и в обычных деталях и карточках - Ваша задача изучить цепочку вызовов функций сохранения (в каждом случае все немного отличается).
Определите подходящий метод в цепочке вызовов (который вызывается на исполнение до непосредственной записи в БД, обладает необходимым контекстом (this) и т.д.), ну и переопределите его - обогатив своей логикой валидации.
Валидация пройдена - "отпускаем" по this.callParent(arguments) [По естественной ветке]
Не пройдена - прерываем выполнение, и всего делов (показываем наши сообщения, открываем справочники - все что душе угодно)
Если в валидации задействованы асинхронные вызовы - например ESQ запросы.
вам вот сюда "Раcширить логику save, после валидации. Контроль Chain выполнения"

Илья,

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

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

Спасибо за то, что поделились опытом!

Советую присмотреться и отладить метод "unSelectRow"
в частности вызываемый им "saveRowChanges" (схема ConfigurationGridUtilities)


Так что замещайте ConfigurationGridUtilities переопределяйте saveRowChanges
Внедряя в нее логику валидации до "row.save"- и будет Вам счастье.

Илья,

спасибо Вам за помощь в поиске подходящего решения :smile:

Добрый день! Коллеги,  в 7.12 до сих пор валидация для редактируемого реестра не реализована(((...сейчас как раз задача есть. В  каких следующих версиях можно ожидать?

 

В анонсе 7,13 єтого нет (не кидайте в меня тапками если не заметил) Так что ждите или программируйте!

Григорий Чех,

Думаю, что такой доработки в коробке ещё долго не будет, учитывая дату публикации данного поста и все сложности, которые возникают при малейшей попытке доработки редактируемого реестра в базовой версии crying

Значит или ждать или кастомно делать под себя, (Проверять до сохранения и потом если все ок сохранять )

Григорий Чех пишет:Получается в saveRowChanges изменять условие под себя из ответа Севостьянов Илья Сергеевич?

См. также тут и тут.

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

Здравствуйте.
Версия 7.9.2

Необходимо в карточке CallMessagePublisherPage отфильтровать поле Contact по Контрагенту и изменить тип поля на ENUM

Фильтр реализовал в lookupListConfig атрибута Contact:

"Contact": {
   "isLookup": true,
   "lookupListConfig": {
     "columns": ["Account"],
     "filter":  function() {
       var filters = Ext.create("Terrasoft.FilterGroup");
       var listenerInfo = this.getListenerRecordData();
       if (listenerInfo.relationSchemaName === "Account" &&
          !Ext.isEmpty(listenerInfo.relationSchemaRecordId)) {
            var accountFilter = this.Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL,
                "Account",
                listenerInfo.relationSchemaRecordId);
            filters.add("AccountFilter", accountFilter);
        }
       return filters;
     }
   }
}

При нажатии на "лупу" (Открытие окна выбора из справочника) справочник контактов отфильтрован корректно.
Однако, при смене contentType на ENUM или при нажатии клавиши "Вниз" стандартного справочного поля фильтрация значений не происходит, хотя указанный выше код так же отрабатывает.

В чем причина такого поведения?

Нравится

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

"Коновалов Игорь" написал:В чем причина такого поведения?

Попробовал на тестовой 7.9.1 - всё воспроизводится, проверил на 7.8.0 у клиента (мы там ему enum поле фильтровали в активности) - там всё идеально работает, фильтруется через lookupConfig.

Помнится когда начинал изучать bpm, то столкнулся с подобной проблемой. Спросил у ТП, ребята говорят: "переопределяйте change и prepareListConfig" при описании контрола (что дико неудобно)

Вывод: хрен знает как оно вообще работает ¯\_(ツ)_/¯

Вам стоит смотреть в сторону добавления свойства orders в lookupListConfig. К примеру:

"EmployeesNumber": {
	lookupListConfig: {
		orders: [{columnPath: "Position"}]
	}
}

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

Вам стоит смотреть в сторону добавления свойства orders в lookupListConfig. К примеру:

"EmployeesNumber": {

        lookupListConfig: {

                orders: [{columnPath: "Position"}]

        }

}

Илья, здравствуйте.
Мне не нужна сортировка. Нужна фильтрация выпадающего списка.
Я использую стандартное свойство filter в lookupListConfig.

Прошу прощения. Неправильно прочитал. Как вариант, есть возможность заполнять выпадающий список значениями вручную при помощи свойства prepareList.

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

Прошу прощения. Неправильно прочитал. Как вариант, есть возможность заполнять выпадающий список значениями вручную при помощи свойства prepareList.


Т.е. стандартная фильтрация для справочных полей при использовании выпадающих списков, начиная с 7.9, не работает?

Игорь, фильтрация выпадающих списков через lookupListConfig отрабатывает в 7.9.2. Проблема заключается в том, что логика работы с свойством filters прописана в BasePageV2(NUI). Схема CallMessagePublisherPage не наследуется от BasePageV2.

Вам стоит смотреть в сторону копирования части логики из BasePagev2 в Вашу схему.

Да, спасибо. Уже реализовал через prepareList

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

Коллеги, добрый день.

Возникла следующая проблема: создали преднастроенную страницу (добавили нужные поля и кнопки). На странице должно быть 4 LOOKUP поля и 1 TEXT. Лукап поля должны заполняться автоматически и быть недоступными для редактирования. Заполнение полей должно происходить в процессе из объекта Юр. Лиц, но не получается заполнить эти поля (не отображаются на странице).

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

Можете подсказать, как решить данную проблему?

С уважением,
Дмитрий

 

define("RefillManagerPageV2", ["CustomProcessPageV2Utilities", "ConfigurationEnums"],
        function(ProcessPageUtilities, Enums) {
                return {
                        mixins: {
                                BaseProcessViewModel: "Terrasoft.CustomProcessPageV2Utilities"
                        },
                        attributes: {
                                "Account": {
                                        dataValueType: Terrasoft.DataValueType.LOOKUP,
                                        referenceSchemaName: "Account"
                                },
                                "Category": {
                                        dataValueType: Terrasoft.DataValueType.LOOKUP,
                                        referenceSchemaName: "AccountCategory"
                                },
                                "CurrentManager": {
                                        dataValueType: Terrasoft.DataValueType.LOOKUP,
                                        referenceSchemaName: "Contact"
                                },
                                "NewManager": {
                                        dataValueType: Terrasoft.DataValueType.LOOKUP,
                                        referenceSchemaName: "Contact"
                                },
                                "RefillReason": {
                                        name: "Reason",
                                        dataValueType: Terrasoft.DataValueType.TEXT
                                }
                        },
                        methods: {
        /*                      onEntityInitialized: function() {
                                        this.callParent(arguments);
                                        var processData = this.get("ProcessData");
                                        var processParameters = processData.parameters;
                                        if (processParameters) {
                                                this.set("CurrentManager", processParameters.CurrentManager);
                                                this.set("NewManager", processParameters.NewManager);
                                                this.set("Account", processParameters.Account);
                                                this.set("Category", processParameters.Category);
                                                this.set("RefillReason", processParameters.RefillReason);
                                        }
                                },*/

                               
                                getHeader: function() {
                                        return this.get("Resources.Strings.HeaderLcz");
                                },
                                initHeaderCaption: Ext.emptyFn,
                               
                                onNextButtonClick: function() {
                                        this.acceptProcessElement("NextCode");
                                },
                                onDiscardChangesClick: function() {
                                        this.cancelProcessElement("CancelCode");
                                },
                                loadVocabulary: function(args, tag) {
                                        var column = this.getColumnByName(tag);
                                        args.schemaName = column.referenceSchemaName;
                                        this.callParent(arguments);
                                }
                        },
                        diff: /**SCHEMA_DIFF*/[
                                {
                                        "operation": "remove",
                                        "name": "CloseButton"
                                },
                                {
                                        "operation": "remove",
                                        "name": "actions"
                                },
                                {
                                        "operation": "remove",
                                        "name": "SaveButton"
                                },
                                {
                                        "operation": "remove",
                                        "name": "DelayExecutionButton"
                                },
                                {
                                        "operation": "remove",
                                        "name": "ViewOptionButton"
                                },
                                {
                                        "operation": "insert",
                                        "parentName": "LeftContainer",
                                        "propertyName": "items",
                                        "name": "SendToApproveButton",
                                        "values": {
                                                caption: { bindTo: "Resources.Strings.SendToApproveButtonCaption" },
                                                itemType: Terrasoft.ViewItemType.BUTTON,
                                                classes: {textClass: "actions-button-margin-right"},
                                                style: Terrasoft.controls.ButtonEnums.style.GREEN,
                                                click: {bindTo: "onNextButtonClick"}
                                        }
                                },
/*                              {
                                        "operation": "insert",
                                        "parentName": "LeftContainer",
                                        "propertyName": "items",
                                        "name": "NotSendToApproveButton",
                                        "values": {
                                                caption: { bindTo: "Resources.Strings.NotSendToApproveButtonCaption" },
                                                itemType: Terrasoft.ViewItemType.BUTTON,
                                                classes: {textClass: "actions-button-margin-right"},
                                                style: Terrasoft.controls.ButtonEnums.style.RED,
                                                click: {bindTo: "onDiscardChangesClick"}
                                        }
                                },*/

                                {
                                        "operation": "insert",
                                        "parentName": "Header",
                                        "propertyName": "items",
                                        "name": "CurrentManager",
                                        "values": {
                                                "caption": { "bindTo": "Resources.Strings.CurrentManagerLcz" },
                                                "contentType": Terrasoft.ContentType.LOOKUP,
                                                "bindTo": "CurrentManager",
                                                "layout": { "column": 0, "row": 2, "colSpan": 12 },
                                                "enabled": true
                                        }
                                },
                                {
                                        "operation": "insert",
                                        "parentName": "Header",
                                        "propertyName": "items",
                                        "name": "NewManager",
                                        "values": {
                                                "caption": { "bindTo": "Resources.Strings.NewManagerLcz" },
                                                "contentType": Terrasoft.ContentType.LOOKUP,
                                                "bindTo": "NewManager",
                                                "layout": { "column": 0, "row": 3, "colSpan": 12 },
                                                "enabled": true
                                        }
                                },
                                {
                                        "operation": "insert",
                                        "parentName": "Header",
                                        "propertyName": "items",
                                        "name": "Account",
                                        "values": {
                                                "caption": { "bindTo": "Resources.Strings.AccountLcz" },
                                                "contentType": Terrasoft.ContentType.LOOKUP,
                                                "bindTo": "Account",
                                                "layout": { "column": 0, "row": 0, "colSpan": 12 },
                                                "enabled": true
                                        }
                                },
                                {
                                        "operation": "insert",
                                        "parentName": "Header",
                                        "propertyName": "items",
                                        "name": "Category",
                                        "values": {
                                                "caption": { "bindTo": "Resources.Strings.CategoryLcz" },
                                                "contentType": Terrasoft.ContentType.LOOKUP,
                                                "bindTo": "Category",
                                                "layout": { "column": 0, "row": 1, "colSpan": 12 },
                                                "enabled": true
                                        }
                                },
                                {
                                        "operation": "insert",
                                        "parentName": "Header",
                                        "propertyName": "items",
                                        "name": "RefillReason",
                                        "values": {
                                                "caption": { "bindTo": "Resources.Strings.RefillReasonLcz" },
                                                "contentType": Terrasoft.ContentType.LOOKUP,
                                                "bindTo": "RefillReason",
                                                "layout": { "column": 0, "row": 4, "colSpan": 12 },
                                                "enabled": true
                                        }
                                }
                        ]/**SCHEMA_DIFF*/,
                        userCode: {}
                };
        });

 

Нравится

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

Добрый день.

Для решения Вашей задачи необходимо:

1) Заполнить свойство Parameters в структуре схеме необходимыми Вам атрибутами.
2) Добавить элемент "Преднастроенная страница" в БП.
3) Убедиться, что у элемента появились необходимые параметры.
3) Заполнять в БП параметры элемента (пункт 2).

При открытии карточки атрибуты уже будут присутствовать.

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

1) Заполнить свойство Parameters в структуре схеме необходимыми Вам атрибутами.


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

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

Наглядно показал на скриншоте.

Примеры работы с параметрами в js коде, Вы можете посмотреть в схеме LeadManagementDistributionPageV2

Тёскин Дмитрий Валерьевич,

Вы прикалываетесь? серьезно? в 

LeadManagementDistributionPageV2 нет параметров.

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

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

esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                                rootSchemaName: "CurrencyRate"
                                                        });
                                                        esq.addColumn("Rate");
                                                        //var startDate = esq.addColumn('StartDate');
                                                        //startDate.orderDirection = Terrasoft.OrderDirection.DESC;
                                                       
                                                        var yesterday = new Date();
                                                        var tomorrow = new Date();
                                                        yesterday.setDate(tomorrow.getDate() - 1);
                                                        tomorrow.setDate(tomorrow.getDate() + 1);
                                                       
                                                        esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                                        this.Terrasoft.ComparisonType.EQUAL, "Currency", this.get("LogCurrencyRow").value));
                                                        esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                                        this.Terrasoft.ComparisonType.GREATER, "Startdate", yesterday));
                                                        esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                                        this.Terrasoft.ComparisonType.LESS, "Startdate", tomorrow));

                                                        esq.getEntityCollection(function(response) {
                                                                if (response.success) {
                                                                        response.collection.each(function(item) {
                                                                                CurrencyRate = item.get("Rate");
                                                                        }, this);
                                                                }
                                                                else if (CurrencyRate === 0)
                                                                {

Не могу разобраться с датой. Без даты работает.
Что не так?
Помогите пож-та.

Нравится

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

"Юсупов Марат" написал:esq.addColumn('StartDate');

"Юсупов Марат" написал:this.Terrasoft.ComparisonType.GREATER, "Startdate", yesterday))

Так StartDate или Startdate? А вообще, хотелось бы увидеть скрин консоли с ошибкой)

Также обратите внимание, что в переменную yesterday и tomorrow попадёт текущее время:

yesterday
Sun Mar 19 2017 16:14:13 GMT+0300 (RTZ 2 (зима))
tomorrow
Tue Mar 21 2017 16:14:13 GMT+0300 (RTZ 2 (зима))

Для "чистоты" запроса можно его подправить:

yesterday = Terrasoft.startOfDay(yesterday)
Sun Mar 19 2017 00:00:00 GMT+0300 (RTZ 2 (зима))
tomorrow = Terrasoft.endOfDay(tomorrow)
Tue Mar 21 2017 23:59:59 GMT+0300 (RTZ 2 (зима))

Данила, спасибо.
Привыкнуть не могу что регистр важен.
Заработало, спасибо.

var LogCurrencyUpper = this.get("LogCurrencyRow"); //.value; toUpperCase()
 
							esq = Ext.create("Terrasoft.EntitySchemaQuery", {
								rootSchemaName: "CurrencyRate"
							});
							esq.addColumn("Rate");
							var yesterday = new Date();
							yesterday = Terrasoft.startOfDay(yesterday)
							var today = new Date();
							today = Terrasoft.endOfDay(today)
 
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.EQUAL, "Currency", this.get("LogCurrencyRow").value));
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.GREATER, "StartDate", yesterday));
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.LESS, "StartDate", today));
 
							esq.getEntityCollection(function(response) {
								if (response.success) {
									response.collection.each(function(item) {
										CurrencyRate = item.get("Rate");
									}, this);
								}
								else if (CurrencyRate === 0)
								{
//код
								}

Спасибо еще раз. :smile:

Чтото перестало работать
ошибка в консоли

Error while sending request 
	response status: 500 (FormatException)
	request url: ../DataService/json/SyncReply/SelectQuery
	method: POST
	request data: {"rootSchemaName":"CurrencyRate","operationType":0,"filters":{"items":{"b5859fc2-36c6-4b78-a147-1a8f8cbff7cd":{"filterType":1,"comparisonType":3,"isEn...
var _tomorrow = new Date();
							_tomorrow.setDate(_tomorrow.getDate() + 1);
							var _yesterday = new Date();
							_yesterday.setDate(_yesterday.getDate() - 1);
 
							_tomorrow = Terrasoft.endOfDay(_tomorrow);
							_yesterday = Terrasoft.startOfDay(_yesterday);
 
 
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencyRow));
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.GREATER, "StartDate", _yesterday));
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.LESS, "StartDate", _tomorrow));
 
							esq.getEntityCollection(function(response) {
 
}
 
								else
								{
									}

Интересная вещь в хроме время нормальное показывает, а в файрфоксе по гринвичу.
Данный главное есть.

Id CreatedOn CreatedById ModifiedOn ModifiedById StartDate EndDate CurrencyId Rate ProcessListeners RateMantissa
906BD40D-2955-4E62-9F84-44B46CB6F5BF 2017-03-22 10:08:54.057 NULL 2017-03-22 10:08:54.057 NULL 2017-03-22 NULL C0057119-53E6-DF11-971B-001D60E938C6 62.2699 0

Еще нашел такое у responce

В "{0}" ожидалось шестнадцатеричное значение 0x.

Нашел свой косяк.

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                                        this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencyRow.value));
Показать все комментарии

Добрый день.
Не могу корректно настроить колонки в двухуровневом справочнике. bpm'online 7.9.1.
В настройках схем выделенных колонок нет. но при открытии справочника они отображаются.

вот схемы:


Нравится

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


1. Правая кнопка мыши на шапке таблицы,
2. настроить колонки.

Настраивал. При открытии справочника колонки возвращаются.

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

"Зверев Александр" написал:

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


В том то и дело что на схеме страниц реестра нет данных колонок, при предпросмотре они не отображаются, а вот когда открываю из справочника они появляются...
В БП я нигде не нашёл как можно настроить колонки. Можете подсказать где искать?

А если в странице реестра добавить эту колонку, но со снятой галкой «Отображать в реестре»?

Также учтите, что пользовательская настройка видимости и ширины колонок в интерфейсе 5.Х хранится в профиле пользователя. Вы можете очистить профиль пользователя (удалением записей пользователя в SysProfileData) и все колонки во всех реестрах будут сброшены к значениям из дизайнера.

"Зверев Александр" написал:

А если в странице реестра добавить эту колонку, но со снятой галкой «Отображать в реестре»?

Также учтите, что пользовательская настройка видимости и ширины колонок в интерфейсе 5.Х хранится в профиле пользователя. Вы можете очистить профиль пользователя (удалением записей пользователя в SysProfileData) и все колонки во всех реестрах будут сброшены к значениям из дизайнера.


Галочка "Отображать в реестре" снята.
Дело в том что эта колонка установлена в настройках объекта как "Наименование".
Если установить в данное поле другую колонку, то установленная колонка и отображается и не поддаётся настройкам.

Значит, специально выводится первичная для отображения.
Возможно, получится программно скрыть логикой на странице реестра, задав на PageLoadComplete её невидимость.

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

Всем доброго времени суток.

Версия 7.9 sales.

На странице создания письма EmailPage существует специальное поле Кому со справочником E-mail адресов (см. скриншот).

Возможно ли вывести в виде отдельной колонки связанные контакты, а не просто id?

Уточню вопрос. Допустим, я переопределю объект VwRecepientEmail и добавлю в него справочную колонку Контакт. Где происходит добавление записей в VwRecepientEmail, на каком этапе после сохранения контакта? По идее тогда можно вытащить по id из соседней колонки запросом данные контакта и подставить их в нужную колонку.

И не нарушит ли такое переопределение и добавление работу справочника адресов?

Нравится

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

"Смородинов Денис" написал:Где происходит добавление записей в VwRecepientEmail

Нигде. Это вьюшка.
"Смородинов Денис" написал:Возможно ли вывести в виде отдельной колонки связанные контакты, а не просто id?

Возможно. Но сначала, хвала тому гению, который во вьюшке [VwRecepientEmail] поле ContactId создал как guid) Порядок действий, чтобы поправить:
1) переопределяете объект "E-mail адреса", добавляете справочную колонку (название например TmContact, ссылка на справочник "Контакт"). Сохраняете, не публикуете
2) ищете в бд VwRecepientEmail, создаете скрипт create, редактируете. Надо в select добавить колонку из объекта. В моём случае:

CREATE VIEW [dbo].[VwRecepientEmail]
AS
SELECT [Id], [Name] + ' <' + [Number] + '>' AS [Email], [d].[UseEmail], [d].[ContactId], [d].[ContactId] AS [TmContactId]...

Дропаете view и пересоздаёте заново с новой колонкой
3) чистите кэш, настраиваете колонки .

Возможно стоит потом sql скрипт вынести в систему, чтобы при обновлении структура вьюшки не полетела

Данила, ясно, спасибо.

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

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

Нравится

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

Здравствуйте, Михаил!

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

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

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

Здравствуйте, Михаил!

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

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


Добрый день, а не подскажите каким образом происходит процесс создания организационных ролей?
В какие таблицы записи делаются. Просто в нашем случае необходимо всё-таки перенести эти роли и реализовываться это будет с помощью sql-сценария.

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

Роли и пользователи хранятся в таблице SysAdminUnit. У каждой роли (кроме "Все сотрудники компании" и "Пользователи портала") заполнено значение поля ParentRoleId, которое хранит значение родительской роли (для отрисовки позиции роли в организационной структуре).

Вхождение пользователя в роли определено в таблице SysUserInRole. После выполнения действия актуализации ролей, данные переносятся в таблицу SysAdminUnitInRole.

Также см. чуть подробнее тут.

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

Доброго времени суток!
Столкнулся с данной проблемой при переносе системных настроек, а вернее их значений.
Системные настройки связаны с визированием моего (нового) раздела Заявки на обучение.
Итак при попытке перенести системные настройки всё проходит гладко, за исключением одного но.
Значения не удается перенести в созданные системные настройки.
Обе настройки были созданы по подобию существующих. И после того как установлены новые настройки, в БД в таблице SysSettingValue значения для соответствующих настроек есть, но в системе поле отвечающее за это значение "Значение по умолчанию" остается пустым, а если в него попытаться добавить объект из справочника, то не сохраняется.
В чем может быть проблема или объясните, каким образом перенести данные системные настройки? Ниже приведу листинг sql-сценариев для установки значений.

DECLARE @email UNIQUEIDENTIFIER;
SET @email = (SELECT Id FROM dbo.EmailTemplate WHERE Name = 'Шаблон уведомления о новой визе заявки на обучение')
DECLARE @schemaId UNIQUEIDENTIFIER;
SET @schemaId = (SELECT Id FROM dbo.SysSettings WHERE Name = 'Шаблон Email для отправки информации о визе заявки на обучение')
INSERT INTO dbo.SysSettingsValue (SysSettingsId, SysAdminUnitId, GuidValue, Position)
VALUES (@schemaId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', @email, '2147483647')


DECLARE @schemaId uniqueidentifier;
SET @schemaId = (SELECT Id FROM dbo.SysSettings WHERE Name = 'Процесс визирования заявки на обучение')
DECLARE @processUId uniqueidentifier;
SET @processUId = (SELECT Id FROM dbo.SysSchema WHERE Name = 'Визирование заявки на обучение')
INSERT INTO dbo.SysSettingsValue (SysSettingsId, SysAdminUnitId, GuidValue, Position)
VALUES (@schemaId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', @processUId, '2147483647')

Нравится

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

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

Необходимо заполнить еще одно поле. Исправил SQL запрос:

INSERT INTO dbo.SysSettingsValue (SysSettingsId, SysAdminUnitId, GuidValue, Position, isDef)
VALUES (@schemaId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', @processUId, '2147483647', 1)

Попробуйте так. также хочу обратить внимание, что для роли 'A29A3BA5-4B0D-DE11-9A51-005056C00008' в SysSettingsValue должно быть одно значение.

"Демьяник Алексей" написал:

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

Необходимо заполнить еще одно поле. Исправил SQL запрос:

INSERT INTO dbo.SysSettingsValue (SysSettingsId, SysAdminUnitId, GuidValue, Position, isDef)

VALUES (@schemaId, 'A29A3BA5-4B0D-DE11-9A51-005056C00008', @processUId, '2147483647', 1)

Попробуйте так. также хочу обратить внимание, что для роли 'A29A3BA5-4B0D-DE11-9A51-005056C00008' в SysSettingsValue должно быть одно значение.


Добрый день, предполагаете что в недостатке этой колонки была ошибка?
Сами системные настройки были перенесены через данные, а вот значения таким образом не получилось. И как я писал выше, в эти созданные системные колонки не получается значения установить.
Наличие id справочников в бд есть, а в приложении они отсутствуют.
Так же обращу внимание, что у большинства, если не у всех, значений сис. настроек SysAdminUnitId это именно этот Id и он относится ко Всем сотрудникам компании.

Здравствуйте, Михаил.

Проблема заключается в недостающих колонках в таблице SysSettingsValue. Пример для системной настройки, работающей с справочником Активность:

insert into SysSettings values (NEWID(), GETDATE(), GETDATE(), '410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00',
'test', 'Lookup', 0, 1, NULL, 'test', '', 0, 'C449D832-A4CC-4B01-B9D5-8A12C42A9F89', 0)
 
insert into SysSettingsValue values (NEWID(), GETDATE(), GETDATE(), '410006E1-CA4E-4502-A9EC-E54D922D2C00', '410006E1-CA4E-4502-A9EC-E54D922D2C00',
'13056A6F-93C8-4F18-8CC2-2423E8EF30DC', 'A29A3BA5-4B0D-DE11-9A51-005056C00008', 1, '', 0, 0.00, 0, NULL,
'DFC877FE-B6B5-46C7-9346-A703D858B14E', NULL, 2147483647, 0)

Оба запроса выполнялись последовательно и переменных объявлять не требовалось.

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

Всем доброго времени суток.

Версия 7.9 sales.

Ситуация такая: добавили в деталь Средства связи Контакта вторую колонку Email (может быть два адреса у контакта). Ей выставили соответствующий тип.

Но на детали фактически созданное поле является текстовой строкой (см. скриншот). Как её сделать такой же ссылкой?

Нравится

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