Добавить вычисляемое поле на страницу записи

Средний

Пример. Добавить вычисляемое поле Остаток для оплаты (Payment balance) на страницу заказа. В поле отображается разница между суммой заказа (поле Итого (Total)) и суммой оплаты (поле Сумма оплаты (Payment amount)).

1. Создать схему замещающего объекта 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Замещающий объект (Add —> Replacing object).

  3. Заполните свойства схемы.

    • Код (Code) — "Order".
    • Заголовок (Title) — "Заказ" ("Order").
    • Родительский объект (Parent object) — выберите "Order".
  4. В схему добавьте колонку.

    1. В контекстном меню узла Колонки (Columns) структуры объекта нажмите add_button.
    2. В выпадающем меню нажмите Число —> Деньги (Number —> Currency).

    3. Заполните свойства добавляемой колонки.

      • Код (Code) — "UsrBalance".
      • Заголовок (Title) — "Остаток для оплаты" ("Payment balance").
  5. На панели инструментов дизайнера объектов нажмите Сохранить (Save), а затем Опубликовать (Publish).

2. Создать схему замещающей модели представления страницы заказа 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Замещающая модель представления (Add —> Replacing view model).

  3. Заполните свойства схемы.

    • Код (Code) — "OrderPageV2".
    • Заголовок (Title) — "Страница редактирования заказа" ("Order edit page").
    • Родительский объект (Parent object) — выберите "OrderPageV2".
  4. Настройте расположение вычисляемого поля.

    1. В свойство attributes добавьте атрибут UsrBalance, в котором укажите зависимость от колонок Amount и PaymentAmount, а также метод-обработчик calculateBalance().
    2. В свойстве methods реализуйте методы:

      • calculateBalance() — метод-обработчик события изменения колонок Amount и PaymentAmount. Используется для расчета значения колонки UsrBalance, которая указана в атрибуте UsrBalance.

        В методе-обработчике необходимо учесть тип данных, который будет получен в результате выполнения и отображен в вычисляемом поле. Например, тип данных Дробное число (0.01) (Decimal (0.01)) предполагает число с двумя знаками после запятой. В таком случае перед записью результата в поле объекта необходимо преобразовать тип данных с помощью функции toFixed(). Исходный код примера преобразования типа данных представлен ниже.

        Пример преобразования типа данных
        /* Расчет разницы между значениями в колонках [Amount] и [PaymentAmount]. */
        var result = amount - paymentAmount;
        /* Результат расчета присваивается в качестве значения колонке [UsrBalance]. */
        this.set("UsrBalance", result.toFixed(2));
        
      • onEntityInitialized() — переопределяет базовый виртуальный метод. Срабатывает после выполнения инициализации схемы объекта страницы записи. В метод onEntityInitialized() добавьте вызов метода-обработчика calculateBalance(), который обеспечит расчет суммы остатка для оплаты в момент открытия страницы записи, а не только после изменений в колонках-зависимостях.
    3. В массив модификаций diff добавьте конфигурационный объект с настройками расположения вычисляемого поля.

    Исходный код схемы замещающей модели представления страницы заказа представлен ниже.

    OrderPageV2
    define("OrderPageV2", [], function() {
        return {
            /* Название схемы объекта страницы записи. */
            entitySchemaName: "Order",
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            /* Атрибуты модели представления. */
            attributes: {
                /* Название атрибута модели представления. */
                "UsrBalance": {
                    /* Тип данных колонки модели представления. */
                    dataValueType: Terrasoft.DataValueType.FLOAT,
                    /* Массив конфигурационных объектов, которые определяют зависимости колонки [UsrBalance]. */
                    dependencies: [
                        {
                            /* Значение колонки [UsrBalance] зависит от значений колонок [Amount] и [PaymentAmount]. */
                            columns: ["Amount", "PaymentAmount"],
                            /* Метод-обработчик, который вызывается при изменении значения одной из колонок [Amount] и [PaymentAmount]. */
                            methodName: "calculateBalance"
                        }
                    ]
                }
            },
            /* Методы модели представления страницы записи. */
            methods: {
                /* Переопределение базового метода Terrasoft.BasePageV2.onEntityInitialized, который срабатывает после окончания инициализации схемы объекта страницы записи. */
                onEntityInitialized: function() {
                    /* Вызывается родительская реализация метода. */
                    this.callParent(arguments);
                    /* Вызов метода-обработчика, который рассчитывает значение колонки [UsrBalance]. */
                    this.calculateBalance();
                },
                /* Метод-обработчик, который рассчитывает значение колонки [UsrBalance]. */
                calculateBalance: function() {
                    /* Проверка выполнения инициализации колонок [Amount] и [PaymentAmount] в момент открытия страницы записи. Если нет, то для них устанавливаются нулевые значения. */
                    var amount = this.get("Amount");
                    if (!amount) {
                        amount = 0;
                    }
                    var paymentAmount = this.get("PaymentAmount");
                    if (!paymentAmount) {
                        paymentAmount = 0;
                    }
                    /* Расчет разницы между значениями колонок [Amount] и [PaymentAmount]. */
                    var result = amount - paymentAmount;
                    /* Результат расчета присваивается в качестве значения колонке [UsrBalance]. */
                    this.set("UsrBalance", result);
                }
            },
            /* Отображение поля на странице записи. */
            diff: /**SCHEMA_DIFF*/[
                /* Метаданные для добавления на страницу записи вычисляемого поля. */
                {
                    /* Выполняется операция добавления элемента на страницу. */
                    "operation": "insert",
                    /* Мета-имя родительского контейнера, в который добавляется поле. */
                    "parentName": "Header",
                    /* Поле добавляется в коллекцию элементов родительского элемента. */
                    "propertyName": "items",
                    /* Мета-имя добавляемого поля. */
                    "name": "UsrBalance",
                    /* Свойства, передаваемые в конструктор элемента. */
                    "values": {
                        /* Привязка значения элемента управления к колонке модели представления. */
                        "bindTo": "UsrBalance",
                        /* Настройка расположения поля. */
                        "layout": {
                            /* Номер столбца. */
                            "column": 12, 
                            /* Номер строки. */
                            "row": 2, 
                            /* Диапазон занимаемых столбцов. */
                            "colSpan": 12
                        }
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    });
    
  5. На панели инструментов дизайнера нажмите Сохранить (Save).

Результат выполнения примера 

Чтобы посмотреть результат выполнения примера:

  1. Очистите кэш браузера.
  2. Обновите страницу раздела Заказы (Orders).

В результате выполнения примера на страницу заказа добавлено вычисляемое поле Остаток для оплаты (Payment balance). Значение поля — разница между суммой заказа (поле Итого (Total)) и суммой оплаты (поле Сумма оплаты (Payment amount)).