Начало работы с типом данных «Таблица»

Таблица — это тип переменной, представляющий собой массив данных — строк таблицы. Каждая строка является отдельным элементом массива и представляет собой объект, свойства которого определены столбцами таблицы. Важно отметить, что данные в таблице загружаются при загрузке элемента приложения. Это может замедлять загрузку карточек элементов при большом количестве записей в таблице.

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

Так как строки таблицы являются элементами массива, можно посчитать количество строк в таблице с помощью свойства TTable.length, которое возвращает количество элементов массива в виде числа:

        // Присваиваем переменной типа Число количество элементов массива (строк таблицы)
        Context.data.table_length = Context.data.table.length;

Получение значений из футера таблицы

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

    // Проверка на заполненность футера в требуемом столбце
    if (Context.data.table.result.cost) {
    
    // Присваиваем переменной результат столбца Стоимость (тип Деньги). Тип переменной должен совпадать с типом данных в столбце
        Context.data.order_budget = Context.data.table.result.cost;
    }

Получение строки по индексу

Так как таблица является массивом данных, к каждому из элементов можно обращаться с помощью квадратных скобок []. Это значит, что можно работать с нужной строкой, зная её индекс. Стоит помнить, что отсчет элементов массива начинается с нуля.

    /* Проверяем, был ли введен номер нужной строки и достаточна ли длина таблицы
       для получения соответствующей строки */
    if (Context.data.table && Context.data.table.length <= Context.data.rows_number) {
    
    /* Используем индекс строки для того, чтобы присвоить переменной нужную строку
       Нумерация индексов элементов массива начинаются с нуля, поэтому вычитаем единицу */
        const row = Context.data.table![Context.data.rows_number - 1];
    }

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

Метод TTable.delete удаляет конкретную строку из заданной таблицы.

// Получаем заказ
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();

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

В цикле for можно изменять значения каждого из элементов массива. Добавим в строку со стоимостью заказа название валюты (тип данных в столбце СтоимостьСтрока).

    // Проверим, заполнена ли таблица
    if (Context.data.table && Context.data.table.length > 0) {
    
    /* В каждую строку таблицы в столбец Стоимость (строковый тип данных)
       добавляем название валюты */
    for (let row of Context.data.table){
        row.cost = row.cost + ' рублей';
    }
        
    // Обновляем таблицу, если сценарий исполняется на клиентской части
        Context.data.table = Context.data.table;
    }

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

Сортировка данных в таблице

Чтобы выполнить сортировку данных в таблице, можно использовать метод sort(). Он сортирует значения по столбцу, переносит отсортированные значения в пустой массив, а затем возвращает значения в первоначальную таблицу с удалением неотсортированных строк.

    // Проверяем, не пустая ли таблица
    if (Context.data.result_table.length > 0) {
    
    // Передаем таблицу в переменную
        const table = Context.data.result_table;
        
    /* Создаем новый массив, полностью повторяющий нашу таблицу. 
        Метод map() создаёт новый массив с результатом вызова указанной функции (f => f) 
        для каждого элемента массива */
        let sortTable = table.map(f => f);
        
    /* Сортируем данные в массиве от меньшего числа к большему.
        Сортировать будем по свойству 'number'. 
        Для этого используем нативный метод массива sort(). */
        sortTable.sort((a, b) => a.number - b.number);

    /* Удаляем элементы первоначальной таблицы.
        Создаем цикл, который обрабатывает каждый элемент массива — строку таблицы.
        (let i = table.length - 1) — возвращаем количество строк,
        вычитая из длины массива единицу, так как элементы массива отсчитываются от 0;
        (i >= 0) — задаем условие, при котором цикл будет выполняться;
        (i--) — последовательно обрабатываем все элементы */
        for (let i = table.length - 1; i >= 0; i--) {
        
    // Удаляем каждую строку
            table.delete(i);
        };

        for (let i of sortTable) {
        
    /* Вставляем отсортированные строки в массив, который создали на предыдущем шаге.
       Затем вставляем отсортированные значения по столбцам (number, name) */
            const row = table!.insert();
            row.number = i.number;
            row.name = i.name;
        }
    }
    // Инициализируем таблицу заново, если сценарий исполняется на клиентской части
    Context.data.result_table = Context.data.result_table;

Получение номера строки из объекта строки

Метод TTable.indexOf возвращает первый индекс, по которому данный элемент может быть найден в массиве или -1, если такого индекса нет.

    // Проверяем, не являются ли таблица и значение, по которому нужно найти индекс строки, пустыми
    if (Context.data.table.length > 0 && Context.data.row_value) {

    /* Возвращаем номер строки, в которой есть совпадающее значение. 
        Нумерация элементов массива начинается с 0, поэтому добавляем единицу */
        Context.data.row_number = Context.data.table.indexOf(row) + 1;
        
    }

Фильтрация таблицы

Метод TTable.filter создаёт новый массив со всеми элементами, прошедшими проверку, которая задана в передаваемой функции. Метод вызывает переданную функцию callback один раз для каждого элемента, присутствующего в массиве. Затем он создаёт новый массив со всеми значениями, для которых функция callback вернула значение, приводимое к true.

Функция callback вызывается только для индексов массива с уже определёнными значениями; она не вызывается для индексов, которые были удалены или которым значения никогда не присваивались.
Элементы массива, не прошедшие проверку функцией callback, просто пропускаются и не включаются в новый массив.

    // Проверяем, не пустая ли таблица
    if (Context.data.table.length > 0) {
    
    // Передаём в переменную отфильтрованный массив таблицы
        let tab = Context.data.table.filter(i => i.name === Context.data.filter);

    // Очистка прежней таблицы
        if (Context.data.table.length > 0) {
        for (let i = Context.data.table.length - 1; i >= 0; i--) {
        Context.data.table.delete(i);
        }
    // Запись в очищенную таблицу отфильтрованного массива строк
        for (let j = 0; j <= tab.length - 1; j++) {
        let newRow = Context.data.table.insert();
        newRow.name = tab[j].name;
        newRow.cost = tab[j].cost;
        }
            
    /* Инициализируем таблицу заново (требуется, только если сценарий расположен на форме
       и исполняется на клиентской части) */
         Context.data.table = Context.data.table;
        }
    }

Поиск первого элемента массива

Метод TTable.find находит первый элемент массива, соответствующий переданному условию.

    // Проверяем, не пустая ли таблица
    if (Context.data.table.length > 0) {
    
    // Передаём в переменную первую в массиве строку таблицы, подходящую под условия фильтрации
        let tab = Context.data.table.find(i => i.name === Context.data.filter);
    }

Создание массива с результатом вызова функции

Метод TTable.map создаёт новый массив с результатом вызова указанной функции для каждого элемента массива.

    // Проверяем, не пустая ли таблица
    if (Context.data.result_table.length > 0) {
    
    /* Передаём в множественную переменную типа Приложение массив данных 
    из столбца Изделия (тип Приложение)*/
        Context.data.items = Context.data.result_table.map(f => f.product);
    }

Ещё один пример использования TTable.map представлен выше в разделе Сортировка данных в таблице.

Вставка строки в таблицу

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

// Вставляем строку; `row` присваивается ссылка на новую строку
const row = order.data.table!.insert();

// Заполняем строку
row.item = Context.data.product!;
row.amount = Context.data.amount!;

Обновление таблицы

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

Context.data.table = Context.data.table;