snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 3s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
---
title: Создайте календарное представление задач по срокам
description: Отображайте задачи и сроки в календаре.
---
<img src="/images/user-guide/views/calendar-view-zoom.png" style={{width:'100%'}} />
## Требования
В объекте **Tasks** должно быть поле **Due Date** (типа Date или Date & Time).
## Шаги
1. Перейдите в **Tasks**
2. Откройте выпадающее меню представления → **+ Добавить представление**
3. Назовите представление (например, "Календарь задач")
4. Нажмите **Создать**
5. Нажмите **Параметры** и выберите **Календарь** в качестве макета
6. Выберите **Due Date** в качестве поля даты
7. Нажмите **Сохранить**
## Настройка календаря
### Отображение полей на событиях
1. Нажмите **Параметры → Поля**
2. Нажмите **значок глаза**, чтобы показать/скрыть поля
3. Перетащите, чтобы изменить порядок
Рекомендуемые поля для отображения:
* **Title** — название задачи
* **Assignee** — ответственный
* **Status** — текущий прогресс
### Фильтрация календаря
Создавайте целевые представления:
* **Мои задачи**: Фильтр по ответственному = Я
* **Эта неделя**: Фильтр по дате выполнения = Эта неделя
* **Просроченные**: Фильтр по дате выполнения < Сегодня, статус ≠ Выполнено
## Другие сценарии использования календаря
| Объект | Поле даты | Назначение |
| ------------------------ | ------------- | ------------------------------ |
| Возможности | Дата закрытия | Отслеживать ожидаемые закрытия |
| Пользовательские события | Дата события | Планировать активности |
| Проекты | Крайний срок | Отслеживать сроки проектов |
## Советы
* **Проверяйте еженедельно**: Начинайте каждую неделю с проверки представления календаря
* **Совмещайте с табличным представлением**: Используйте календарь для обзора, таблицу — для деталей
* **Настройте видимость**: Держите личные календари задач со статусом «Не в списке»
## Связанные материалы
* [Представление «Календарь»](/l/ru/user-guide/views-pipelines/capabilities/calendar-view) — все возможности календаря
* [Фильтры и сортировка](/l/ru/user-guide/views-pipelines/capabilities/filters-and-sorting) — фильтрация данных календаря

View File

@@ -0,0 +1,80 @@
---
title: Создайте канбан-представление для проектов
description: Отслеживайте проекты по стадиям с помощью визуальной доски.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
Используйте канбан-представление, чтобы визуализировать ваши проекты (или любой объект со стадиями) в виде карточек, перемещающихся между столбцами.
<VimeoEmbed videoId="927888627" title="Видеодемонстрация" />
## Требования
Вашему объекту нужно **поле Select**, которое будет использоваться в качестве столбцов (например, Статус, Стадия, Этап).
Если его нет:
1. Перейдите в **Настройки → Модель данных**
2. Выберите ваш объект
3. Добавьте поле Select с вариантами стадий
## Шаги
1. Перейдите к вашему объекту (например, Проекты, Задачи)
2. Откройте выпадающее меню представления → **+ Добавить представление**
3. Назовите представление (например, "Доска проекта")
4. Нажмите **Создать**
5. Нажмите **Параметры** и выберите **Kanban** в качестве макета
6. Представление автоматически использует ваше поле Select в качестве столбцов
7. Нажмите **Сохранить**
## Настройка вашей доски
### Отображение ключевых полей на карточках
1. Нажмите **Параметры → Поля**
2. Найдите поля в разделе «Скрытые поля»
3. Нажмите **значок глаза**, чтобы отобразить их на карточках
4. Перетащите, чтобы изменить порядок
<img src="/images/user-guide/kanban-views/filter.png" style={{width:'100%'}} />
### Включить компактный вид
Для общего обзора:
1. Нажмите **Параметры**
2. Включите **Компактный вид**
Карточки показывают только название записи.
<img src="/images/user-guide/kanban-views/compact-view.png" style={{width:'100%'}} />
### Добавление агрегаций
Показывайте количество или итоги вверху каждого столбца:
1. Нажмите на число рядом с названием столбца
2. Выберите агрегацию (Count, Sum и т. д.)
3. Выберите поле, если нужно
## Перемещение карточек
Перетаскивайте карточки между столбцами, чтобы обновить их статус.
<VimeoEmbed videoId="927888627" title="Видеодемонстрация" />
## Пример: доска задач
| Столбец (статус) | Карточки |
| ---------------- | ------------------- |
| **К выполнению** | Новые задачи |
| **В процессе** | Активная работа |
| **Проверка** | Ожидает утверждения |
| **Готово** | Завершено |
## Связанные материалы
* [Канбан-представления](/l/ru/user-guide/views-pipelines/capabilities/kanban-views) — агрегации, компактный вид, стадии
* [Как настроить воронку продаж](/l/ru/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline) — Канбан для возможностей

View File

@@ -0,0 +1,51 @@
---
title: Создание табличного представления с группировкой
description: Организуйте записи в сворачиваемые группы по значению поля.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
Сгруппируйте табличное представление по полю Select, чтобы организовать записи в сворачиваемые разделы.
<img src="/images/user-guide/table-views/table-group-by.png" style={{width:'100%'}} />
## Шаги
1. Перейдите к объекту (Люди, Компании и т. д.)
2. Откройте выпадающее меню представления → **+ Добавить представление**
3. Назовите представление (например, "Компании по типу")
4. Нажмите **Создать**
5. Нажмите **Параметры → Группировка**
6. Выберите поле Select для группировки
7. Нажмите **Сохранить**
## Настройка порядка групп
В **Параметры → Группировка → Сортировка** выберите порядок групп:
| Вариант | Описание |
| --------------------------------- | --------------------------------------------------------------------- |
| **По алфавиту** | От A до Z |
| **В обратном алфавитном порядке** | От Z до A |
| **Ручной порядок** | Перетащите группы, чтобы изменить порядок, в разделе "Видимые группы" |
Нажмите **значок глаза** рядом с группой, чтобы скрыть её в представлении.
<Note>
**Для лучшей производительности ограничьте количество видимых групп до 10–15.** Если нужно больше, рассмотрите возможность использования вместо этого панели мониторинга.
</Note>
## Пример: Компании по отрасли
1. Перейдите в **Компании**
2. Создайте новое представление с названием "По отрасли"
3. Нажмите **Параметры → Группировка**
4. Выберите поле **Отрасль**
5. Сохранить
Теперь ваши компании организованы по отраслям, что позволяет легко сосредоточиться на одном сегменте.
## Связанные материалы
* [Табличные представления](/l/ru/user-guide/views-pipelines/capabilities/table-views) — все возможности табличных представлений
* [Фильтры и сортировка](/l/ru/user-guide/views-pipelines/capabilities/filters-and-sorting) — сочетайте группировку с фильтрами

View File

@@ -0,0 +1,32 @@
---
title: Ограничьте доступ к своему представлению
description: Контролируйте, кто может видеть ваши настраиваемые представления.
---
Каждое представление (за исключением представлений по умолчанию "All [Object Name]") имеет собственную настройку видимости.
## Шаги
1. Откройте представление, доступ к которому вы хотите ограничить
2. Нажмите **Параметры** в правом верхнем углу
3. Нажмите **Видимость**
4. Выберите **Не в списке**
Теперь ваше представление видно только вам.
## Параметры видимости
| Настройка | Кто может видеть |
| ------------------------ | ----------------------------------- |
| **Рабочее пространство** | Все участники рабочего пространства |
| **Не в списке** | Только вы |
## Заметки
* Представления по умолчанию "All [Object Name]" нельзя перевести в режим "Не в списке"
* Представления в режиме "Не в списке" не отображаются в выпадающем списке представлений у других пользователей
* Вы можете в любой момент изменить видимость обратно на "Рабочее пространство"
## Связанные материалы
* [Настройки представления](/l/ru/user-guide/views-pipelines/capabilities/view-settings) — все параметры настройки представления

View File

@@ -0,0 +1,120 @@
---
title: Настройка воронки продаж
description: Настройте воронку продаж для отслеживания возможностей по стадиям.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
В Twenty воронка продаж — это представление Канбан объекта «Возможности», где каждый столбец соответствует стадии вашего процесса продаж.
## Шаг 1: Настройте стадии
Стадии задаются в поле **Stage** объекта «Возможности».
1. Перейдите в **Настройки → Модель данных**
2. Выберите **Возможности**
3. Найдите и нажмите поле **Stage**
4. Добавьте, удалите или переименуйте стадии в соответствии с вашим процессом
<VimeoEmbed videoId="927890428" title="Видеодемонстрация" />
### Рекомендуемые стадии
| Этап | Назначение |
| ----------------------- | --------------------------------- |
| **Новый** | Только что выявленные возможности |
| **Квалифицированные** | Подтверждённое соответствие |
| **Встреча** | Ведутся обсуждения |
| **Предложение** | Предложение отправлено |
| **Переговоры** | Обсуждение условий |
| **Закрыта — выиграно** | Сделка успешно завершена |
| **Закрыта — проиграно** | Сделка неуспешна |
<Note>
**5-7 этапов оптимальны.** Слишком много этапов затрудняют сканирование трубопровода. Слишком мало кто теряет видимость в прогрессе.
</Note>
## Шаг 2: Создайте представление воронки
1. Перейдите в **Возможности**
2. Откройте выпадающее меню представления → **+ Добавить представление**
3. Назовите его «Воронка продаж»
4. Нажмите **Создать**
5. Откройте **Параметры** и выберите **Канбан** в качестве макета
Представление автоматически использует поле Stage для столбцов.
## Шаг 3: Настройте ваше представление
### Отображение ключевых полей
1. Нажмите **Параметры → Поля**
2. Найдите поля в разделе «Скрытые поля»
3. Нажмите **значок глаза**, чтобы отобразить: Company, Amount, Close Date, Owner
### Включите агрегирование
Показывайте итоги вверху каждого столбца:
1. Щёлкните по числу, отображаемому рядом с названием стадии вверху столбца
2. Выберите тип агрегации (Count, Sum, Average и т. д.)
3. Выберите поле для агрегации (например, Amount)
**Пример:** Показать общую стоимость сделок по этапам, агрегируя поле Amount с помощью Sum.
### Компактный вид (необязательно)
Для обзорного вида с минимальным содержимым карточек:
1. Нажмите **Параметры**
2. Включите переключатель **Компактный вид**
## Шаг 4: Создайте личные и командные представления
### "Моя воронка"
* **Фильтр**: Owner = Me
* **Видимость**: Unlisted (личное представление)
### "Командная воронка"
* **Фильтр**: None (показать всё)
* **Видимость**: Workspace (общее представление)
### "Закрытия в этом месяце"
* **Тип**: Table
* **Фильтр**: Close Date = This month, Stage ≠ Closed Won, Stage ≠ Closed Lost
* **Сортировка**: Close Date по возрастанию
## Работа с возможностями
### Создание возможностей
* Нажмите **+ New** в представлении «Возможности»
* Либо нажмите **+** в столбце нужной стадии
### Переход между стадиями
Перетаскивайте карточки возможностей между столбцами, чтобы обновить их стадию.
<VimeoEmbed videoId="927888627" title="Видеодемонстрация" />
## Лучшие практики
### Гигиена воронки
* Ежедневно обновляйте сделки по мере их продвижения
* Своевременно перемещайте или закрывайте «застоявшиеся» сделки
* Поддерживайте реалистичные даты закрытия
### Дисциплина стадий
* Определите чёткие критерии для каждой стадии
* Своевременно переводите сделки при выполнении критериев
* Не допускайте, чтобы сделки слишком долго застревали на стадиях
## Связанные материалы
* [Канбан-представления](/l/ru/user-guide/views-pipelines/capabilities/kanban-views) — агрегации и компактный вид
* [Фильтры и сортировка](/l/ru/user-guide/views-pipelines/capabilities/filters-and-sorting) — создание отфильтрованных представлений

View File

@@ -0,0 +1,149 @@
---
title: Показать ожидаемую сумму на вашей конвейере
description: Рассчитывайте и отображайте взвешенные значения сделок на основе вероятности по этапам.
---
«Ожидаемая сумма» — вычисляемое значение: **Сумма × Вероятность**. Это помогает прогнозировать выручку, взвешивая сделки по вероятности их закрытия.
<Tip>
Это пример создания [Полей формул](/l/ru/user-guide/workflows/how-tos/crm-automations/formula-fields) с помощью рабочих процессов.
</Tip>
В этом руководстве показана настройка пользовательских полей и рабочих процессов, необходимых для расчета и отображения ожидаемых сумм в вашей воронке.
## Шаг 1: Создайте пользовательские поля
В объекте «Сделки» вам нужны два пользовательских поля.
### Создайте поле «Вероятность»
1. Перейдите в **Настройки → Модель данных → Сделки**
2. Нажмите **+ Добавить поле**
3. Настроить:
* **Название**: Вероятность
* **Тип**: Число
* **Описание**: Вероятность в зависимости от этапа (0–100%)
4. Нажмите **Сохранить**
### Создайте поле «Ожидаемая сумма»
1. Нажмите **+ Добавить поле**
2. Настроить:
* **Название**: Ожидаемая сумма
* **Тип**: Валюта
* **Описание**: Вычисляется: Сумма × Вероятность
3. Нажмите **Сохранить**
### Необязательно: сделайте поля доступными только для чтения для пользователей
Если вы не хотите, чтобы пользователи вручную редактировали эти вычисляемые поля:
1. Перейдите в **Настройки → Участники → Роли**
2. Выберите роль для настройки
3. Найдите объект «Сделки»
4. Установите поля **Вероятность** и **Ожидаемая сумма** как доступные только для чтения
Это гарантирует, что обновлять эти значения смогут только рабочие процессы.
## Шаг 2: Создайте рабочий процесс №1 — обновление вероятности при изменении этапа
Этот рабочий процесс автоматически устанавливает «Вероятность», когда сделка переходит на новый этап.
### Создайте рабочий процесс
1. Перейдите в **Рабочие процессы**
2. Нажмите **+ Новый рабочий процесс**
3. Назовите его "Обновление вероятности при изменении этапа"
### Настройте триггер
1. Добавьте триггер **Запись создана или обновлена**
2. Выберите **Сделки** в качестве объекта
3. Фильтр: поле **Этап** обновлено
### Добавьте ветки для каждого этапа
Создайте ветку для каждого этапа с его вероятностью:
| Этап | Вероятность |
| ------------------- | ----------- |
| Новый | 10% |
| Проверенные | 25% |
| Встреча | 40% |
| Предложение | 60% |
| Переговоры | 80% |
| Закрыта — Выиграна | 100% |
| Закрыта — Проиграна | 0% |
<Note>
Чтобы создать новую ветку, щелкните правой кнопкой мыши на холсте рабочего процесса и нажмите **Новое действие**. Затем свяжите это действие с предыдущим узлом, перетащив стрелку от предыдущего узла к этому новому действию.
</Note>
Для каждого этапа:
1. Добавьте узел **Фильтр**: Этап = [название этапа]
2. Добавьте действие **Обновить запись**:
* Запись: инициировавшая срабатывание сделка
* Поле: Вероятность
* Значение: [вероятность для этого этапа]
### Рассчитать «Ожидаемую сумму»
После объединения веток:
1. Добавьте узел **Фильтр**: поле Сумма не пусто
2. Добавьте действие **Обновить запись**:
* Запись: инициировавшая срабатывание сделка
* Поле: Ожидаемая сумма
* Значение: Сумма × Вероятность
## Шаг 3: Создайте рабочий процесс №2 — пересчет при изменении суммы
Этот рабочий процесс обновляет «Ожидаемую сумму», когда изменяется «Сумма» сделки.
### Создайте рабочий процесс
1. Перейдите в **Рабочие процессы**
2. Нажмите **+ Новый рабочий процесс**
3. Назовите его "Пересчет «Ожидаемой суммы» при изменении «Суммы»"
### Настройте триггер
1. Добавьте триггер **Запись создана или обновлена**
2. Выберите **Сделки** в качестве объекта
3. Фильтр: поле **Сумма** обновлено
### Добавьте логику
1. Добавьте узел **Фильтр**: поле Сумма не пусто
2. Добавьте действие **Обновить запись**:
* Запись: инициировавшая срабатывание сделка
* Поле: Ожидаемая сумма
* Значение: Сумма × Вероятность
## Шаг 4: Отображение в вашей воронке
Теперь покажите итоги по «Ожидаемой сумме» в вашем канбан-представлении:
1. Откройте канбан-представление **Воронка продаж**
2. Нажмите на **число** рядом с названием любого этапа в верхней части столбца
3. Выберите **Сумма**
4. Выберите **Ожидаемая сумма**
Теперь каждый столбец показывает общую взвешенную сумму воронки для этого этапа.
## Резюме
| Компонент | Назначение |
| -------------------------- | ------------------------------------------------------------------------------------ |
| **Поле «Вероятность»** | Хранит вероятность выигрыша в зависимости от этапа |
| **Поле «Ожидаемая сумма»** | Хранит значение «Сумма × Вероятность» |
| **Рабочий процесс №1** | Обновляет «Вероятность» при изменении «Этапа», затем пересчитывает «Ожидаемую сумму» |
| **Рабочий процесс №2** | Пересчитывает «Ожидаемую сумму» при изменении «Суммы» |
| **Агрегация** | Отображает сумму поля «Ожидаемая сумма» по каждому этапу |
## Связанные материалы
* [Поля формул](/l/ru/user-guide/workflows/how-tos/crm-automations/formula-fields) — создавайте вычисляемые поля с помощью рабочих процессов
* [Канбан-представления](/l/ru/user-guide/views-pipelines/capabilities/kanban-views) — агрегации столбцов
* [Как создать пользовательские поля](/l/ru/user-guide/data-model/how-tos/create-custom-fields) — настройка полей

View File

@@ -0,0 +1,231 @@
---
title: Отслеживать как долгое время осталось на каждом этапе
description: Отслеживайте скорость сделок, фиксируя момент входа сделок на каждый этап.
---
<Tip>
Это пример создания [полей формулы](/l/ru/user-guide/workflows/how-tos/crm-automations/formula-fields) с помощью рабочих процессов — в частности вычислений дат.
</Tip>
Отслеживание моментов входа сделок на каждый этап помогает выявлять узкие места и измерять скорость сделок.
В этом руководстве показано, как настроить пользовательские поля и рабочий процесс для автоматической фиксации момента перехода сделки на каждый этап и вычисления количества дней, проведённых на предыдущем этапе.
## Шаг 1: Создайте пользовательские поля
Для каждого этапа вам нужны два типа полей:
* **Поля «Дата и время»**: фиксируют, когда сделка вошла на каждый этап
* **Числовые поля**: хранят, сколько дней сделка провела на каждом этапе
### Создайте поля «Последний вход»
1. Перейдите в **Настройки → Модель данных → Сделки**
2. Для каждого этапа нажмите **+ Добавить поле** и настройте:
* **Имя**: Последний вход в [название этапа] (например, «Последний вход — Новый», «Последний вход — Квалификация»)
* **Тип**: Дата и время
* **Описание**: Метка времени, когда сделка вошла на этот этап
3. Нажмите **Сохранить**
Создайте эти поля:
* Последний вход — Новый
* Последний вход — Квалификация
* Последний вход — Встреча
* Последний вход — Предложение
* Последний вход — Переговоры
* Последний вход — Закрыта — выиграна
* Последний вход — Закрыта — проиграна
### Создайте поля «Дней на этапе»
1. Для каждого этапа нажмите **+ Добавить поле** и настройте:
* **Имя**: Дней на [название этапа] (например, «Дней на Новом», «Дней на Квалификации»)
* **Тип**: Число
* **Описание**: Количество дней, проведённых на этом этапе
2. Нажмите **Сохранить**
Создайте эти поля:
* Дней на Новом
* Дней на Квалификации
* Дней на Встрече
* Дней на Предложении
* Дней на Переговорах
<Note>
Поля «Дней на этапе» не нужны для этапов «Закрыта — выиграна» и «Закрыта — проиграна», так как это финальные этапы.
</Note>
### Необязательно: сделайте поля только для чтения
Если вы не хотите, чтобы пользователи вручную редактировали эти вычисляемые поля:
1. Перейдите в **Настройки → Участники → Роли**
2. Выберите роль для настройки
3. Найдите объект «Сделки»
4. Сделайте поля «Последний вход» и «Дней на этапе» доступными только для чтения
## Шаг 2: Создайте рабочий процесс
Один рабочий процесс решает обе задачи:
* Записывает метку времени при входе на новый этап
* Вычисляет количество дней, проведённых на предыдущем этапе
### Создайте рабочий процесс
1. Перейдите в **Рабочие процессы**
2. Нажмите **+ Новый рабочий процесс**
3. Назовите его «Отслеживание времени по этапам»
### Настройте триггер
1. Добавьте триггер **Record Updated**
2. Выберите **Сделки** как объект
3. Фильтр: обновлено поле **Этап**
### Добавьте ветви для каждого этапа
<Note>
Чтобы создать новую ветвь, щёлкните правой кнопкой мыши на холсте рабочего процесса и нажмите **Новое действие**. Затем свяжите это действие с предыдущим узлом, перетащив стрелку от предыдущего узла к новому действию.
</Note>
---
**Ветвь 1: Этап = Новый (первый этап)**
Поскольку это первый этап, фиксируется только время входа — предыдущего этапа, от которого можно было бы производить вычисления, не существует.
1. Добавьте узел **Filter**: Этап = Новый
2. Добавьте действие **Code**:
```javascript
export const main = async (): Promise<object> => {
return { now: new Date().toISOString() };
};
```
3. Добавьте действие **Update Record**:
* Запись: инициировавшая триггер сделка
* Поле: Последний вход — Новый
* Значение: `now` из узла Code
---
**Ветвь 2: Этап = Квалификация**
При переходе к «Квалификации» запишите время входа И рассчитайте дни, проведённые на «Новом».
1. Добавьте узел **Filter**: Этап = Квалификация
2. Добавьте действие **Code**:
```javascript
export const main = async (params: {
lastEnteredPreviousStage: Date;
}): Promise<object> => {
const { lastEnteredPreviousStage } = params;
const now = new Date();
const entryDate = new Date(lastEnteredPreviousStage);
const diffTime = Math.abs(now.getTime() - entryDate.getTime());
const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
return {
now: now.toISOString(),
daysInPreviousStage: daysInPreviousStage
};
};
```
3. Настройте вход узла Code: сопоставьте `lastEnteredPreviousStage` с полем **Последний вход — Новый**
4. Добавьте действие **Update Record**:
* Запись: инициировавшая триггер сделка
* Поля для обновления:
* Последний вход — Квалификация = `now`
* Дней на Новом = `daysInPreviousStage`
---
**Ветвь 3: Этап = Встреча**
При переходе к «Встрече» запишите время входа И рассчитайте дни, проведённые на «Квалификации».
1. Добавьте узел **Filter**: Этап = Встреча
2. Добавьте действие **Code**:
```javascript
export const main = async (params: {
lastEnteredPreviousStage: Date;
}): Promise<object> => {
const { lastEnteredPreviousStage } = params;
const now = new Date();
const entryDate = new Date(lastEnteredPreviousStage);
const diffTime = Math.abs(now.getTime() - entryDate.getTime());
const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
return {
now: now.toISOString(),
daysInPreviousStage: daysInPreviousStage
};
};
```
3. Настройте вход узла Code: сопоставьте `lastEnteredPreviousStage` с полем **Последний вход — Квалификация**
4. Добавьте действие **Update Record**:
* Запись: инициировавшая триггер сделка
* Поля для обновления:
* Последний вход — Встреча = `now`
* Дней на Квалификации = `daysInPreviousStage`
---
**Продолжите для оставшихся этапов:**
| Этап | Записи | Вычисляет |
| ------------------- | ------------------------------------ | ------------------- |
| Предложение | Последний вход — Предложение | Дней на Встрече |
| Переговоры | Последний вход — Переговоры | Дней на Предложении |
| Закрыта — выиграна | Последний вход — Закрыта — выиграна | Дней на Переговорах |
| Закрыта — проиграна | Последний вход — Закрыта — проиграна | Дней на Переговорах |
Ветви не обязаны сходиться — каждая выполняется независимо, когда выполняется условие её этапа.
## Шаг 3: Проанализируйте время на этапе
Имея метки времени и количество дней, вы можете анализировать скорость сделок.
### Создайте представление «Медленные сделки»
1. Создайте табличное представление «Сделки»
2. Добавьте столбцы: Название, Этап, Дней на [предыдущем этапе], Сумма
3. Отсортируйте по полю «Дней на этапе» (по убыванию)
4. Отфильтруйте по полю «Этап», чтобы сосредоточиться на одном этапе
Сделки вверху провели больше всего времени на предыдущем этапе.
### Используйте агрегации
В канбан-представлении вашей воронки:
1. Нажмите на число рядом с названием этапа
2. Выберите **Среднее**
3. Выберите поле «Дней на этапе»
Это покажет среднее время, которое сделки проводят на каждом этапе.
## Резюме
| Компонент | Назначение |
| ----------------------------- | ------------------------------------------------------- |
| **Поля «Последний вход»** | Хранят момент входа сделки на каждый этап |
| **Поля «Дней на этапе»** | Хранят количество дней, проведённых на каждом этапе |
| **Рабочий процесс** | Записывает метку времени И вычисляет дни за один проход |
| **Представления и агрегации** | Анализируйте скорость сделок и выявляйте узкие места |
## Связанные материалы
* [Рабочие процессы](/l/ru/user-guide/workflows/overview) — основы автоматизации
* [Как создать пользовательские поля](/l/ru/user-guide/data-model/how-tos/create-custom-fields) — настройка полей
* [Канбан-представления](/l/ru/user-guide/views-pipelines/capabilities/kanban-views) — агрегации