# Справочник типов ДП

Тип ДП задаётся при создании и **не может быть изменён** после создания. Если тип выбран неверно — удалить ДП и создать заново (удаление невозможно, если ДП используется в задачах).

Порядок типов в списке «Тип» окна «Создать ДП»: первыми идут типы с англоязычными названиями («Lookup поле» — первый пункт); для быстрого выбора есть поиск по названию.

### Полный перечень типов

Все доступные типы ДП, имя типа в базе данных и место хранения значения:

| Тип ДП (рус.) | ExtParamType (БД) | Таблица значений | Поле значения | Денорм. тип |
|---|---|---|---|---|
| Текст | `Text` | `ExtParamValues` | `ExtParamValue`, `ExtParamValueForSort` | `varchar/nvarchar` |
| Большой текст с форматированием | `TextArea` | `ExtParamValues` | `ExtParamValue` | — |
| Большой текст без форматирования | `TextareaWOFormat` | `ExtParamValues` | `ExtParamValue` | — |
| Число | `NumericValue` | `ExtParamValues` | `DecimalValue` | `decimal(18,N)` |
| Деньги | `Money` | `ExtParamValues` | `MoneyValue` | MS SQL — `money`, PostgreSQL — `numeric(19,4)` |
| Дата | `Date` | `ExtParamValues` | `DateTimeValue` | `datetime` |
| Дата и время | `Datetime` | `ExtParamValues` | `DateTimeValue` | `datetime` |
| Флажок (чекбокс) | `Checkbox` | `ExtParamValues` | `BoolValue` / `ExtParamValueForSort` | `bit` |
| Выпадающий список | `Select` | `ExtParamValues` | `ExtParamValue`, `DataSourceItemID` | `varchar/nvarchar(1000)` |
| Выпадающий список с редактированием | `Combobox` | `ExtParamValues` | `ExtParamValue`, `DataSourceItemID` | `varchar/nvarchar(1000)` |
| Дерево | `Tree` | `ExtParamValues` | `ExtParamValue`, `DataSourceItemID` | `varchar/nvarchar(1000)` |
| Lookup (поле подстановки) | `LookUpField` | `ExtParamValueSelectedTasks` | `SelectedTaskID` | `int` |
| Multilookup (выбор нескольких задач) | `MultiSlctSubcatTasks` | `ExtParamValueSelectedTasks` | `SelectedTaskID` | — |
| Выбор пользователей | `SelectUsers` | `ExtParamSelectUsersValues` + `...Groups` + `...OrgUnits` | `UserID` / `GroupID` / `OrgUnitID` | — |
| Таблица | `Table` | `ExtParamTableValues` | `Value` (RowID, ColumnID) | `varbinary(max)` |
| Файл | `File` | `FileStorageFileToExtParamLinks` | `FileId` | — |
| Нумератор | `Numerator` | `ExtParamValues` | `ExtParamValue` | — |
| URL (ссылка) | `URL` | `ExtParamValues` | `ExtParamValue` | — |
| Адрес | `Address` | `ExtParamValues` + `Address` | `AddressId` | `int` |
| Адресаты email | `ExtParamAddressees` | `ExtParamValues` | `ExtParamValue` | — |
| Сквозной | `Through` | — (вычисляется) | — | — |

## Типы ДП: детальное описание

---

### ДП «Текст» (Text)

**Максимальная длина:** 1500 символов.

**Содержимое со спецсимволами.** В значениях текстовых ДП («Текст», «Адрес», «Таблица») сохраняются угловые скобки и XML-подобное содержимое. При этом содержимое, похожее на HTML, при сохранении обрабатывается контент-санитайзером и может быть изменено.

**Хранение в БД:**

- `ExtParamValues.ExtParamValue` — основное значение.
- `ExtParamValues.ExtParamValueForSort` — для сортировки.
- `ExtParams.MaxLength` (INT, nullable) — ограничение длины на уровне определения ДП.

![«Основные настройки» ДП «Текст»: отображение как телефон, локализуемость, подсказка при вводе, настройка маски, регулярное выражение](https://help.1forma.ru/help-images/ext-params/dp_edit_more_text-001.png)

**Настройки:**

- Маска ввода — **только** в ДП «Текст» (синтаксис — формат библиотеки `imask`, шаблон задаётся в `textSettings.mask` (хранится в `TextEpOptions.Mask`), см. [`admin.md` § 9](https://help.1forma.ru/domains/ext-params/admin.md)). Дополнительные параметры маски:
    - `lazy: true` — символы-заполнители проявляются по мере ввода, а не отображаются сразу;
    - `saveUnmaskedValue: true` либо `extParamSettings: { saveUnmaskedValue: true }` — в `ExtParamValues.ExtParamValue` сохраняется значение **без** символов маски (например, для маски `+{7}(000)000-00-00` и ввода `+7(999)123-45-67` в БД попадёт `+79991234567`); в UI отображается с маской. Без `saveUnmaskedValue` сохраняется полное значение с символами маски. **Оба формата** (корневой и через `extParamSettings`) поддерживаются с 2.268.360 — до этой версии работал только корневой `saveUnmaskedValue`, формат через `extParamSettings` игнорировался.
    - С 2.268.360 значение в поле после потери фокуса (Tab, клик вне поля) отображается без задержки — раньше на 300 мс показывалось пустое поле, пока инициализировалась маска, что выглядело как пропажа значения. Само значение в БД сохранялось всегда корректно — баг был чисто визуальным.
- Регулярное выражение (`ExtParams.RegExp`) — валидация введённого значения.
- Сообщение об ошибке регулярного выражения (`ExtParams.RegExpErrorMessage`).
- При одновременно заданных `mask` и `regExp` приоритет — у регулярного выражения (см. [`admin.md` § 9](https://help.1forma.ru/domains/ext-params/admin.md)).
- С 2.268.x масковое значение в гриде корректно обновляется при последовательном переключении между задачами — до этого фикса значение из ранее открытой задачи могло «залипать» в ДП до обновления страницы.
- Отображать ДП «Текст» как телефон (`TextEpOptions.PhoneOption`, bit) — значение отображается с телефонной маской «+X (XXX) XXX-XXXX». При включении заданные регулярное выражение и маска **не применяются** (маска вшита). При интеграции с телефонией рядом со значением выводится кнопка быстрого вызова.
- Локализуемый (`ExtParams.Localizable`, bit) — в карточке задачи у ДП появляется кнопка локализации (модальное окно для ввода значения на активных языках системы); в карточке создания задачи не отображается. Пользователь видит значение в локали своего профиля. ⚠️ Фильтрация в гриде по локализуемым текстовым ДП недоступна — фильтрующий столбец не выводится (текстовых ДП без флага не касается).
- Подсказка при вводе (`TextEpOptions.SuggestType`, enum) — автодополнение по данным DaData: ФИО (`FullName`), Имя (`Name`), Фамилия (`LastName`), Отчество (`Patronymic`), Адрес (`Address`), Email (`Email`); по умолчанию `None` («Выключено»). Требует интеграции с сервисом DaData.


---

### ДП «Большой текст с форматированием» (TextArea)

**Описание:** текст длиной свыше 1000 символов с возможностью форматирования, отключения тегов Microsoft Word и просмотра HTML-кода.

**Хранение:** `ExtParamValues.ExtParamValue`. Содержит HTML-разметку.

**Ограничения:** ДП типов `TextArea` и `File`/`Table` не индексируются при денормализации.

**Редактор** (`TextEpOptions.EditorType`, enum) — доступен только у «Большого текста с форматированием»; задаёт способ ввода и отображения значения.

![«Основные настройки» ДП «Большой текст с форматированием»: поле «Редактор»](https://help.1forma.ru/help-images/ext-params/dp_edit_more_text_area-04.png)

Варианты:

**HTML WYSIWYG** (`HtmlWysiwyg = 0`) — визуальный HTML-редактор (по умолчанию).

![Редактор «HTML WYSIWYG»](https://help.1forma.ru/help-images/ext-params/ep_big_text_html.png)

**Editor.js** (`Editorjs = 1`) — блочный редактор.

![Редактор «Editor.js»](https://help.1forma.ru/help-images/ext-params/ep_big_text_editorjs.png)

**iFrame** (`IFrame = 2`) — встраивание стороннего контента (карты, видео, документы, интерактивные элементы). Поле нередактируемо; значение задаётся автоматизацией HTML-тегом `<iframe>…</iframe>`. Атрибуты: `src` (путь к контенту), `height`, `width` (в пикселях или процентах; `100%` — на всю ширину параметра). Пример: `<iframe width="50%" height="300" src="{ссылка}"></iframe>`.

![Редактор «iFrame»: встроенный сторонний контент](https://help.1forma.ru/help-images/ext-params/ep_big_text_iframe.png)

В режиме iFrame значение очищается перед выводом: посторонняя разметка вокруг тега `iframe` игнорируется, а небезопасный адрес в `src` (исполняемые схемы) не принимается.

**Notes** (`Notes = 4`) — информационный блок с заголовком, текстом и кнопками действий. Поле нередактируемо; данные задаются JSON в «Значении по умолчанию» (в настройке ДП в категории или в самом параметре) до смены редактора. Параметры JSON:

| Поле | Описание |
|------|----------|
| `alertText` | Основной текст заметки |
| `title` | Заголовок блока (необязательно) |
| `color` | Цвет блока (обязательный): `containerPrimary` — бренд, `containerInfo` — синий, `containerDanger` — красный, `containerWarning` — оранжевый, `containerSuccess` — зелёный, `containerDefault` — серый (по умолчанию) |
| `useHtmlText` | Разрешить HTML в тексте |
| `mainBtnText` / `mainBtnId` | Текст и ID смарт-кнопки (из настроек категории) первой кнопки; без текста кнопка не выводится |
| `secondBtnText` / `secondBtnId` | То же для второй кнопки |
| `useCloseIcon` | Кнопка закрытия блока («крестик») |
| `useIcon` | Иконка слева от заголовка |

Пример с кнопками и иконкой:

```json
{ "alertText": "Добавлены новые функции в личном кабинете", "useHtmlText": false,
  "mainBtnText": "Перейти в ЛК", "secondBtnText": "Напомнить позже",
  "useCloseIcon": true, "useIcon": true, "color": "containerDanger",
  "mainBtnId": "cbutton2361", "secondBtnId": "cbutton2361" }
```

![Режим «Notes» с кнопками и иконкой](https://help.1forma.ru/help-images/ext-params/ep_big_text_notes.png)

Пример без кнопок и иконок (только заголовок и текст):

```json
{ "title": "Заголовок блока", "alertText": "Текст заметки…",
  "useHtmlText": false, "useCloseIcon": false, "useIcon": false, "color": "containerInfo" }
```

![Режим «Notes» без кнопок и иконок](https://help.1forma.ru/help-images/ext-params/ep_big_text_notes_2.png)

**Виджет** (`Widget = 3`) — показ кастомной вёрстки через Smart HTML-виджет: контент с полями и картинками во всю ширину параметра, без режима редактирования (как на портале). Данные задаются JSON с `id` виджета и `height` (px) в «Значении по умолчанию» до смены редактора. Виджет читает контекст текущей задачи: использует её ДП для формирования контента, обновляется при смене задачи и при изменении полей, на которые ссылается. Пример: `{"id": 12345, "height": 200}`.

![Режим «Виджет»: кастомная вёрстка (пример «Контакты»)](https://help.1forma.ru/help-images/ext-params/ep_big_text_vidget.png)

**Markdown** (`Markdown = 5`) — форматирование через панель инструментов и синтаксис Markdown.

![Режим «Markdown»: панель инструментов и отформатированный текст](https://help.1forma.ru/help-images/ext-params/btsf_md_01.png)

Для правки в разметке нажмите кнопку режима Markdown (иконка кода) — откроется отдельное окно. Синтаксис: заголовки `========`, жирный `**текст**`, курсив `_текст_`, зачёркнутый `~~текст~~`, маркированные списки `-`/`*`, нумерованные `1.`, ссылки `[Название](url)`, цитата `> текст`, галочка `[ ]`.

![Окно редактирования Markdown: исходная разметка](https://help.1forma.ru/help-images/ext-params/btsf_md_02.png)

В режиме кода можно выбрать язык программирования (Простой текст, C, C#, C++, CSS и др.) для подсветки синтаксиса.

**Вставка из буфера.** Скопированный текст с Markdown-разметкой вставляется в поле размеченным документом — так же, как если набрать его через кнопку режима Markdown. Разбирается текстовая часть буфера, поэтому разметка применяется и при копировании из редакторов с подсветкой синтаксиса (VS Code, Obsidian и подобные): заголовки, списки, цитаты, ссылки, выделение, инлайн-код и блоки кода.

Исключения, одинаковые для вставки и для кнопки режима Markdown: фрагмент, скопированный внутри самого поля, сохраняет своё форматирование; внутри блока кода вставленный текст остаётся текстом, разметка не разбирается; оформление из буфера не переносится — вставка из Word приходит голым текстом, а скопированная картинка вставляется текстом со ссылкой на неё. Вставка без форматирования (`Ctrl`/`Cmd` + `Shift` + `V`) разметку не отключает: чтобы увидеть исходный текст, откройте кнопку режима Markdown.

![Режим кода: выбор языка для подсветки синтаксиса](https://help.1forma.ru/help-images/ext-params/btsf_md_03.png)

**Локализуемый.** Как у ДП «Текст» (см. выше): кнопка локализации в карточке, ввод на активных языках системы, значение показывается в локали профиля; фильтрация в гриде по локализуемым текстовым ДП недоступна.

---

### ДП «Большой текст без форматирования» (TextareaWOFormat)

**Описание:** текст длиной свыше 1000 символов без возможности форматирования.

**Хранение:** `ExtParamValues.ExtParamValue`. Без HTML.

**Регулярное выражение.** Значение проверяется по регулярному выражению целиком: при несоответствии шаблону поле подсвечивается, под ним выводится текст ошибки, сохранение блокируется. Для остальных правил валидации см. [admin.md](https://help.1forma.ru/domains/ext-params/admin.md), раздел «9) Валидация значений».

---

### ДП «Число» (NumericValue)

**Хранение:** `ExtParamValues.DecimalValue`. Денормализация: `decimal(18, N)`, где N = `Scale` из `ExtParamNumberSettings` (длина дробной части; по умолчанию 0).

**Диапазон:** от -9 999 999 999 до 9 999 999 999.
При вводе значения за границами — автоматическая замена на граничное значение **без предупреждения**.

![«Основные настройки» ДП «Число»: тип отображения, длина дробной части, минимальное и максимальное значения, шаг, флаги «Использовать 0 для пустых значений» и «Разделитель групп разрядов»](https://help.1forma.ru/help-images/ext-params/dp_edit_more_number-0.png)

**Режимы отображения:**

- Текстовое поле (по умолчанию).
- Нумератор — требуется указать min, max и шаг.
- Слайдер — визуальная шкала с шагом. Варианты цвета (`SliderColor`): без цвета, интенсивность цвета, температура (по умолчанию).

**Настройки:**

- Длина дробной части (`Scale`, макс. 8 знаков). Настройка **не ограничивает** ввод — оригинальное значение хранится без округления и видно при редактировании.
- Минимальное / максимальное значение (`MinValue` / `MaxValue`); шаг (`Step`) активен только в режимах «Нумератор» и «Слайдер».
- Использовать 0 для пустых значений (`UseZeroAsEmptyValue`; по умолчанию null).

  При включённой настройке пустое значение (null) отображается в табличном представлении как 0. Фильтрация по значению 0 (равно, меньше или равно, больше или равно, содержит) одновременно находит и задачи с реальным значением 0, и задачи с пустым значением. Исключение значения 0 (не равно, не содержит) исключает оба варианта.

- Разделитель групп разрядов (`UseGroupSeparator`; пробел).
- Отображать с дробной частью / без (`IsWithFractionalPart`).

---

### ДП «Деньги» (Money)

**Хранение:** `ExtParamValues.MoneyValue`. Денормализация: MS SQL — `money`, PostgreSQL — `numeric(19,4)`. На обеих СУБД значение хранится с точностью до 4 знаков после запятой.

**Диапазон:** от -922 337 203 685 477 до 922 337 203 685 477.
Автоматическая замена на граничное при превышении, без предупреждения.

![«Основные настройки» ДП «Деньги»: длина дробной части, минимальное и максимальное значения, шаг, флаги «Использовать 0 для пустых значений», «Разделитель групп разрядов», «Отображать с дробной частью»](https://help.1forma.ru/help-images/ext-params/dp_edit_more_money-01.png)

**Настройки** (вкладка «Основные настройки»; хранятся в `ExtParamNumberSettings` — общей с «Число», `Type = Money`):

- Длина дробной части (`Scale`, макс. 4 — денежное значение хранится с точностью до 4 знаков после запятой; в AdminSPA поле ограничено диапазоном 0–4). По умолчанию 2.
- Минимальное / максимальное значение (`MinValue` / `MaxValue`).
- Шаг (`Step`) — **не работает** для данного типа.
- Использовать 0 для пустых значений (`UseZeroAsEmptyValue`).

  При включённой настройке пустое значение (null) отображается в табличном представлении как 0. Фильтрация по значению 0 (равно, меньше или равно, больше или равно, содержит) одновременно находит и задачи с реальным значением 0, и задачи с пустым значением. Исключение значения 0 (не равно, не содержит) исключает оба варианта.

- Разделитель групп разрядов (`UseGroupSeparator`).
- Отображать с дробной частью / без (`IsWithFractionalPart`).

**Сохранение введённого значения** происходит при следующих действиях:

- клик вне поля;
- нажатие Enter;
- потеря фокуса полем;
- нажатие Tab.

---

### ДП «Дата» (Date)

**Хранение:** `ExtParamValues.DateTimeValue`. Денормализация: `datetime`.

![«Основные настройки» ДП «Дата»: видимые даты (от/до) и их режимы, доступные даты (от/до) и их режимы](https://help.1forma.ru/help-images/ext-params/dp_edit_more_date-0.png)

**Настройки** (таблица `ExtParamDateSettings`):

- Видимые даты — диапазон отображаемых дат (`VisibleDateFrom` / `VisibleDateTo`); даты вне диапазона не отображаются.
- Доступные даты — диапазон выбираемых дат (`AvailableDateFrom` / `AvailableDateTo`), подмножество видимых: начало ≥ начала «Видимых», конец ≤ конца «Видимых».

**Валидация при ручном вводе.** При ручном вводе даты в поле (а не выборе через календарь) ограничения «Доступные даты» и «Видимые даты» применяются так же, как при выборе через календарь: после снятия фокуса значение вне диапазона не применяется и не сохраняется в задачу. Ограничение «Видимые даты» теперь блокирует не только отображение в календаре, но и выбор/ввод даты вне заданного диапазона. Поведение единое для ДП «Дата» и компонента даты в ДП «Дата и время».

**Язык интерфейса и формат ввода.** Порядок секций при ручном вводе одинаков во всех языках интерфейса — день, месяц, год, — а введённое значение разбирается по этой маске, а не по формату локали. На сервер уходит календарный день в виде `ГГГГ-ММ-ДД`.

- Режим каждой границы (раздельно «от» и «до» для видимых и доступных дат — `VisibleFromMode` / `VisibleToMode` / `AvailableFromMode` / `AvailableToMode`, enum `DateTypeModes`): фиксированная дата, относительная (Вчера/Сегодня/Завтра) или смарт-выражение (`VisibleDatesSmartExpressionId` / `AvailableDatesSmartExpressionId`).
- При выборе относительного режима (любого, кроме «Дата») поле ввода конкретной даты очищается и блокируется.
- Границы включительны: например, режим «Сегодня» разрешает выбрать сегодняшнюю дату и любую будущую.
- Относительные даты определяются по часовому поясу **профиля пользователя**: «Вчера», «Сегодня» и «Завтра» — это календарные дни в его зоне, и системная зона компьютера границу не сдвигает. Если нужного календарного дня в зоне профиля не существует, он не подменяется соседним: для такой границы узкое ограничение не задаётся, а min/max-границы получают широкий резервный диапазон около ±100 лет — это может выглядеть как отсутствие ограничения.

---

Поведение поля при вводе — выделение фрагмента, набор цифр, клавиатура, режимы — общее для всех мест использования контрола: см. «Контрол ДП Date / DateTime» → «Ввод по фрагментам» в frontend.md.

### ДП «Дата и время» (Datetime)

Аналогично ДП «Дата» (включая ограничения «Видимые/Доступные даты» для компонента даты), но добавляет компонент времени.

**Хранение:** `ExtParamValues.DateTimeValue`. Денормализация: `datetime`.

**Настройки времени** (таблица `ExtParamDateTimeSettings`):

- Формат выбора времени (`TimeSelectionFormat`) — «Свободный» (по умолчанию, произвольный ввод) или «Слоты» (выбор из фиксированных вариантов).
- Диапазон (`TimeRange`) — для режима «Слоты»: «24 часа» или «Рабочее время».
- Шаг (`TimeStep`) — для режима «Слоты»: интервал между вариантами — 5, 15 или 30 минут.

![«Основные настройки» ДП «Дата и время»: формат выбора времени «Слоты», диапазон «Рабочее время», шаг «15 минут»](https://help.1forma.ru/help-images/ext-params/dp_edit_more_datetime.png)

---

Поведение поля при вводе — выделение фрагмента, набор цифр, клавиатура, режимы — общее для всех мест использования контрола: см. «Контрол ДП Date / DateTime» → «Ввод по фрагментам» в frontend.md.

### ДП «Флажок / Чекбокс» (Checkbox)

**Допустимые значения при передаче:** `1`, `0`, `false`, `true`, `да`, `нет`.

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

**Хранение:** `ExtParamValues.BoolValue` / `ExtParamValueForSort`. Денормализация: `bit`.

**Стиль отображения** (поле `CheckboxStyle` в `TextEpOptions`) задаётся на вкладке «Основные настройки» карточки ДП и определяет, как параметр выглядит в задаче:

![«Основные настройки» ДП «Флажок»: поле «Стиль отображения»](https://help.1forma.ru/help-images/ext-params/dp_edit_more_checkbox.png)

**Чекбокс** — стандартный квадрат с галочкой (вид по умолчанию).

![Стиль «Чекбокс»: квадрат с галочкой](https://help.1forma.ru/help-images/ext-params/dp_edit_more_checkbox-1.png)

**Свитчер** — переключатель, наглядно показывающий два состояния: «включено» / «выключено».

![Стиль «Свитчер»: переключатель вкл/выкл](https://help.1forma.ru/help-images/ext-params/dp_edit_more_checkbox-2.png)

**Радио выбор** — два взаимоисключающих варианта: «Да» и «Нет».

![Стиль «Радио выбор»: варианты «Да» / «Нет»](https://help.1forma.ru/help-images/ext-params/dp_edit_more_checkbox-3.png)

**Подпись логического значения.** Там, где значение флажка показывается не квадратом с галочкой, а текстом — колонка ДП «Флажок» в таблице резолюций, снимок задачи, карточка задачи в мобильном приложении, — подпись берётся из словаря локали (блок `common`, ключи `yes` и `no`) и показывается на языке интерфейса: на русском «Да» и «Нет», на остальных языках — из словаря своего языка с откатом на английский, затем на русский. Значение самого параметра при этом не меняется.

---

### ДП «Выпадающий список» (Select)

**Описание:** выбор одного значения из фиксированного перечня.

**Максимальная длина значения:** 200 символов.

**Хранение:** `ExtParamValues.ExtParamValue` (текст) + `DataSourceItemID` (ID элемента). Денормализация: `varchar/nvarchar(1000)`.

![«Основные настройки» выпадающего списка: источник данных, автосортировка, опции отображения радиокнопками](https://help.1forma.ru/help-images/ext-params/dp_edit_more_list-01.png)

**Отображение.** По умолчанию ДП — выпадающий список; флаг «Использовать отображение в виде радиокнопок» (`ExtParamSelectSettings.PresentRadioButtons`) переключает его на блок радиокнопок, а «Расположить радиокнопки в ряд» (`PresentRadioButtonsInRow`) выводит их горизонтально (иначе вертикально). ⚠️ В режиме радиокнопок выбор нельзя отменить — применяйте его только для обязательных ДП и задавайте значение по умолчанию. Опция «Автоматически сортировать по алфавиту» сортирует значения и имеет приоритет над колонкой сортировки.

**Источники данных:**

- **Набор элементов** — задаётся вручную в свойствах ДП на вкладке «Набор элементов».
- **Из таблицы** — значения подтягиваются из таблицы БД или SQL View.

**Источник «Из таблицы».** Настраивается: имя таблицы; колонка значения (уникальные ID записей — пишутся в БД); колонка текста (отображается пользователю); колонка сортировки; колонка контекста текущей задачи (если непуста — список фильтруется по строкам, где в этой колонке стоит ID текущей задачи). Текстовые значения в колонке значения поддерживаются, в том числе на PostgreSQL. ⚠️ Колонки значения и текста не должны содержать пустых значений. ⚠️ Через API (в т.ч. мобильное приложение) при создании/редактировании задачи передаются **все** возможные значения списка — для больших таблиц это перегружает клиент; ограничивайте число записей.

**Набор элементов** (`ExtParamOptions`). Вкладка доступна, когда источник — «Набор элементов». Поля элемента: текст (`OptionValue`), «Выбран по умолчанию» (`IsDefault` — подставляется в ДП по умолчанию), локализованное значение (`LocalizedOptionId` — форма ввода на доступных языках системы). Кнопка «Добавить» создаёт элемент.

![Вкладка «Набор элементов»: поля «Текст»/«Выбран по умолчанию» и список элементов с колонками «Имя»/«Выбран по умолчанию»/«Локализованное значение»](https://help.1forma.ru/help-images/ext-params/dp_edit_more_list-04.png)

Клик по элементу в списке открывает его на редактирование.

![Окно «Редактирование элемента»: имя и флаг «Выбран по умолчанию»](https://help.1forma.ru/help-images/ext-params/dp_edit_more_list-05.png)

**Быстрые подсказки.** Для списков на основе «Набора элементов» в карточке задачи над перечнем значений показываются три последних значения, выбранных пользователем в этом ДП в любой задаче категории, — для быстрого выбора. Для списков на основе таблицы быстрые подсказки не появляются.

Каждая подсказка запоминается вместе с языком, на котором её выбрали, и показывается только при этом языке интерфейса. Подсказки, выбранные на других языках, не показываются и не переводятся; подсказки, сохранённые до появления привязки к языку, не показываются ни при каком языке и вытесняются новыми. Ограничение в три подсказки общее для всех языков.

![Быстрые подсказки в карточке задачи: три последних выбранных значения над списком](https://help.1forma.ru/help-images/ext-params/ep_lookup_3_tasks.png)

---

**Поведение фокуса при открытии.** При открытии списка фокус сразу устанавливается в поле поиска — можно начинать печатать и фильтровать значения без дополнительных действий, независимо от того, создаётся новая задача или редактируется существующая.

---

### ДП «Выпадающий список с редактированием» (Combobox)

Аналогичен Select, но пользователь может ввести своё значение.

**Максимальная длина:** 200 символов.

**Поведение фокуса при открытии (с 2.268.x).** При клике на стрелку раскрытия списка фокус сразу устанавливается в поле поиска — можно начинать печатать и фильтровать значения без дополнительных действий, независимо от того, создаётся новая задача или редактируется существующая. При клике в основное поле ввода фокус остаётся там, чтобы сохранить возможность редактирования текущего значения или ввода произвольного текста.

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

---


**Быстрые подсказки.** Тип работает с теми же быстрыми подсказками, что и обычный «Выпадающий список»: в карточке задачи над перечнем показываются три последних значения, выбранных в этом параметре. Подсказки привязаны к языку интерфейса и показываются только на том языке, на котором значение выбирали.
### ДП «Дерево» (Tree)

**Настройка узлов в новой форме.** Настройки узлов дерева вынесены на экран AdminSPA: узлы создаются кнопкой в шапке и через модальное окно, у корневых узлов показан бейдж, а рядом с деревом есть подсказка о выделении родителя и перетаскивании, которую можно скрыть на время или отключить навсегда. Подписи экрана хранятся в файлах локализации.

**Описание:** отображение древовидной структуры для выбора значения.

**Хранение:** `ExtParamValues.ExtParamValue` + `DataSourceItemID`. Денормализация: `varchar/nvarchar(1000)`.

**Дерево узлов.** Само дерево, из которого пользователь выбирает значение, администратор строит на вкладке «Основные настройки» карточки ДП. Узлы хранятся в `ExtParamTreeNodes` (`Text` — название, `ParentNodeID` — родитель, `OrderID` — порядок).

**Чтение узлов.** Узлы дерева по идентификатору параметра отдаются только пользователю, у которого есть право просмотра или создания хотя бы в одной категории размещения этого параметра; если параметр не размещён ни в одной категории или прав нет — запрос отклоняется. Настройка узлов в админке этим ограничением не затрагивается.

- Создание узла: ввести название в поле «Текст создаваемого узла» и нажать «Создать узел» — узел добавляется на верхний уровень. Для дочернего узла предварительно выделите родительский — новый узел создаётся внутри него.
- Иерархию меняют перетаскиванием узлов мышью.
- Кнопки справа от узла — редактирование названия и удаление.

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

![Вкладка «Основные настройки» ДП «Дерево»: поле «Текст создаваемого узла», кнопка «Создать узел» и список узлов дерева](https://help.1forma.ru/help-images/ext-params/dp_edit_more_tree-1.png)

---

### ДП «Lookup (поле подстановки)» (LookUpField)

**Описание:** выбор одной задачи из категории-источника. Единственным допустимым значением является ID существующей задачи.

**Хранение:** `ExtParamValueSelectedTasks.SelectedTaskID`. Денормализация: `int`.

**Настройки (ключевые):**

- Источник данных: категория или сводный раздел + фильтр по статусам.
- Смарт-фильтр (работает только в карточке уже созданной задачи).
- Иерархический режим (отображение в виде дерева).
- Колонка сортировки.
- Отображать как радио кнопки (до 10 значений).
- Быстрые подсказки (3 последних выбранных значения).
- Отображение в задаче: текст, текст+цвет, иконка, иконка+цвет.
- Табличный вид для выбора значений.
- Регулярное выражение (`RegExp`): проверяется отображаемый текст выбранной задачи (её название), а не идентификатор.

---

### ДП «Multilookup (выбор нескольких задач)» (MultiSlctSubcatTasks)

**Описание:** выбор нескольких задач из категории с возможностью добавления комментариев.

**Хранение:** `ExtParamValueSelectedTasks` — несколько записей с одним `TaskID + ExtParamID`.

**Схема списка задач (To-do):** дополнительная таблица `ExtParamValueSelectedTaskFolders` (вкладки с именами).

**Операции через API/SmartScript:**

- Добавить: `ВСтроку(ID_задачи)`.
- Удалить: `'-' + ВСтроку(ID_задачи)`.


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

### ДП «Выбор пользователей» (SelectUsers)

**Описание:** выбор пользователей, групп, элементов орг. структуры.

**Хранение (три таблицы):**

- `ExtParamSelectUsersValues` — пользователи (`UserID`).
- `ExtParamSelectUsersValuesGroups` — группы (`GroupID`).
- `ExtParamSelectUsersValuesOrgUnits` — орг. единицы (`OrgStructureUnitID`).

**Денормализация в `SelectUserValue` / `NativeValue`:** только если одновременно: (1) включен «Разрешить сохранять не более одного элемента» и (2) активна только одна из настроек: пользователи, группы или орг. единицы.

**Настройки:**

- Разрешить сохранять не более одного элемента.
- Разрешить выбирать пользователей / группы / орг. единицы (независимые флаги).
- Ограничить выбор: без ограничений, членами группы, смарт-выражением.
- Ограничить выбор орг. единиц: без ограничений, из подразделения, смарт-выражением.
- Ограничить выбор типами орг. структуры.
- Фильтрация групп по типу и синхронизации с Active Directory — см. [Справочник ДП «Выбор пользователя» → Фильтрация групп](https://help.1forma.ru/domains/ext-params/select-users/settings-reference.md#фильтрация-групп)

**Формат значения через API:**
```
{"Users":{"Deleted":[...],"Added":[...]},"Groups":{"Deleted":[...],"Added":[...]},"OrgUnits":{"Deleted":[...],"Added":[...]}}
```

**JS API (ep.val()):**

При передаче значения через JS API (JS-вставки) используйте объектный формат без обёртки в кавычки:

```
ep3606.val({"users":[{"userId": 4561}],"groups":[],"orgUnits":[]})
```

---

### ДП «Таблица» (Table)

**Описание:** ввод данных в табличном виде. При действиях с ДП «Таблица» автоматически сохраняются другие ДП на карточке задачи.

**Хранение:** `ExtParamTableValues` (RowID, ColumnID, Value). Настройки колонок: `ExtParamTableSettings`. Денормализация: `varbinary(max)`.

**Типы колонок:** Текст, Большой текст без форматирования, Выпадающий список, Текст с маской, Деньги, Дата и время, Дата, Телефон, Lookup, Чекбокс, Число, Файл, Виртуальная, Шаблонная, Блок кнопок, Выбор пользователей, URL.

Текстовые колонки хранят значения в Unicode: текст на любом языке, включая китайский и казахский, сохраняется и возвращается по API без искажений.

Колонки таблицы настраиваются на вкладке «Общие настройки» в карточке ДП: для каждой колонки задаются имя, порядок, тип, режим, значение по умолчанию и смарт-выражение.

![Настройка колонок ДП «Таблица»: список колонок с типами, режимами и значениями по умолчанию](https://help.1forma.ru/help-images/ext-params/dp_table_columns.png)

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

**Доступ на чтение/редактирование по колонкам:** для каждой колонки в «Дополнительных настройках блока» можно настроить доступ на чтение и редактирование отдельно.

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

**Режимы отображения таблицы:** Таблица, Ссылка (открытие в новой вкладке), Динамический набор полей.

**Настройки таблицы:**

- Ключевой столбец (для импорта/множественного выбора).
- Максимальная высота в пикселях.
- Экспорт / Импорт (Excel).
- Сохранять строку после редактирования (автосохранение).
- Создавать строки в модальном окне.
- Секции столбцов.
- Динамическая обязательность (условные правила обязательности ячеек).
- **Условное форматирование колонок**: подсветка ячеек по условию для колонок Число/Деньги/Текст — правила вида «больше», «между», «содержит», «минимум», «максимум», «дубликаты», палитра 12 цветов × 5 тонов, до 50 правил на колонку. Настраивается на странице ДП «Таблица». Подробно — в [справочнике ДП «Таблица»](https://help.1forma.ru/domains/ext-params/table/settings-reference.md) (§ «Условное форматирование колонок»).
- Сортировка по умолчанию (один столбец).
- Смарт-выражения для вычисления значений колонок.
- Итоговая строка (для типов Число, Деньги).

> **Ограничение:** настройка «Обязателен для завершения» (`ExtParamsInSubcat.IsRequired`) к ДП «Таблица» неприменима — тип является составным, механизм `IsRequired` для него не работает. Для контроля заполненности используйте обязательность колонок (режим «Обязательно») или динамическую обязательность.

**Диапазон значений в колонках таблицы:**

- Число: от -99 999 999 999 999 до +99 999 999 999 999.
- Деньги: от -922 337 203 685 476.99 до +922 337 203 685 476.99.

**Операции через API/SmartScript:**

- Добавить строку: `'+[{ID_колонки:{"First":"значение"}}]'`.
- Обновить строку: `'={"First":"ID_строки","Second":{ID_колонки:{"First":"значение"}}}'`.
- Удалить строку: `'-ID_строки'`.
- Полная перезапись: `'|{...}'` (удалить все + создать) или `'#{...}'` (только изменения).

**Частичное обновление существующей строки.** Если в операции обновления для строки, которая уже есть в таблице, передана только часть колонок, обновляются именно они: значения остальных колонок этой строки сохраняются и значениями по умолчанию не дозаполняются. Явно переданное пустое значение очищает ячейку и тоже не подменяется значением по умолчанию. Правило действует только для существующих строк — у новой строки непереданные колонки заполняются значениями по умолчанию столбцов. Набор строк при этом по-прежнему считается полным снимком таблицы: строки, которых в переданном значении нет, удаляются.

> Массовые операции со строками по результату SQL-выборки выполняют смарт-действия «Добавить строки ДП «Таблица»», «Изменить строки ДП «Таблица»» и «Удалить строки ДП «Таблица»» — строка-команда для них не нужна, см. [`smart-actions/actions-reference-files-data.md`](https://help.1forma.ru/domains/smart-actions/actions-reference-files-data.md), раздел «ДП — модификация значений».

**`First`/`Second` — два уровня использования.** Эта конструкция используется в двух разных контекстах и имеет разную семантику:

- **Уровень строки (операция «Обновить»):** `{"First": "RowID", "Second": {объект_колонок}}` — здесь `First` — идентификатор обновляемой строки, `Second` — объект со значениями колонок.
- **Уровень значения ячейки:** `{"First": "значение", "Second": "доп.значение"}` — здесь `First` — основное значение ячейки, `Second` — вспомогательное (используется только в отдельных типах колонок, см. таблицу ниже).

**Формат значений по типам колонок:**

| Тип колонки | `First` | `Second` |
|---|---|---|
| Текст / Большой текст без форматирования | строка | — |
| Текст с маской / Телефон | строка | — |
| Число / Деньги | число в виде строки (`"7"`, `"1234.56"`) — десятичный разделитель — точка | — |
| Чекбокс | `"true"` или `"false"` (строкой) | — |
| Дата | `"yyyy-MM-dd"` | — |
| Дата и время | `"yyyy-MM-ddTHH:mm:ss"` | строка часового пояса (опционально) |
| Выпадающий список (`Select`, `Combobox`) | `Id` варианта (рекомендуется) или текстовое значение | — |
| Lookup (`LookUpField`) | `TaskID` целевой задачи | `taskText` для отображения (опционально) |
| Выбор пользователей (`SelectUsers`) | список идентификаторов через запятую: `UserID`, `g{GroupID}`, `o{OrgUnitID}` (например `"123,456,g78,o12"`) | — |
| Файл | `FileID` или массив `FileID` через запятую | — |

**Пример добавления строки с несколькими типами колонок** (псевдокод, ColumnID — числовые идентификаторы конкретных колонок):

```
'+[{
  101: {"First": "123,456"},
  102: {"First": "7"},
  103: {"First": "true"},
  104: {"First": "текст значение"},
  105: {"First": "2026-04-30"},
  106: {"First": "2080000", "Second": "Связанная задача"}
}]'
```

Где: 101 — колонка SelectUsers (IDs через запятую), 102 — Число, 103 — Чекбокс, 104 — Текст, 105 — Дата, 106 — Lookup (Second — отображаемый текст, опционально).

**Экранирование.** В Lua `ChangeExtParamValue` и других SmartScript-движках строка-команда передаётся как обычный строковый литерал; внутренние двойные кавычки JSON экранируются по правилам языка-источника (`\"` в C#/Lua-string, `\\"` при двойной строковой обёртке). Спецсимволы внутри значений (`"`, `\`, перевод строки) экранируются по стандарту JSON.

**Поведение при ошибке.** При невалидной структуре операции (неизвестный `ColumnID`, неподходящий тип значения, нарушение обязательности колонки, отсутствие прав на колонку) операция возвращает ошибку валидации и строка не сохраняется. Идентификатор проблемной колонки и причина возвращаются в тексте ошибки SmartScript-движка.

> ⚠️ **Колонка `SelectUsers` ≠ самостоятельный ДП `SelectUsers`.** Внутри табличного ДП колонка типа «Выбор пользователей» принимает строку идентификаторов через запятую (`"123,456,g78,o12"`), а не JSON. Самостоятельный ДП `SelectUsers` (вне таблицы) при модификации через `ChangeExtParamValue` ожидает JSON вида `{"Users":[...], "Groups":[...], "OrgUnits":[...]}`. Это разные форматы — не путать.

---

### ДП «Файл» (File)

**Описание:** электронный файл любого разрешённого типа. Поддерживает мультифайл.

Настройки ДП «Файл» разнесены по вкладкам карточки: «Основное» (мультифайл, файл по умолчанию, правило имени файла), «Доп. настройки», «Файлы Word».

![Карточка настроек ДП «Файл»: переключатель «Мультифайл», файл по умолчанию и правило имени файла](https://help.1forma.ru/help-images/ext-params/dp_file_settings.png)

**Хранение:** `FileStorageFileToExtParamLinks.FileId` → `FileStorageFiles`.

**Настройки:**

- Мультифайл (несколько файлов в одном ДП).
- Значение по умолчанию (файл).
- Имя файла: не менять / добавить версию / фиксированное / смарт-выражение.
- Логирование действий с файлами (журнал Диск).
- Изображение — ограничить только изображениями.
- Максимальный размер файла (КБ).
- Список допустимых расширений.
- Защита от загрузки — UI-скрытие кнопки «Скачать» (остаётся постраничный просмотр), пункт «Скачать все» в меню файла скрывается и архив не собирается.
- Файловый провайдер.
- Работа с файлами Word: сравнение версий, объединение.
- Сканирование (утилита 1Формы).
- Тип пропорции — соотношение сторон для превью изображения. Если пропорция задана, вложение изображения открывает окно обрезки: в ДП попадает обрезанная копия, исходный файл не загружается. Обрезка работает при выборе файла на устройстве, перетаскивании и вставке из буфера обмена; вложение с Диска и сканирование её не запускают. Обрезка работает в карточке задачи (МТФ) и в форме создания задачи (НТФ).

---

### ДП «Нумератор» (Numerator)

**Карточка типа в новой форме админки.** Часть типов открывается в новой форме настроек — сейчас это «Файл» и «Нумератор». Такая карточка показывает в цепочке название параметра, его тип и идентификатор, а настройки раскладывает по вкладкам («Основное», «Статусы» и другие по типу). Подписи формы берутся из файлов локализации, поэтому их текст правится без изменения кода; кнопки «Сохранить» и «Отмена» общие для страницы — уход с несохранёнными изменениями требует подтверждения.

**Описание:** автоматический нумератор с шаблоном.

**Хранение:** `ExtParamValues.ExtParamValue`.

**Шаблон нумератора:** статический текст + вставки:

- `<number:X;Y>` — X = начальное значение, Y = шаг.
- `<datetime:dd.MM.yyyy>` — дата/время.
- Пример: `СЧЕТ<datetime:ddMMyy><number:1;1>`.

Шаблон и поведение счётчика задаются на вкладке «Основные настройки» карточки ДП.

![Настройки ДП «Нумератор»: поле «Шаблон нумератора», флаги «Устанавливать только на переходе» и «Обнулить значение счётчика»](https://help.1forma.ru/help-images/ext-params/dp_numerator_settings.png)

**Настройки:**

- Устанавливать только на переходе (не при создании задачи).
- Обнулить текущее значение счётчика.

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

![Вкладка «Категории и статусы» ДП «Нумератор»: поля выбора категории и статусов, кнопка «Добавить», пустая таблица](https://help.1forma.ru/help-images/ext-params/dp_edit_more_numerator-02.png)

В списке статусов варианты сгруппированы на «Активные задачи» и «Неактивные задачи»; можно отметить несколько.

![Выбор статусов нумератора: статусы сгруппированы на «Активные задачи» и «Неактивные задачи», отмечается несколько](https://help.1forma.ru/help-images/ext-params/dp_edit_more_numerator-03.png)

По кнопке «Добавить» пара «категория — статус» попадает в таблицу. Привязки хранятся в `ExtParamNumeratorSubcatSteps` (категория `SubcatId` + статус `StateId`).

**Поведение при сбое установки значения.** Если на шаге установлено несколько нумераторов, каждый обрабатывается независимо: сбой при установке одного не прерывает остальные, и значения успешных записываются в задачу. У сбойного нумератора значение в задачу не попадает и счётчик не сдвигается — счётчик увеличивается только вместе с записанным значением, поэтому частичного результата после шага не остаётся. Сбой записывается в журнал. Граница поведения: это про сбой внутри одной установки значения; если значения всех нумераторов уже сформированы, а их запись в задачу завершается сбоем, поведение прежнее.

![Вкладка «Категории и статусы» с добавленными привязками: строки «Категория — Статус» в таблице](https://help.1forma.ru/help-images/ext-params/dp_edit_more_numerator-05.png)

---

### ДП «URL (ссылка)» (URL)

**Описание:** хранит текстовое значение и отображает его как кликабельную ссылку. При клике система определяет тип ссылки и выбирает способ открытия:

- **Ссылка с явным протоколом** (`http://`, `https://`) — открывается в новой вкладке браузера.
- **Голый домен** (например, `example.com`) — система автоматически добавляет `https://` и открывает как веб-ссылку.

Набор схем, которые открывает поле, фиксирован: `http:`, `https:`, `mailto:`, `tel:`, `e1c:`. Адрес с другой схемой — `javascript:`, `data:`, `ftp:`, `slack:` и подобными — не открывается. Перечень задан в `libs/utils/src/lib/link.ts` (`allowedNavigationProtocols`) и один на все места, где значение URL выводится ссылкой: клик по самому полю (`ext-param-url.component.ts`), загрузка `href` через `SafePipe` (`apps/spa/src/app/common/pipes/safe.pipe.ts`) — в том числе в параметре карточки задачи типа URL, в URL-колонке и URL-ячейке ДП «Таблица» — и клик по табличному ДП в режиме отображения «Ссылка».

**Как обрабатывается клик в браузере.** В карточке задачи и в форме создания значение поля выводится нативным якорем с признаком `data-vh-self-handled-link` (`SELF_HANDLED_LINK_ATTR`, `built-in-dom-elements-extend/self-handled-link.ts`). Глобальный обработчик клика приложения (`when-app-boostrapped.ts`) на таком якоре выходит сразу и не применяет ни одну из своих веток: ни запуск видеоконференции, ни подмену содержимого окна карточки. Адрес `http`/`https` открывается по `target="_blank"`, остальные разрешённые схемы уходят системному обработчику. Признак ставится **только в браузерном режиме**: в Electron и PWA его на якоре нет, поведение прежнее.

Механизм относится только к самому полю в карточке и в форме создания (`ext-param-url.component.ts`). Остальные представления значения — колонка и ячейка ДП «Таблица», лента, резолюции, ячейки грида, фильтры — обрабатываются своими компонентами, признак на них не ставится и поведение прежнее.

Определение типа ссылки выполняется по регулярному выражению `^[a-z][a-z0-9+.-]*(?=:)` — проверяется наличие схемы (`X:`) перед остальной частью значения. Обработка унифицирована с 2.268.344 в двух местах: глобальный обработчик клика приложения (`apps/spa/src/app/built-in-dom-elements-extend/when-app-boostrapped.ts`) и универсальный хелпер `isExternalLink` (`libs/utils/src/lib/link.ts`). До 2.268.344 первый использовал жёсткий чек на `javascript:void`, второй — `['//', '://'].some(...)`; ссылки `mailto:`/`tel:`/`regplay:` ломались, превращаясь в `https://mailto:...`.

**Известное ограничение:** при отображении ссылок в тексте комментариев (`comment-text-to-html.pipe.ts`) логика определения схемы не унифицирована в этой итерации — возможны артефакты вида `https://mailto:`. Требует отдельной проверки и доработки.

**Server-side валидация схемы (с 2.268.379, задача #2096274).** При сохранении значения backend применяет явный блок-лист опасных схем: `javascript:`, `data:`, `vbscript:` (регистр игнорируется, ведущие пробелы обрезаются) — попытка сохранить такое значение возвращает ошибку `EPErrorURLValidate`. До 2.268.379 валидация шла через `Utils.Sanitize`, который срезал валидные URL (например, с query-параметрами или нестандартными схемами) — поэтому Sanitize убран, ему на смену пришёл точечный deny-list. Остальные схемы (включая `mailto:`/`tel:`/`ftp:`) проходят без изменений.

**Хранение:** `ExtParamValues.ExtParamValue`.

---

### ДП «Адрес» (Address)

**Описание:** почтовый адрес в формате, совместимом с КЛАДР. Хранит координаты (широта, долгота) для позиционирования на карте.

**Хранение:** `ExtParamValues.AddressId` → таблица `Address`. Денормализация: `int`.

**Требование:** для корректной работы необходим хотя бы один подключённый адресный провайдер.

---

### ДП «Адресаты email» (ExtParamAddressees)

**Описание:** e-mail адреса или имена пользователей-получателей.

**Хранение:** `ExtParamValues.ExtParamValue`.

**Регулярное выражение (`RegExp`):** применяется только к адресам, введённым вручную текстовой строкой; пользователи, добавленные из справочника системы, выражением не проверяются.

![«Основные настройки» ДП «Адресаты email»: поле «Ограничить выбор пользователей»](https://help.1forma.ru/help-images/ext-params/dp_edit_more_email-01.png)

**Ограничить выбор пользователей** (настройки в таблице `ExtParamSelectUserSettings`, общей с ДП «Выбор пользователя»):

- **Без ограничений** — выбираются e-mail только работающих сотрудников;
- **Ограничить список членами группы** (`GroupId`) — ниже появляется поле выбора группы; доступны только её участники;
- **Ограничить смарт-выражением** (`SmartFilterId`) — смарт-выражение должно возвращать список ID пользователей, доступных для выбора.

**Текстовые ресурсы** — 7 локализуемых полей (в `ExtParamSelectUserSettings`), переопределяют тексты по умолчанию:

| Ресурс | Поле БД | Текст по умолчанию |
|--------|---------|--------------------|
| Заголовок кнопки | `LocalizedButtonTitleId` | «Кому» |
| Только этому пользователю | `LocalizedOnlyCurrentUserId` | «Только этому адресату» |
| Удалить пользователя | `LocalizedRemoveUserId` | «Удалить из адресатов» |
| Удалить всех | `LocalizedRemoveAllId` | «Удалить всех адресатов» |
| Информация о пользователе | `LocalizedUserInfoId` | «Информация о пользователе» |
| Подсказка в пустом поле ввода | `LocalizedEmptyTooltipId` | «Добавить контакт» |
| Заголовок списка выбора | `LocalizedSelectListTitleId` | «Укажите получателей» |

![Вкладка «Текстовые ресурсы» ДП «Адресаты email»: заголовок кнопки, пункты контекстного меню, подсказка и заголовок списка](https://help.1forma.ru/help-images/ext-params/dp_edit_more_email-02.png)

---

### ДП «Сквозной» (Through)

**Описание:** автоматическое вычисление значения на основании настроенной цепочки связей (через Lookup). Значения не хранятся — вычисляются по цепочке.

**Настройки:** `ExtParamTroughSettings`. Связи: `vwExtParamTroughLinks`.

**Пересчёт:** SP `PullThroughExtParam`.

## Общие настройки ДП (на уровне определения)

Эти настройки задаются в свойствах ДП и действуют **во всех категориях**, где ДП используется:

| Настройка | Поле DDL | Описание |
|---|---|---|
| Имя ДП | `ExtParamName` VARCHAR(900) | Название |
| Тип | `ExtParamType` VARCHAR(20) | Неизменяемый после создания |
| Мнемоника | `ExtParamMnemo` VARCHAR(200) | Для API и автоматизаций |
| Подсказка | `ToolTip` VARCHAR(2000) | Макс. 1000 символов (ограничение интерфейса); отображается иконкой |
| Только для чтения | `ReadOnly` BIT | По умолчанию: 1 |
| RegExp | `RegExp` VARCHAR(1000) | Валидация значения |
| Сообщение ошибки RegExp | `RegExpErrorMessage` VARCHAR(1000) | |
| MaxLength | `MaxLength` INT | Для текстовых типов |
| Не копировать при создании | `DontCopySourceTaskValue` BIT | |
| Сортировка по алфавиту | `SortByAlphabet` BIT | Для списковых типов |

## Настройки ДП в категории (ExtParamsInSubcat)

Эти настройки индивидуальны для каждой привязки ДП к категории:

| Настройка | Область действия |
|---|---|
| Видимость (блок, порядок) | Только эта категория |
| Обязательность | Только эта категория |
| Доступ (по задаче / по группам / по матрице / по SQL-функции) | Только эта категория |
| Синхронизация в родительскую / дочернюю | Только эта категория |
| Значение по умолчанию | Только эта категория |
| Подсказка (ДП в категории) | Макс. 1000 символов |
| Новая задача: режим отображения на НТФ | Только эта категория |

## Типы доступа к ДП

Для каждого ДП в категории можно выбрать способ разграничения доступа:

| Способ | Когда применять |
|---|---|
| По задаче | Нет специфических ограничений |
| Только по группам | Доступ зависит только от группы |
| По матрице доступа | Комбинация группа + роль + статус |
| По SQL-функции | Доступ зависит от данных задачи |

Уровни: 0 = нет доступа, 1 = чтение, 2 = редактирование.
