# Формы задач (MTF/NTF) — Справочник блоков

Справочник описывает типы блоков формы задачи (МТФ/NTF): блоки ДП, группы блоков, БИ-блоки, системные и информационные блоки. Для каждого типа перечислены ключевые поля БД и правила отображения. В конце — правила порядка блоков на форме и ссылки на связанные документы.

## 1–3. Типы элементов, блок ДП и группа блоков

Форма задачи (МТФ) собирается из элементов нескольких типов:

| Тип | Enum | Где хранится | Поле порядка |
|---|---|---|---|
| Блок ДП | `EpBlock` | `ExtParamBlocks` | `[Order]` |
| Группа блоков ДП | `EpBlockGroup` | `ExtParamBlocksGroups` | `OrderInMtf` |
| БИ-блок | `BlockUsed` | `CustomTaskUsedAsEpBlocks` | `[Order]` |
| Системный блок | `MtfSystemBlock` | `SubcatMtfSystemBlocksOrders` | `OrderInMtf` |

Блок ДП (`ExtParamBlocks`) — ключевые поля:

| Поле | Назначение |
|---|---|
| `Id`, `SubcatId`, `Name` | Идентификация блока в категории |
| `[Order]` | Позиция в общем списке МТФ |
| `CanFold`, `DefaultMinimized` | Сворачивание блока |
| `Color` | Цветовое выделение блока |
| `DefaultBlock` | Признак «блок ДП по умолчанию» категории |
| `HiddenSmartFilterId` | Условие скрытия блока |
| `MinimizedSmartFilterId` | Условие сворачивания блока |
| `ExtParamBlocksGroupId` | Принадлежность к группе блоков |

**Блок ДП с таблицей БИ.** В блок ДП можно привязать не только обычные ДП, но и таблицу «Используется» (БИ) — тогда у блока заполнено поле модели `blockUsedTable`, а список обычных ДП (`extParamIds`) может быть пустым. Блок показывается на МТФ, если есть хотя бы один видимый привязанный ДП **или** заполнен `blockUsedTable`. Заголовок берётся из `block.title` (то есть `Name` блока), позиция — из группировки блоков. Таблица БИ внутри блока рисуется тем же компонентом, что и БИ-таблицы вне блоков (см. ниже «БИ-блок»); отличие — здесь она наследует заголовок и позицию своего блока ДП, а не имеет собственный `[Order]`.


Группа блоков ДП (`ExtParamBlocksGroups`) — ключевые поля:

| Поле | Назначение |
|---|---|
| `Id`, `SubcatId`, `Name` | Идентификация группы в категории |
| `OrderInMtf` | Позиция группы в МТФ |
| `CanFold`, `IsDefaultMinimized` | Сворачивание группы |
| `IsHidden` | Принудительное скрытие группы |
| `HiddenSmartFilterId` | Условие скрытия группы |
| `MinimizedSmartFilterId` | Условие сворачивания группы |

**Ограничение уникальности имени.** Пара «категория и имя» группы уникальна (индекс `ux__dbo__ExtParamBlocksGroups__SubcatId__Name`): в одной категории не может быть двух групп с одинаковым именем. Имя, занятое в другой категории, ограничению не противоречит. Занятое имя отклоняется проверкой до записи, а гонка между проверкой и записью перехватывается по нарушению этого индекса, поэтому наружу уходит понятная ошибка, а не отказ базы.

## 4. БИ-блок (`CustomTaskUsedAsEpBlocks`)

Ключевые поля:

| Поле | Назначение |
|---|---|
| `Id`, `SubcatId`, `Name` | Идентификация БИ-блока |
| `[Order]` | Позиция в МТФ |
| `NotShowCreateButton` | Скрыть кнопку создания из блока |
| `VisibilityMode` | Режим видимости блока «Используется» |
| `IsCollapsable`, `IsCollapsedByDefault` | Сворачивание блока |
| `SmartId` | Смарт-условие доступа/видимости блока |

**Вкладки таблиц блока.** Если в блоке настроено несколько таблиц, они показываются вкладками в порядке, заданном в настройках блока. Когда вкладки не помещаются по ширине, остаток списка уходит в выпадающее меню «Ещё»: в строке остаётся начало списка, а в меню — первая непоместившаяся вкладка и все следующие за ней, в том же порядке; активная таблица, оказавшаяся в меню, помечена галочкой.

Порядок вкладок хранится не в настройке таблицы, а в связи таблицы с блоком — `EpBlockSettingsToBlocks.OrderInBlock`. Порядок свой у каждого БИ-блока: одна и та же таблица, привязанная к нескольким блокам, стоит в каждом под своим номером. Это отдельное поле от позиции самого блока на форме (`[Order]` в таблице выше).

### Источник данных таблицы БИ

Строки таблицы берутся из источника, заданного настройками таблицы (`CustomTaskUsedAsEpBlockSettings`):

| Источник | Настройка | Что попадает в блок |
|---|---|---|
| Хранимая процедура | `SPDataSource` | Задачи, которые вернула процедура |
| Смарт-фильтр | `SmartId` | Задачи, прошедшие условие смарт-выражения в контексте открытой задачи |
| Категория-источник | `SubcatId`, `ExtParamID` | Задачи, связанные с текущей через поле ссылки категории-источника; при заполненном `ExtParamID` — только связи через этот ДП |

Имя источника хранимой процедуры хранится в колонке `SPDataSource`. Процедура получает пять параметров: идентификатор задачи, идентификатор пользователя, признак «показывать все задачи» и границы диапазона строк; на PostgreSQL они уходят в функцию как `p_taskid`, `p_userid`, `p_showalltasks`, `p_startindex`, `p_endindex`. Правила записи имени источника и поведение на PostgreSQL — общие с произвольными источниками: см. [Произвольные источники данных](https://help.1forma.ru/domains/grids/custom-data-sources.md) и [Гриды — Администрирование](https://help.1forma.ru/domains/grids/admin.md).

**Состав строк блока одинаков везде, где он показывается.** Отдельной настройки состава для документа или фида нет: те же строки, что на вкладке блока в карточке задачи, уходят в документ по шаблону — теги `TaskUsedAsEp<id>` и `TaskUsedAsEp<id>_all` — и в фид `tasks/feeds/usedinblock`, который запрашивают карточка совещания и мобильное приложение. Скрытые по условию значения показываются во всех трёх местах одинаково ([grids/business.md](https://help.1forma.ru/domains/grids/business.md)).

### Редактирование ячеек

При включённом режиме редактирования таблицы БИ-блок поддерживает мультиредактирование ячеек — аналогично ДП «Таблица» (см. [ext-params/business.md § Редактирование ячеек](https://help.1forma.ru/domains/ext-params/business.md)):

- Выделение непрерывного диапазона ячеек мышью.
- Копирование и вставка через `Ctrl+C` / `Ctrl+V` (`Cmd+C` / `Cmd+V` на macOS).
- Автозаполнение «протягиванием»: значение из одной ячейки распространяется на выделенные ниже строки.

Поддерживаются типы ДП со встроенным редактированием в ячейке: текст, число, деньги, лукап, мультилукап, файл (включая мультифайл) и другие. Для колонки «Файл» двойной клик открывает тот же контрол работы с файлом, что и в карточке задачи — см. [grids/business.md](https://help.1forma.ru/domains/grids/business.md) § «Колонка дополнительного параметра «Файл»». Нередактируемые ячейки (заблокированные правами на статусе или смарт-условиями) остаются недоступными для изменения. При попытке изменить более 100 задач операция отклоняется с предложением использовать пакетную обработку задач — это защита от случайных массовых правок.

## 5. Системные блоки (`MtfSystemBlockTypes`)

Системные блоки добавляются автоматически в зависимости от настроек категории:

| Тип | Назначение |
|---|---|
| `SurveyResultsTable` | Системный блок результатов опросов |
| `ProjectInformation` | Блок проектной информации (процент выполнения, плановые/фактические даты, длительности). Отображается, если категория проектная (`IsForProjects` или `IsForProjectTasks`). На МТФ видимость дополнительно управляется категорийной настройкой `Subcategories.IsProjectInfoBlockVisible` (по умолчанию `1`) — при `0` блок не передаётся в мобильный API |
| `Signatures` | Блок подписей |
| `Attachments` | Блок вложений |
| `Recurrence` | Блок повторений |
| `Resources` | Блок ресурсов |
| `Parameters` | Блок параметров |
| `Links` | Блок связей — см. §6 |
| `Subtasks` | Блок подзадач — см. §6 |

Блок «Шапка задачи» к этому перечню не относится: это обычный блок ДП из `ExtParamBlocks` с признаком `IsSystem` и пустой категорией, который агрегат раздаёт в конфиг каждой категории. Он описан в [Дополнительные параметры — Администрирование](https://help.1forma.ru/domains/ext-params/admin.md).

На форме создания задачи такой блок отдельной группой не выводится: привязанные к нему параметры показывает шапка формы. Правило «из системных блоков в порядок формы создания попадает только блок вложений» относится к типам системных блоков формы; блок ДП с признаком системного на форме создания не выводится вовсе.

## 6. Информационные блоки («Подзадачи» и «Связи»)

Блоки **«Подзадачи»** и **«Связи»** — системные блоки МТФ (типы `Links` и `Subtasks` перечисления `MtfSystemBlockTypes`), которые выводятся одним общим слотом и участвуют в общем порядке блоков (см. §7). Пока порядок системных блоков для категории не пришёл, слот стоит на фиксированном месте: после блока файлов (`Attachments`) и перед разделом ресурсов (`Resources`).

Общие свойства обоих блоков:

- отображаются **только при наличии данных** (скрываются автоматически, если данных нет);
- каждая строка содержит: цветной аватар с иконкой категории, заголовок, приоритет, счётчик вложенных подзадач, список исполнителей (до трёх человек), срок с цветовой индикацией (оранжевый — завтра, красный — просрочено);
- клик по строке открывает задачу в модальном окне;
- доступна кнопка **«Развернуть»** — переход к расширенному просмотру подзадач и связей;
- управление через **меню «⋯»**.

Поведение блоков настраивается на уровне категории отдельно для «Связей» и «Подзадач» (Настройки категории → Основные настройки → Связи и подзадачи): блок можно скрыть, сделать сворачиваемым, задать состояние «свёрнут по умолчанию», включить или отключить показ завершённых задач, а также управлять скрытием и сворачиванием через смарт-выражения. Значения по умолчанию: блок не скрыт, не сворачиваемый, не свёрнут, завершённые задачи не показываются. Если для новой задачи заданы смарт-настройки этих блоков, они не применяются на этапе постановки — пока у задачи ещё нет данных о связях и подзадачах.

### Сортировка строк и меню действий

Строки блоков «Подзадачи» и «Связанные» на МТФ сортируются компонентом `TaskCardRelationshipsSortingComponent`. Доступные варианты заданы enum'ом `TaskCardRelationshipsSorting`: `Created` (по дате создания), `Priority` (по приоритету), `Status` (по статусу), `Performers` (по исполнителям), `Order` (по порядку). Выбор пользователя сохраняется в `localStorage` под ключом `task-card-subtasks-sorting` и применяется единообразно к обоим блокам при следующем открытии карточки.

В меню «⋯» блока доступны действия:

- **«Изменить родительскую»** / **«Как подзадачу»** — открывают `SelectTaskDialogComponent` (подгружается lazy) для выбора родительской задачи или переноса текущей задачи в подзадачи выбранной.
- **«Раскрыть в табличном виде»** — открывает `SubtasksComponent` (подгружается lazy) с полным списком подзадач и связей в табличном представлении с расширенным набором колонок.

Блок «Подзадачи»:

- Всегда показывает **родительскую задачу** (на один уровень выше текущей), если она есть.
- Для каждой задачи-родителя рассчитывается **процент выполнения** — доля закрытых подзадач среди всех подзадач любого уровня вложенности (округляется до целого числа).
- Кнопка **«+»** — быстрое создание новой подзадачи.

Блок «Связи»:

- Связанные задачи **сгруппированы по типам проектных связей**.
- По умолчанию показывает первые **восемь задач**; кнопка **«Показать все»** раскрывает полный список.
- Завершённые задачи выделяются серым цветом.

## 7. Правила порядка и связанные документы

Итоговый порядок блоков на форме формируется платформой по следующим правилам:

1. Порядок формируется платформой единообразно для всех типов блоков.
2. Системные блоки, у которых нет записи в `SubcatMtfSystemBlocksOrders`, добавляются в список с `Order = null`. Клиент получает готовый список порядка (`systemBlocksOrder`) вместе с моделью задачи и вместе с шаблоном новой задачи (`POST tasks/template`); в списке всегда присутствуют все типы `MtfSystemBlockTypes`.
3. После перестановки значения порядков перезаписываются последовательно (`0..N`) по всем типам.
4. Блоки «Подзадачи» и «Связи» учитываются в общем порядке наравне с системными блоками: их позиция хранится в `SubcatMtfSystemBlocksOrders` (тип `MtfSystemBlock` из §1, типы `Links` и `Subtasks` из §5) и пересчитывается той же логикой платформы. При выводе формы эти два блока делят один слот: он занимает позицию того из них, который стоит выше.
5. Порядок применяется на карточке задачи и на форме создания; при обновлении карточки он перечитывается. На карточке задачи в общий порядок попадают все системные блоки вместе с блоками ДП, БИ-блоками и группами блоков. На форме создания из системных блоков в порядок попадает только блок вложений: остальные системные блоки до создания задачи не выводятся.
6. Блоки без заданного порядка выводятся первыми, в исходной последовательности, а блок несгруппированных ДП («Параметры») замыкает эту группу — дальше идут блоки с заданным порядком. Исходная последовательность системных блоков без порядка: результаты опросов, проектная информация, подписи, вложения, связи, подзадачи, повторения, ресурсы, параметры. Настройка «Показывать ДП после блоков» действует только тогда, когда список порядка не пришёл вовсе (пустой `systemBlocksOrder`); в этом случае системные блоки на обеих формах выводятся на фиксированных местах.

См. также:

- [Старая и новая карточка задачи (МТФ/NTF)](https://help.1forma.ru/domains/task-forms/mtf-ntf-differences.md)
