Тип свойства: выражение

Иногда бывает полезно вычислять некоторые значения свойств на основе уже имеющихся. Например, объем упаковки (параллелепипеда со сторонами a, b и c) вычисляется по формуле V = a * b * c.

Пример посложнее: вычислить массу автомобильной шины с пригодной для практического применения точностью можно по формуле M = 0.000014 * (D ^ 1.6) * (W * 17 + W * (H - 15) * 0.69), где D - посадочный диаметр в дюймах, W - ширина в миллиметрах, H - высота в процентах от ширины.

Для вычисления таких значений в catalog.app есть тип свойства "выражение". Впрочем, его возможности гораздо шире, это полноценный язык программирования.

Свойство создаётся обычным порядком — вкладка «Свойства», кнопка «Создать», тип «Выражение». Сам текст выражения пишется в поле «Значение по умолчанию»; для длинных формул у поля есть полноэкранный редактор.

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

Дополнительно доступна функция возведения в степень pow.

Данные товара доступны в объекте model. Проверить выражение можно кнопкой «Тест»: укажите Id товара, который послужит тестовым, — в окне «Результаты» появится вычисленное значение или сообщение об ошибке. Кнопка «Модель» показывает сам объект model для этого товара, чтобы было видно, как называются поля и свойства.

Все сохранения и тесты выражений попадают в историю шаблонов Scriban — туда можно вернуться, если формула перестала считать то, что нужно.

В объект с данными товара другие вычисляемые свойства не добавляются.

Пример модели данных:

{
    "Category": "Шины",
    "Vendor": "Formula",
    "Name": "Шина зимняя(Ice 235/55R17 103T,шипы)",
    "Article": null,
    "Color": null,
    "Ean": "8019227278347",
    "Properties": {
        "Ширина профиля": 235.000000,
        "Диаметр": 17.000000,
        "Шипы": true,
        "Возможность ошиповки": false,
        "Тип автомобиля": ["легковой"],
        "Способ герметизации": ["бескамерные"],
        "Конструкция": "радиальные",
        "Страна производства": "Китай",
        "Высота профиля": 55,
        "Производитель": "Formula",
        "Импортер": "ООО ПОКРЫШКИНО Минский р-н, Щомыслицкий с/с, 31-1 район аг. Озерцо, каб. 107",
        "Ставка НДС": 20.000000
    },
    "Tags": [
        {
            "Id": 1,
            "Name": "Черная пятница"
        },
        {
            "Id": 2,
            "Name": "11.11"
        }
    ]
}

Пример вычисления массы шины по представленной модели:

d = model.Properties["Диаметр"];
w = model.Properties["Ширина профиля"];
h = model.Properties["Высота профиля"];
ret 0.000014 * pow(d, 1.6) * (w * 17 + w * (h - 15) * 0.69);

Результат:

13,653658330880194600000000000