﻿# Тип данных «Таблица»

> [HTML Version](360010201779.html)

**Таблица** — это особый [тип поля](360009707032.md), который можно использовать как в приложениях, так и в бизнес-процессах. Добавив его на форму, вы сможете структурировать данные по строкам и колонкам, изменять их внешний вид и вставлять специальные формулы, которые будут выполнять расчёты.

Например, на [форму приложения](360009918011.md) **Заказ** можно добавить таблицу, в которой будут перечислены все наименования, выбранные клиентом. В одну из ячеек можно вставить формулу, чтобы общая стоимость заказа пересчитывалась автоматически в зависимости от количества приобретаемых товаров.   

С версии системы 2026.1 по умолчанию применяется [расширенная функциональность таблицы](table-visibility.md#new-table-functions).

Чтобы использовать изменения в более ранних версиях поставок ELMA365 On‑Premises, при добавлении таблицы на форму в её [настройках](table-visibility.md#new-table) отметьте опцию **Отображать новую версию таблицы**. Опция доступна после включения фича-флага \[OBJECT\]. Подробнее читайте в статьях [«Изменение параметров ELMA365 Enterprise»](change-settings-enterprise.md#enable-feature-flag-enterpeise) и [«Изменение параметров ELMA365 Standard»](change-elma365standard-parameters.md#enable-feature-flag-standard).

````
начало внимание

````
Добавлять и настраивать таблицы могут только пользователи, входящие в группу [Администраторы](360006871932.md#administrators).

````
конец внимание

## ````
Добавить таблицу на форму приложения

Вы можете добавить таблицу на форму как при [создании нового приложения](360007235031.md#from_scratch), так и при [редактировании уже существующего](360009918011.md#edit_form).

Перетащите свойство **Таблица** с боковой панели на форму и задайте настройки:

**(table-gif-1.gif)**

- **Название** — придумайте название таблицы, которое сотрудники увидят на формах создания, просмотра и редактирования элемента приложения;

- **Код\* **— код поля, использующийся при работе с Web API, [скриптами](360028227932.md), шаблонами;

- **Подсказка** — в этом поле можно указать дополнительную информацию, например добавить описание или инструкцию. Это удобный способ помочь сотруднику правильно заполнить таблицу;

- **Представление** — выберите вариант отображения таблицы:

	- **Таблица** — стандартное отображение данных в виде таблицы;

	- **По шаблону** — эту настройку удобно использовать при работе с большими таблицами. Не всегда требуется отображать всю информацию. Например, иногда достаточно показать только итоговую сумму, а все остальные строки можно скрыть. Для этого нужно настроить шаблон.

(hmfile_hash_bcc0d861.png)

В поле **Шаблон** укажите текст, который пользователь увидит на форме, например, **Всего заказов на сумму**.

Нажмите на значок **\{+\}** в конце строки, чтобы добавить итоговое значение одного из столбцов. Эта опция доступна, если таблица уже создана и настроена. В противном случае вы сможете добавить в шаблон только количество строк в таблице.

- **Сделать один заголовок для всех вложенных таблиц** — вы можете расположить одну таблицу внутри другой. При этом по умолчанию в каждой новой строке вложенной таблицы будет отображаться её заголовок. Включите эту опцию, чтобы заголовок отображался только под названием колонки;

- **Настройка таблицы** — нажав на ссылку, вы перейдёте к настройкам таблицы. Подробнее о них читайте в статье [«Настройка поля типа „Таблица“»](table-visibility.md). 

## Добавить колонку в таблицу

В таблицу можно добавлять колонки, определять, какие данные будут отображаться в каждой из них, а также задавать формулы для их автоматического заполнения.    

Чтобы добавить колонку, в окне настройки таблицы нажмите значок **+**. 

**(tables-3.png)**

Выберите тип колонки:

- [Данные ](#data_column)— такие колонки содержат данные только одного типа. Например, числа, адреса электронной почты или элементы приложения. Вы можете выбрать один из стандартных типов, используемых в ELMA365. Подробное описание каждого типа мы приводили в статье [«Типы данных в системе»](360009707032.md).  
  
Если вынести переменную типа **Таблица** на шаблон формы в дизайнере интерфейсов, вы можете привязать к событиям таблицы выполнение скрипта. Он запустится, когда пользователь будет работать с определёнными данными таблицы. Например, при изменении одних ячеек автоматически высчитываются значения других. Подробнее читайте в [статье про настройку событий таблицы](table-events.md);

- [Формула](#formula_column)** **— эта опция доступна только для таких типов данных, как **Строка**, **Деньги** или **Число**. Она позволяет задать формулу для вычисления значения в каждой строке колонки. Заполнить строки вручную нельзя. В формуле могут использоваться:

	- константа — это фиксированное значение, представляющее собой число либо текст и не изменяющееся в процессе расчётов. Строковые константы записываются в двойных кавычках «»;

	- операторы — предназначены для выполнения арифметических действий и возвращают числовое значение. Вы можете складывать, вычитать, умножать и делить числа, используя следующие операторы: +, -, \*, /. Для задания приоритета математических операций используются круглые скобки ();

	- ссылки — указывают на значения из других колонок таблицы или из полей приложения. 

### Колонка типа «Данные»

Чтобы создать колонку, внесите следующую информацию:

- **Отображаемое имя\*** — название колонки, которое будет отображаться на формах создания, просмотра и редактирования элемента приложения; 

- **Имя свойства\*** — название свойства, использующееся при работе с API, скриптами, шаблонами. При необходимости имя свойства можно изменить; 

- **Подсказка**_ —_ пояснительный текст или дополнительное описание, которое будет отображаться в виде всплывающей подсказки при наведении на заголовок колонки; 

- **Тип\* **— [тип данных](360009707032.md), содержащийся в колонке. Например, выбрав тип **Строка** вы сможете заполнить колонку любой текстовой информацией.

````
начало внимание

````
Выбрав тип данных** Строка**,** Деньги** или **Число**, вы сможете вычислить итог по колонке. Для типов **Деньги** и **Число** можно также посчитать сумму, максимум, минимум и среднее значение. Для типа **Строка** вы сможете добавить надпись.

````
конец внимание

### ````
Колонка типа «Формула»

Чтобы понять механизм создания формул, разберём пример.

В приложение **Заказы** добавлена таблица, в которой сотрудник указывает наименование товара, его количество и цену. Расчёт итоговой стоимости можно осуществлять автоматически при помощи формулы. Она представляет собой произведение цены на количество товара.

Создайте колонку типа формула, в которой количество позиций автоматически будет умножаться на стоимость.

Для этого:

1. Нажмите значок **+** и выберите тип **Формула**.   
**(tables-gif-5.gif)**

2. В открывшемся окне введите название поля, например, **Общая стоимость**.

3. В поле **Тип** выберите **Деньги**, так как вычисляется общая стоимость для каждой позиции из заказа.  
  
Обратите внимание, в формулу можно добавить поля такого же типа, который задан для колонки, заполняемой по формуле. Для этого нажмите значок **\{+\}** и в открывшемся списке выберите переменную. Так, в формулу для колонки типа **Строка** добавьте поля типа **Строка**. Для колонки типа **Число** можно задать формулу, используя поля типа** Число**.   
  
Если добавить в формулу переменную другого типа, возникнет ошибка валидации. Исключением является тип **Деньги**. Если вы создаёте формулу для колонки этого типа, можете использовать комбинацию **Деньги\*Число**, то есть значение поля типа **Деньги** можно умножить на значение поля типа **Число**.

4. В поле **Формула** нажмите значок **\{+\}** в конце строки. В открывшемся списке вы увидите название других колонок таблицы и полей приложения. Выберите **Количество** (ссылка на вторую колонку) и **Стоимость за ед. товара **(ссылка на третью колонку). Чтобы перемножить значения второй и третьей колонок, нужно добавить оператор **\***.  

5. Нажмите кнопку **Создать**.

6. Для колонки типа **Формула** можно** **показывать общий итог в футере. Для этого в футере, в выпадающем списке выберите нужную функцию: надпись, сумма, максимум, минимум или среднее значение.

7. Сохраните настройки.

Теперь, заполняя таблицу, сотрудник выберет товар и укажет нужное количество позиций, а стоимость рассчитается автоматически. 

Пример настроенной таблицы

**(hmfile_hash_00c68b90.gif)**

## Удалить колонку или строку из таблицы



Чтобы удалить колонку, перейдите в [настройки таблицы](table-visibility.md#settings). Нажмите значок шестерёнки рядом с названием колонки, которую вы хотите удалить. В открывшемся окне в правом нижнем углу нажмите значок корзины, а затем подтвердите удаление.

## (table-delete-column.png)

Удалить лишнюю строку таблицы можно на форме создания или редактирования приложения одним из доступных способов:

1. Если в настройках активировано [отображение новой версии таблицы](table-visibility.md#new-table), наведите курсор на строку и откройте её контекстное меню, выберите **Удалить**.

2. Если вы не используете новую версию таблицы, наведите курсор на строку, которую необходимо удалить. Нажмите на появившийся слева значок корзины. Вы также можете воспользоваться сочетанием клавиш **Сtrl + Delete** для удаления выделенной строки.  
**(tables-12.png)**

Обратите внимание, если в таблицу добавлены колонки, доступные только для чтения, вы не сможете удалить строку. Чтобы это изменить, в настройках таблицы включите опцию **Разрешать удалять строки с ячейками, доступными только для чтения**.

## Добавить в таблицу данные из другого приложения

При создании таблицы вам может понадобиться сослаться на данные из другого приложения. Предположим, вы ведёте учёт товаров при помощи приложения **Номенклатура**, а все сделки с клиентами фиксируются в приложении **Заказы**. Вы можете добавить таблицу на форму заказа, в которой сотрудники смогут выбирать позиции номенклатуры из выпадающего списка. При этом информация о цене за единицу товара будет автоматически добавляться.

Чтобы выполнить такую настройку, [добавьте поле типа Таблица](#addtable) на форму приложения **Заказы**. Затем в настройках таблицы создайте колонку [Данные](#data_column). В поле **Тип** укажите [Приложение](app-data-type.md)** **и выберите приложение **Номенклатура**. Имя колонки заполняется автоматически и совпадает с названием элемента приложения.   

**(table-8.png)**

Сохраните настройки. На форме появится таблица, которая будет ссылаться на элементы приложения **Номенклатура**. Нажав на ячейку в колонке **Позиция**, сотрудник может выбрать нужный товар или добавить новый элемент приложения, если вы [включили создание элементов в таблице](table-visibility.md#new-table-functions). 

Также в приложении **Номенклатура** хранится информация о стоимости каждой позиции. Вы можете добавить в таблицу колонку типа [Формула](#formula_column) и настроить её так, чтобы информация о стоимости отображалась автоматически, как только пользователь введёт название позиции.

Для этого добавьте новую колонку и выберите **Формула**. В открывшемся окне в поле формула нажмите на значок **\{+\}**. В выпадающем списке выберите **Позиция** (ссылка на первую колонку), а затем **Стоимость за ед. товара** (свойство).

**(hmfile_hash_451b9862.png)**

Теперь сотрудник сможет открыть выпадающий список, выбрать нужную позицию, а стоимость товара подставится автоматически.

## Выдать права на файл в таблице 

Рассмотрим ситуацию, когда:

- на форму приложения добавлено поле типа **Таблица**;

- в колонке таблицы используются данные типа **Файл**;

- пользователю в ходе бизнес-процесса [выданы права на элемент приложения](assign_permissions.md), но он не может просмотреть файл в таблице.

В таком случае назначить права доступа к файлу можно с помощью скрипта, используя метод \[OBJECT\]. 

````
начало внимание

````
Администратор системы всегда имеет доступ к файлам, независимо от назначенных прав.

````
конец внимание

````
Пример скрипта:

````
async function setPerm(): Promise<void> \{  
  
// Найдём текущего пользователя  
const user = await System.users.getCurrentUser();  
  
// Получим текущий элемент приложения  
let app = await Context.data.order.fetch();  
  
    // Обработаем каждую строку с помощью цикла  
    for (let i = app.data.table\!.length - 1; i >= 0; i--) \{  
        const row = app.data.table\!\[i\];  
          
        // Проверим, есть ли в строке файл. Вы можете здесь указать и другие вводные данные, на основе которых можно выдать доступ к файлу  
        if (row.file) \{  
          
            // Создадим новый объект типа TPermissions с доступами на чтение и удаление, выдадим доступы пользователю, записанному в переменную user  
            const permissions = new Permissions(\[  
                new PermissionValue(user, \[PermissionType.DELETE, PermissionType.READ\]),  
                \]);  
                  
            // Выдадим доступы на файл каждой строки  
            await row.file.setPermissions(permissions);  
        \}  
    \}  
\}

````
Обратите внимание, в этом примере права будут выданы только пользователю, записанному в переменную \[OBJECT\]. Все остальные пользователи потеряют доступ к файлу. Чтобы избежать этого, добавьте новые доступы к массиву уже существующих, используя методы \[OBJECT\] и \[OBJECT\]. Пример кода:

````
// Получим текущие доступы  
const currPermission = await row.file.getPermissions()  
  
// Создадим объект доступов  
const NewPermission = new PermissionValue(user, \[PermissionType.DELETE, PermissionType.READ\]);  
  
// Добавим объект доступов к уже существующим доступам на данный файл  
currPermission.values.push(NewPermission);  
await AppFetch.setPermissions(currPermission);
````