Files
upstream-twenty/packages/twenty-docs/l/ru/user-guide/data-model/how-tos/create-many-to-many-relations.mdx
upstream-mirror e7da97194a
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 2s
snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
2026-09-17 23:28:13 +05:00

176 lines
11 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Создание связей многие-ко-многим
description: Связывайте записи, где множество элементов по обе стороны могут быть связаны между собой с помощью объектов-связок.
---
Связи многие-ко-многим позволяют связывать несколько записей с обеих сторон. Например: много людей могут работать над многими проектами, и у каждого проекта может быть много людей.
<Warning>
**Бета-функция**: связи через объект-связку сейчас находятся в бета-версии. Включите их в **Настройки → Сообщество → Функции** прежде чем следовать этому руководству.
</Warning>
<Note>
Для этой функции также требуется включить **Расширенный режим** (переключатель внизу слева в Настройках).
</Note>
## Когда использовать связи многие-ко-многим
Используйте связь многие-ко-многим, когда обе стороны отношений могут иметь несколько связей:
| Связь | Пример |
| --------------- | --------------------------------------------------------------------------------------- |
| Люди ↔ Проекты | Один человек работает над несколькими проектами; у проекта несколько участников команды |
| Компании ↔ Теги | У компании может быть несколько тегов; один тег может относиться к нескольким компаниям |
| Товары ↔ Заказы | Товар может входить в несколько заказов; заказ содержит несколько товаров |
## Как это работает
Twenty использует шаблон **объекта-связки** для связей многие-ко-многим. Объект-связка находится между двумя объектами и хранит связи:
```
People ←→ Project Assignments ←→ Projects
```
У объекта **Project Assignments** (объект-связка) есть:
* Связь с Людьми (многие-к-одному)
* Связь с Проектами (многие-к-одному)
Когда вы включаете переключатель связи через объект-связку, Twenty отображает связанные записи напрямую вместо показа промежуточных записей объекта-связки.
## Требования
1. **Включите Junction Relations в Beta Features**: Перейдите в **Настройки → Сообщество → Функции** и включите **Junction Relations**
2. **Включите Расширенный режим**: переключите **Расширенный режим** внизу слева боковой панели Настроек
3. Спланируйте вашу модель данных:
* Какие два объекта вы соединяете?
* Как назвать объект-связку?
## Шаг 1: Создайте объект-связку
Сначала создайте промежуточный объект, который будет хранить связи.
1. Перейдите в **Настройки → Модель данных**
2. Нажмите **+ Добавить объект**
3. Дайте ему понятное имя (например, "Project Assignment", "Team Member", "Product Order")
4. Включите переключатель «Пропустить создание поля „Имя“»
<img src="/images/user-guide/fields/new-pivot-object.png" alt="Новый объект-связка" />
5. Нажмите **Сохранить**
<Tip>
**Рекомендации по именованию**: Используйте название, описывающее связь, например "Project Assignment" или "Team Membership". Так модель данных становится более понятной.
</Tip>
## Шаг 2: Создайте связи между объектами и объектом-связкой
Добавьте поля связи из каждого из двух объектов в объект-связку.
### Первая связь (Объект A → Объект-связка)
1. Выберите ваш первый объект в **Настройках → Модель данных**
2. Нажмите **+ Добавить связь**
3. Выберите объект-связку (например, "Назначения по проектам")
4. Установите тип связи **Один-ко-многим** (один человек может быть связан со многими назначениями)
5. Назовите поля:
* Поле в объекте Люди: например, "Project Assignments"
* Поле на объекте-связке: например, "Person"
6. Нажмите **Сохранить**
### Вторая связь (Объект B → Объект-связка)
1. Выберите ваш второй объект в **Настройках → Модель данных**
2. Нажмите **+ Добавить связь**
3. Выберите объект-связку (например, "Назначения по проектам")
4. Установите тип связи **Один-ко-многим** (один проект может быть связан со многими назначениями)
5. Включите **"Это связь с объектом-связкой"**
<img src="/images/user-guide/fields/junction-relation-toggle.png" style={{width:'100%'}} />
6. Назовите поля:
* Поле на объекте-связке: например, "Project"
* Поле в объекте Проекты: например, "Team Members"
7. Нажмите **Сохранить**
## Шаг 3: Настройте отображение связи через объект-связку
Теперь настройте исходные объекты так, чтобы отображать связанные записи напрямую, минуя промежуточный объект-связку.
1. Перейдите в **Настройки → Модель данных**
2. Выберите первый объект (например, "Люди")
3. Найдите поле связи, указывающее на объект-связку (например, "Project Assignments")
4. Нажмите, чтобы отредактировать поле
5. Включите **"Это связь с объектом-связкой"**
6. Выберите **Целевую связь** (например, "Project" — поле на объекте-связке, указывающее на другую сторону)
7. Нажмите **Сохранить**
## Результат
После настройки:
* В записи **Person** поле "Project Assignments" показывает **Проекты** напрямую (не записи назначений)
* В записи **Project** поле "Team Members" показывает **Людей** напрямую
Объект-связка по-прежнему существует и хранит связи, но интерфейс показывает более чистое представление многие-ко-многим.
## Пример: Люди ↔ Проекты
Полный пошаговый пример:
### Создайте объект-связку
* Имя: **Project Assignment**
* Описание: "Связывает людей с проектами, над которыми они работают"
### Добавьте связи
1. **Люди → Назначение на проект**
* Тип: Один-ко-многим
* Поле в объекте Люди: "Project Assignments"
* Поле в объекте Assignment: "Person"
2. **Проекты → Назначение на проект**
* Тип: Один-ко-многим
* Поле в объекте Проекты: "Team Members"
* Поле в объекте Assignment: "Project"
### Настройте отображение объекта-связки
1. В объекте **Люди**:
* Отредактируйте поле "Project Assignments"
* Включите переключатель объекта-связки
* Цель: "Project"
2. В объекте **Проекты**:
* Отредактируйте поле "Team Members"
* Включите переключатель объекта-связки
* Цель: "Person"
### Использование
* Откройте запись Person → Просмотрите её проекты напрямую
* Откройте запись Project → Просмотрите участников команды напрямую
* Создавайте новые связи с любой стороны
## Добавление дополнительных данных к связям
Поскольку объект-связка — это настоящий объект, вы можете добавить пользовательские поля для хранения информации о связи:
* **Роль**: "Developer", "Designer", "Manager"
* **Дата начала**: когда человек присоединился к проекту
* **Выделенные часы**: Еженедельное количество часов на этот проект
Чтобы получить доступ к этим данным, перейдите непосредственно к объекту-связке или выполните запрос к нему через API.
## Ограничения
* **Импорт/экспорт CSV**: Прямой импорт связей многие-ко-многим не поддерживается. Вместо этого импортируйте записи в объект-связку.
* **Фильтры**: Фильтрация по связям многие-ко-многим может иметь ограниченные возможности.
## Связанные материалы
* [Поля связей](/l/ru/user-guide/data-model/capabilities/relation-fields) — объяснение типов связей
* [Создание пользовательских объектов](/l/ru/user-guide/data-model/how-tos/create-custom-objects) — как создавать объекты
* [Создание полей связи](/l/ru/user-guide/data-model/how-tos/create-relation-fields) — базовая настройка связей