Вопрос

Добрый день!
На схему редактирования "Заказ" добавил поле "Скидка", значение которого, равномерными частями в зависимости от кол-ва строк заказов, проставляется в соответствующее поле "Сумма скидки" на детали "Продукт в заказе" всего перечня заказов процессом.

Как можно вызвать ре-калькуляцию полей "Итого", "Скидка, %". В коробке данная функция выполняется при смене фокуса поля после редактирования

У меня такой же вопрос

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

Ну четко определитесь по какому событию вы хотите пересчитывать все.

Например такой вариант

1) при смене скидки (вверху) по подписке посылаете в деталь сообщение скидка поменялась.  (Подписаться в атрибуте карточки на смену скидки и создать подписку на событие смена скидки в детали и карточке)

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

Если не понятно как какой то пункт сделать пишите вопросы.

 

Ну четко определитесь по какому событию вы хотите пересчитывать все.

Например такой вариант

1) при смене скидки (вверху) по подписке посылаете в деталь сообщение скидка поменялась.  (Подписаться в атрибуте карточки на смену скидки и создать подписку на событие смена скидки в детали и карточке)

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

Если не понятно как какой то пункт сделать пишите вопросы.

 

Григорий Чех пишет:
Если не понятно как какой то пункт сделать

Спасибо за ваш ответ. Действительно не совсем понятно...

т.е. помимо процесса, на схему страницы "Заказы" добавить метод обработки изменения значения поля "Скидка", результатом которого будет  отправка адресного сообщения, которое, в свою очередь, получит метод обработки схемы редактирования детали "продукт в заказе"

я правильно понял?

Если у вас расчет скидки в "Продукт в заказе" идет в процессе то по изменению поля скидка можно вызывать процесс передавая ему нужные параметры.

Добрый день!
У меня такой же вопрос. Сумму в деталь передать получилось с помощью сообщения. Но как в цикле пройти по строкам детали и изменить значения полей, не используя ESQ, не понимаю? И можно ли таким способом изменить данные детали?

Возможно, обойдётся и без цикла на клиенте. Обновить значения в таблице детали в базе серверной логикой: элементом БП, скриптом с ESQ или Update, а затем обновить деталь, как делают тут.

Спасибо, Александр, за ответ. Т.е. на клиенте использовать механизмы детали не получится? Хотелось бы чтобы автоматически запускались связанные события по цепочке после редактирования/сохранения детали, точно так же когда пользователь работает с данными детали в интерфейсе приложения.

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

Да, в JS на клиенте интересовала логика. Так и придется сделать. Надеялся, что кто то уже такое проделывал, чтобы не изобретать самому велосипед.

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

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

Добрый день.
По аналогии примера сделал редактируемую деталь(смотрите фото в приложении)

По в самой детали есть поля которые рассчитываются по формулам.
А в данном случае их пользователь сам может менять, а чтобы был сделан расчет надо зайти в деталь. Что не удобно.

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

Мой код.

define("UsrNDetail", ["ConfigurationGrid", "ConfigurationGridGenerator",
"ConfigurationGridUtilities"],
function() {
        return {
                entitySchemaName: "UsrN",
                attributes: {
                        "IsEditable": {
                                dataValueType: Terrasoft.DataValueType.BOOLEAN,
                                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                                value: true
                        }
                },
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                diff: /**SCHEMA_DIFF*/[
                        {
                                "operation": "merge",
                                "name": "DataGrid",
                                "values": {
                                        "className": "Terrasoft.ConfigurationGrid",
                                        "generator": "ConfigurationGridGenerator.generatePartial",
                                        "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
                                        "changeRow": {"bindTo": "changeRow"},
                                        "unSelectRow": {"bindTo": "unSelectRow"},
                                        "onGridClick": {"bindTo": "onGridClick"},
                                        "activeRowActions": [
                                                {
                                                        "className": "Terrasoft.Button",
                                                        "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                                                        "tag": "save",                                                  // Значение маркера.
                                                        "markerValue": "save",
                                                        "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                                                },
                                                {
                                                        "className": "Terrasoft.Button",
                                                        "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                                                        "tag": "cancel",
                                                        "markerValue": "cancel",
                                                        "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                                                },
                                                {
                                                        "className": "Terrasoft.Button",
                                                        "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                                                        "tag": "remove",
                                                        "markerValue": "remove",
                                                        "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                                                }
                                        ],
                                        "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
                                        "activeRowAction": {"bindTo": "onActiveRowAction"},
                                        "multiSelect": false
                                }
                        }
                ]/**SCHEMA_DIFF*/,
                mixins: {
                        ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
                },
                methods: {}
        };
});

У меня такой же вопрос

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

Для блокировки полей редактируемого реестра, можно писать бизнес правила блокировки на странице(!) этой детали.
rules: {
"UsrTestInt1": {
"EnabledUsrTestInt1": {
"ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
"property": BusinessRuleModule.enums.Property.ENABLED,
"conditions": [
{
"leftExpression": {
"type": BusinessRuleModule.enums.ValueType.CONSTANT,
"value": true
},
comparisonType: Terrasoft.ComparisonType.NOT_EQUAL,
rightExpression: {
type: BusinessRuleModule.enums.ValueType.CONSTANT,
value: true
}
}
]
}
}
}

Тоже самое касается и обработчиков изменения колонок. Написав атрибут к любой колонке с методом обработки изменения и списком колонок по изменению которых будет вызван данный метод:
"Parent": {
name: "Parent",
dependencies: [
{
columns: ["Account", "OurCompany"],
methodName: "clearParent"
}
]
},

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

Кстати, а VIRTUAL_COLUMN, описанные на странице тоже смогут отображаться в детали?

Да, если добавить в diff описание объекта в который нужно отобразить ее значение.
Пример на Академии: https://academy.terrasoft.ua/documents/technic-sdk/7-9/dobavlenie-vychi…

..

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

Здравствуйте! Нуждаюсь в помощи по двум вопросам.

Вопрос №1

Делаю в БП страницу редактирования Договора. Мне надо чтобы элемент был выполнен только если на детали Продукты есть хотя-бы одна запись. Пробовал сделать через агрегирующий фильтр:

агрегирующий фильтр

После чего я вижу:

ошибка

Пробовал на другие детали, работает как-то выборочно. Например на визу работает, а на активности нет. Поставил зависимости от пакетов:
ContracInOrder, Order, CoreContract, и другие

Пробовал на разных сайтах. Ошибка идентичная.

Данную задачу можно выполнить с помощью элемента "Чтение данных", но интересно почему не работают фильтры и как с ними работать?

Вопрос №2

в БП нужно создать визу в договоре на Контакта у которого
контрагент = Наша компания,
филиал = Контакт текущего пользователя.Филиал
должность = Фин.директор
И когда виза будет подтверждена продолжать БП. Подскажите как это лучше реализовать. Заранее спасибо.

версия 7.5

У меня такой же вопрос

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

Добрый вечер!

Вопрос №1.

Ничего не указывайте в поле "Считать элемент выполненым, если объект соответствует условиям".
После завершения задачи, используйте элемент "Чтение данных". Считайте количество записей в объекте "Продукт в заказе", где Заказ = Id Вашего заказа.
Используйте условные потоки:

  • Если количество = 0, тогда возвращаемся к редактированию заказа
  • Иначе - идем по процессу дальше

Вопрос №2.

1) Используйте элемент "Чтение данных" по объекту "Контакт", с фильтром Контакт = Контакт текущего пользователя
2) Используйте элемент "Чтение данных" по объекту "Контакт", с фильтром Филиал = Чтение данных1.Первый элемент результирующей коллекции.Филиал и Контрагент = Наша компания и Должность = Фин.директор
3) Используйте элемент "Добавить данные" в объекте "Виза договора". Установите визирующим контакта, прочитанного на втором шаге.
4) Используйте "Промежуточный обрабатыващий сигнал" по объекту "Виза договора", событие - изменение записи по Id созданной на предыдущем шаге записи с фильтром Состояние = "Положительная", чтобы отследить изменение состояния в поле "Состояние".

Только учтите, что состояние визы еще может быть "Отрицательным".

1. Я через чтение данных и сделал. Интересовало как работать с агрегирующими фильтрами и работают ли они ?
2. А если будет несколько контактов в должности фин.директор ?
Я пробую записать в объект Виза договора результат выборки по контакту. Но я столкнулся с тем, что колонка визирующий смотрит в объект "Объект администрирования"

Добрый день!

1. Как видно из предоставленных Вами скриншотов, фильтры работают некорректно - было предложено альтернативное решение.
2. Полностью с Вами согласен - виза проставляется либо роли, либо пользователю, поэтому объект действительно "Объект администрирования".
Перед элементом "Добавить данные" используйте еще одно чтение данных по объекту "Объект администрирования" с фильтром Контакт = Id контакта с должностью фин. директор.

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

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