> ## Documentation Index
> Fetch the complete documentation index at: https://docs.twenty.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Формульные поля

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

В Twenty пока нет собственной поддержки формульных полей (планируется в 2026), но того же результата можно добиться с помощью рабочих процессов. Это обходное решение позволяет автоматически вычислять и заполнять значения полей — от простых конкатенаций до сложной бизнес-логики.

## Типичные случаи использования

| Сценарий использования | Пример формулы                       |
| ---------------------- | ------------------------------------ |
| **Полное имя**         | Имя + " " + Фамилия                  |
| **Ожидаемая сумма**    | Сумма × Вероятность                  |
| **Дней до срока**      | Срок - Сегодня                       |
| **Дней на этапе**      | Сегодня - Дата входа в этап          |
| **Оценка лида**        | Баллы на основе нескольких критериев |

<Tip>
  Полный пример отслеживания времени на этапах воронки см. в разделе [Как отслеживать, сколько времени возможности находятся на каждом этапе](/l/ru/user-guide/views-pipelines/how-tos/track-time-in-stage).
</Tip>

## Базовая формула: конкатенация

### Пример: автозаполнение полного имени

**Цель**: автоматически объединять имя и фамилию в поле полного имени.

### Настройка

1. **Триггер**: запись обновлена или создана (Люди)

2. **Фильтр**: проверьте, что изменились имя или фамилия

3. **Действие кода**:

```javascript theme={null}
export const main = async (params) => {
  const { firstName, lastName } = params;

  const fullName = [firstName, lastName]
    .filter(Boolean)
    .join(' ');

  return { fullName };
};
```

4. **Обновить запись**: установить Полное имя равным `{{code.fullName}}`

## Числовая формула: ожидаемая сумма

### Пример: рассчитать ожидаемую выручку

**Цель**: умножить сумму возможности на вероятность, чтобы получить ожидаемую сумму.

Полный рабочий процесс см. в разделе [Как показать ожидаемую сумму в воронке](/l/ru/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline).

### Быстрая настройка

1. **Триггер**: запись обновлена (Возможности, поле Сумма ИЛИ Вероятность)

2. **Действие кода**:

```javascript theme={null}
export const main = async (params) => {
  const { amount, probability } = params;

  const expectedAmount = (amount || 0) * (probability || 0) / 100;

  return { expectedAmount };
};
```

3. **Обновить запись**: установить Ожидаемую сумму равной `{{code.expectedAmount}}`

## Формула даты: вычисление дней

### Пример: дни до срока задачи

**Цель**: вычислить, сколько дней осталось до срока задачи.

### Настройка

1. **Триггер**: запись обновлена или создана (Задачи, поле Срок)

2. **Действие кода**:

```javascript theme={null}
export const main = async (params) => {
  const { dueDate } = params;

  if (!dueDate) {
    return { daysUntilDue: null };
  }

  const due = new Date(dueDate);
  const today = new Date();
  const diffTime = due - today;
  const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));

  return { daysUntilDue: diffDays };
};
```

3. **Обновить запись**: установить поле «Дни до срока» равным `{{code.daysUntilDue}}`

<Note>
  Отрицательные значения означают просроченные задачи. Это поле можно использовать для фильтрации или сортировки задач по срочности.
</Note>

## Условная формула: оценка лида

### Пример: расчет оценки лида на основе критериев

**Цель**: оценивать лидов на основе размера компании, отрасли и вовлеченности.

### Настройка

1. **Триггер**: запись обновлена (Люди или Компании)

2. **Действие кода**:

```javascript theme={null}
export const main = async (params) => {
  const { companySize, industry, hasEmail, hasPhone, source } = params;

  let score = 0;

  // Company size scoring
  if (companySize === 'Enterprise') score += 30;
  else if (companySize === 'Mid-Market') score += 20;
  else if (companySize === 'SMB') score += 10;

  // Industry scoring
  const targetIndustries = ['Technology', 'Finance', 'Healthcare'];
  if (targetIndustries.includes(industry)) score += 25;

  // Contact info scoring
  if (hasEmail) score += 10;
  if (hasPhone) score += 15;

  // Source scoring
  if (source === 'Referral') score += 20;
  else if (source === 'Website') score += 10;

  return { leadScore: score };
};
```

3. **Обновить запись**: установить Оценку лида равной `{{code.leadScore}}`

## Текстовая формула: извлечение домена

### Пример: извлечение домена из email

**Цель**: автоматически извлечь и сохранить домен email.

### Настройка

1. **Триггер**: запись обновлена (Люди, поле Email)

2. **Действие кода**:

```javascript theme={null}
export const main = async (params) => {
  const { email } = params;

  if (!email) return { domain: null };

  const domain = email.split('@')[1]?.toLowerCase();

  return { domain };
};
```

3. **Обновить запись**: установить поле Домен равным `{{code.domain}}`

## Лучшие практики

### Производительность

* Запускайте только при изменении релевантных полей
* Используйте фильтры, чтобы пропускать записи, которым не требуется вычисление
* Избегайте сложных вычислений в высоконагруженных рабочих процессах

### Обработка ошибок

* Проверяйте значения null/undefined перед вычислениями
* Используйте значения по умолчанию при отсутствии данных
* Возвращайте понятные сообщения об ошибках при сбое вычислений

### Тестирование

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

## Связанные материалы

* [Как показать ожидаемую сумму в воронке](/l/ru/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
* [Как отслеживать время на этапе](/l/ru/user-guide/views-pipelines/how-tos/track-time-in-stage)
* [Действия рабочего процесса](/l/ru/user-guide/workflows/capabilities/workflow-actions)
