Работа с бизнес-процессами / Работа с таблицами через сценарии

Работа с таблицами через сценарии

Рассмотрим несколько примеров работы с типом данных таблица в сценариях.

В примерах будем использовать два приложения.

Заказы (orders) с полем типа таблица (content), которая состоит из четырех колонок:

Товар (item) — ссылка на приложение Товары;

Цена (price) — цена товара берется из приложения Товары с помощью формулы;

Количество (amount) — количество товара в заказе;

Стоимость (total) — формула $price * $amount . По этой колонке также рассчитывается общая сумма.

01.PNG

Приложение Товары (products), содержит поля:

Наименование (__name) — ключевое поле;

Цена (price) — деньги;

Остаток (stock) — число;

02.PNG

Для каждого примера будем создавать простой бизнес-процесс и запускать его с помощью кнопки на карточке элемента приложения.

07.PNG

Работа с результатом колонки таблицы

Сгенерируем счет по шаблону с указанием общей стоимости заказа из таблицы.

03.PNG

В контексте бизнес-процесса нам понадобится два поля: Заказ (order), типа приложение и Сумма заказа (total_price), типа деньги.

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

async function getTotal(): Promise {
// Получаем заказ
    const order = await Context.data.order!.fetch();
// Записываем в контекст результат колонки total
    Context.data.total_price = order.data.content!.result.total;
}

После этого можно использовать контекстную переменную Сумма заказа в блоке генерация по шаблону.

04.PNG

Удаление строк таблицы

Проверим, есть ли в таблице заказа позиции, в которых не указано количество товара, и удалим такие строки:

05.PNG

async function deleteEmptyRows(): Promise {
    // Получаем заказ
    const order = await Context.data.orders!.fetch();
    // Проходим циклом по каждой строке
    for (let i = order.data.content!.length - 1; i >= 0; i--) {
        const row = order.data.content![i];
        // Проверяем, заполнено ли поле Количество
        if(!row.amount) {
            // Удаляем строку, если не заполнено
            order.data.content!.delete(i);
        }
    }
    // Сохраняем заказ
    await order.save();
}

06.PNG

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

Добавление строк в таблицу

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

08.PNG09.PNG

Затем добавим выбранный товар в таблицу заказа с помощью сценария:

async function addToOrder(): Promise {
    // Получаем заказ
    const order = await Context.data.orders!.fetch();
    // Вставляем строку
    const row = order.data.content!.insert();
    // Заполняем строку
    row.item = Context.data.product!;
    row.amount = Context.data.amount!;
    // Сохраняем заказ
    await order.save();
}

11.PNG

Обновление элементов приложения, используемых в таблице

После успешно выполненного заказа, можно посчитать остатки на складе.

Напишем сценарий, который обновит значение поля Остаток (stock) для всех элементов приложения Товары, выбранных в таблице:

async function updateStock(): Promise {
    // Получаем заказ
    const order = await Context.data.orders!.fetch();
    // Используем цикл, чтобы применить действия к каждой строке таблицы в заказе
    for (let row of order.data.content!) {
        // Получаем выбранный в строке элемент приложения Товары
        const product = await row.item.fetch();
        // Считаем остаток
        product.data.stock! -= row.amount;
        // Сохраняем элемент приложения
        await product.save();
    }
}

После выполнения сценария остатки обновятся:

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