# Пользовательские настройки приложения (SettingsCustom)

Справочник пользовательскых настроек приложения SettingsCustom для платформы Первая Форма: пары ключ—значение в таблице dbo.SettingsCustom, управляющие доменными feature-флагами и конфигурациями. Документ описывает форматы JSON, bool, int, string и массивов для ключей вроде AuthConfig, anfisa_user_id, BackgroundQueueMaxConcurrency, ConferenceDefaultUserRoomSettings, DataSourceAggregates и многих других. Используется администраторами и разработчиками для точечной настройки функций, интеграций и категорий.

## Обзор

**Пользовательскые настройки приложения** — это набор пар «ключ — значение», которые управляют доменными feature-флагами и конфигурациями платформы «Первая Форма». В отличие от общих настроек приложения, пользовательскые настройки задаются вручную и применяются точечно: для отдельных функций, интеграций, категорий или пользователей.

Хранилище — таблица БД `dbo.SettingsCustom`. Каждая запись содержит ключ (`Key`), значение (`Value`), описание (`Description`) и источник (`Source`); часть ключей может задаваться в разрезе пользователя (`UserId`).

Настраиваются в режиме администрирования (автоадминка) → форма `custom-settings` («Пользовательскые настройки приложения»).

### Какие ключи делают параметр служебным

Часть ключей хранит не одно значение, а ссылку на дополнительный параметр: ДП «Файл» для метки времени, ДП с адресом, ДП-счётчик, ДП, значение которого подставляется в форму. Если идентификатор параметра встречается в значении такого ключа, сервер помечает параметр служебным — в ответе настроек ДП приходит `isUsedInSettingsCustom: true`. По этому признаку видно, что параметр занят платформенной настройкой, и его нельзя переиспользовать под задачу категории.

Формат значения у таких ключей разный, и признак считается по каждому из них отдельно:

| Форма значения | Пример |
|----------|----------|
| Идентификатор одного параметра | ключ с ДП «Файл» |
| Массив идентификаторов | `[125290, 125291]` |
| Массив объектов | `[{"subcats":[70400],"groups":[12]}]` |
| JSON-строка, разбираемая по схеме ключа | настройки с вложенными списками категорий и групп |

Участвуют не все ключи. Системные поля задачи (исполнитель, срок, статус) и служебные настройки, привязанные к статусам маршрута, при подсчёте пропускаются. Принадлежность конкретного параметра надёжнее проверять по фактическому значению признака в ответе, чем по имени ключа.

**Диагностика.** Найти, в каком ключе занят параметр, удобно запросом по таблице пользовательских настроек: `SELECT Name, Value FROM dbo.SettingsCustom WHERE Value LIKE '%125290%'` — с подстановкой своего идентификатора. Пустая выдача при `isUsedInSettingsCustom: true` означает, что значение записано не идентификатором, а объектом или JSON-строкой; тогда ищите по подстрокам значения ключа.

> ℹ️ Добавлять можно только ключи из списка ниже. В качестве нового значения принимаются только перечисленные настройки.

### Управление записями

Записи SettingsCustom управляются через интерфейс формы:

- **Создать** — нажмите **+ Создать** и заполните поля.
- **Изменить** — кликните на запись в списке, внесите правки, нажмите **Сохранить**. Кнопка **Сбросить** отменит изменения, **Назад** вернёт к списку.
- **Удалить** — кнопка **Удалить** в окне редактирования или пункт контекстного меню строки.

> ℹ️ Для части ключей после добавления или изменения значения требуется рестарт приложения — это указано в описании соответствующего ключа.

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

> ℹ️ Если изменить или удалить строку настройки напрямую в базе, минуя форму, сигнал не отправляется: остальные узлы кластера продолжат отдавать прежнее значение, пока запись не будет перечитана по сроку жизни (около часа) либо принудительным обновлением кэшей.

---

## `ActionLogDaysKept`

**Тип:** `string` · **По умолчанию:** —

Раздел «Журналы». Срок хранения служебных записей журнала действий, которые удаляет задача `ClearOldLogDbRecordsJob`. Пустое значение, отрицательное или не число — настройка считается не заданной, применяются прежние сроки: семь дней для девяти шаблонов и четырнадцать дней для записей «Smart доступ». Положительное число задаёт единый срок для всех десяти шаблонов. `0` — записи не удаляются, чистка отключена.

---

## `AddUserLoginToSignedFiles`

**Тип:** `bool` · **По умолчанию:** `false`

Позволяет добавлять к наименованию файла электронной подписи SIG логин пользователя-акцептанта.

---

## `AdminPath`

**Тип:** `string` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Адрес хоста для перехода в режим администрирования.

---

## `AgentLoopScriptId`

**Тип:** `int` · **По умолчанию:** ID смарт-скрипта с описанием `AgentLoopScriptName` либо `-1`

ID смарт-скрипта agent-loop (пробуждения родительской сессии ИИ-ассистента Анфисы). Если ключ не задан, система автоматически ищет подходящий скрипт по описанию и подставляет его ID; если скрипт не найден — значение `-1` и пробуждение сессии не выполняется.

---

## `AllLocalesSearchEpIds`

**Тип:** `int[]` · **По умолчанию:** `[]`

Входит в группу расширенных свойств приложения `custom-app-settings`. Массив ID ДП типа Lookup, в которых текстовый поиск проверяет совпадение по локализованным значениям **всех настроенных локалей** задачи-источника (ru, en и др.), а не только по локали текущего пользователя.

Применяется в трёх местах: основной поиск в выпадающем списке lookup-ДП (`LookupQueryService`), текстовый фильтр и multi-select фильтр lookup-колонок в табличных представлениях (`TaskTextFilter`, `MultiSelectFilter`). Достаточно совпадения хотя бы в одной локали.

Использование: добавьте ID конкретных ДП Lookup в массив, для которых нужно расширенное поведение. По умолчанию (пустой массив) — поиск идёт только в текущей локали пользователя.



---

## `allowCSVGridFilter`

**Тип:** `bool` · **По умолчанию:** `true`

Входит в группу расширенных свойств приложения `custom-app-settings`. Отображение действий в контекстном меню (при клике на колонку) табличного представления категории:
- Фильтр csv.
- Удалить csv фильтр.

---

## `allowDBAdminExport`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Отображает кнопку выгрузки схемы базы данных dbadmin в меню быстрых действий во вкладке «Администрирование» боковой панели. Нажатие на неё инициирует скачивание файла `.sql` или `.pgsql` в зависимости от выбора СУБД.

---

## `AllowThemes`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Разрешает пользователям менять тему оформления интерфейса.

---

## `anfisa__slash_commands_catalog`

**Тип:** JSON · **По умолчанию:** —

JSON-каталог слэш-команд ИИ-ассистента Анфисы. Содержимое отдаётся клиенту в составе настроек приложения (`AppSettingsFileDto.anfisa__slash_commands_catalog`). При невалидном JSON каталог не передаётся.

Ожидается JSON-массив объектов; все свойства — строки:

```json
[
  {
    "name": "string",
    "source": "string",
    "description": "string",
    "placeholder": "string"
  }
]
```

**Параметры:**

- `name` — имя слэш-команды.
- `source` — источник команды.
- `description` — описание команды.
- `placeholder` — текст-подсказка.

---

## `anfisa_user_id`

**Тип:** `int` · **По умолчанию:** —

ID системного пользователя ИИ-ассистента Анфисы. Используется для импersonation Анфисы при пробуждении сессий, для подсчёта непрочитанных комментариев в AI-папке и для выборки AI-чатов. Если ключ не задан или значение `<= 0` — соответствующий функционал отключается.

---

## `AnfisaCatalogSmartScriptId`

**Тип:** `int` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. ID смарт-скрипта, генерирующего каталог команд чата Анфисы по задаче. Читается эндпоинтом `POST /api/anfisa/catalog {taskId}`: скрипт запускается в контексте задачи, ему доступны `@EventParam0` = taskId, `@EventParam1` = `"Spa"` и `@CurrentSessionUserID`. Если ключ не задан или значение указывает на несуществующий скрипт — эндпоинт возвращает `404 SCRIPT_NOT_FOUND`.

---

## `AnfisaJobScriptId`

**Тип:** `int` · **По умолчанию:** ID смарт-скрипта с описанием `AnfisaJobScriptName` либо `-1`

---

## `apple-itunes-app`

**Тип:** `string` (в `custom-app-settings`) · **По умолчанию:** `app-id=1088420808`

Метатег `apple-itunes-app` включает в Safari на iOS баннер установки мобильного приложения 1Ф. По умолчанию он добавлен в первичный HTML площадки со значением `app-id=1088420808` — заводить его на каждой инсталляции не нужно, в `/app-settings.json` ключ не выводится.

Для брендированного мобильного приложения значение задаётся свойством `apple-itunes-app` в группе расширенных свойств `custom-app-settings`: непустое значение подменяет дефолт (свой `app-id`), пустая строка убирает тег целиком. Удаление ключа и установка пустой строки — разные действия: без ключа действует дефолт, при пустой строке тег не выводится.

---

## `ApiCacheableCallRefreshMinIntervalSeconds`

**Тип:** `int` · **По умолчанию:** `0`

Минимальный интервал в секундах между фоновыми пересборками данных для одного ключа кэша в механизме `CacheableCall` (ETag-кэширование ответов API — лента комментариев /chats, источники данных, категории и другие кэшируемые эндпоинты).

При `0` (по умолчанию) фоновая пересборка запускается на каждом обращении клиента с попаданием в кэш, включая ответы `304 Not Modified`. При `N > 0` пересборка одного ключа кэша выполняется не чаще одного раза за `N` секунд — лишние обращения пропускают пересборку и сразу отдают закэшированный ответ. Настройка снижает нагрузку при частом поллинге; на актуальность данных не влияет — новые сообщения доставляются отдельным SignalR-событием. Некорректные или отрицательные значения трактуются как `0`.

Откат без перезапуска — выставить `0` или удалить ключ.

---

## `Appointments_TimeTryToReacreateMins`

**Тип:** `int` · **По умолчанию:** `10`

Время (в минутах), в течение которого система будет повторять попытки отправить (пересоздать) встречу в EWS при возникновении сбоя.

---

## `AppointmentsToExternal_HandleOpenExternalConnection`

**Тип:** `bool` · **По умолчанию:** `true`

Включение обработки события открытия соединения с Exchange.

---

## `AppointmentsToExternal_NotSyncedAppointmentsLimit`

**Тип:** `int` · **По умолчанию:** `100`

Лимит встреч, которые нужно выгружать при обновлении внешних встреч по встречам, которые не были обновлены при стандартном процессе работы. Максимальное число необновленных календарных событий, которые синхронизируются из «Первой Формы» в Exchange при открытии соединения.

Рекомендуется сократить до 10.

---

## `AppointmentsToTasks_FutureDaysLimit`

**Тип:** `int` · **По умолчанию:** `180`

Число дней, в течение которых синхронизируются календарные события между «Первой Формой» и Exchange (вперёд, начиная с текущей даты). Календарные события, которые должны произойти после завершения данного периода, будут созданы позднее.

---

## `AppointmentsToTasks_NotSyncedAppointmentsLimit`

**Тип:** `int` · **По умолчанию:** `50`

Лимит встреч, которые нужно выгружать при постановке задач по встречам, которые не были поставлены при стандартном процессе работы.

Рекомендуется сократить до 10.

---

## `AppointmentsToTasks_OccurrencesCountLimit`

**Тип:** `int` · **По умолчанию:** `10`

Число повторений, которые создаются для повторяющегося календарного события, если в самой повторяющейся задаче в блоке «Продолжительность» выбрано «Без ограничений».

---

## `AppointmentsToTasks_OccurrencesDaysLimit`

**Тип:** `int` · **По умолчанию:** `180`

Число дней, в течение которых повторяется календарное событие, если в самой повторяющейся задаче в блоке «Продолжительность» выбрано «Без ограничений».

---

## `AppointmentsToTasks_OccurrencesPastDaysLimit`

**Тип:** `int` · **По умолчанию:** `30`

Количество дней в прошлое от текущей даты. Начиная с этой даты будут создаваться задачи-повторения.

---

## `AuthConfig`

**Тип:** JSON · **По умолчанию:** —

Управление доступными способами входа на форме авторизации.

**Формат:**
```json
{
  "AuthTypes": [
    {
      "Type": "string",
      "IsDefault": bool,
      "AllowRegister": bool,
      "AutoRegister": bool,
      "PrivacyLink": "string",
      "HideProviders": bool,
      "Visibility": "string",
      "RegisterPrivacyLink": "string",
      "RegistrationType": "string"
    }
  ]
}
```

**Параметры:**

- `Type` — тип авторизации. Возможные значения: `login-pass` — вход по логину и паролю, `phone-code` — вход по номеру телефона, `email-code` — вход по почте, `external-provider` — приоритетный вход через внешнего провайдера (например, KeyCloak). При выборе этого типа отображается отдельный экран с кнопками внешних провайдеров без формы логина и пароля.
- `IsDefault` — тип авторизации по умолчанию. При входе в систему пользователь увидит тип, для которого `IsDefault: true`. Если таких типов больше одного, на форме появится кнопка переключения.
- `AllowRegister` — разрешить регистрацию по указанному типу. При `true` будет доступна кнопка регистрации.
- `AutoRegister` — автоматическая регистрация.
- `PrivacyLink` — ссылка на пользовательское соглашение при входе. Если не пустой, отображается обязательная опция «Я принимаю условия пользовательского соглашения».
- `HideProviders` — скрыть провайдеры. При `true` выбор провайдера будет недоступен.
- `Visibility` — отображение типа авторизации: `all` (для всех устройств), `mobile` (только мобильная версия), `web` (только веб-версия).
- `RegisterPrivacyLink` — пользовательское соглашение при регистрации. Принимает массив объектов с параметрами:
  - `linkUrl` — ссылка на соглашение.
  - `linkTitle` — текст соглашения. Если не задан, используется «Я принимаю условия пользовательского соглашения».
- `RegistrationType` — тип регистрации: `all` (телефон и почта), `phone` (только телефон), `email` (только почта).

> ℹ️ Параметры в `AuthTypes` обязательно должны быть указаны с заглавной буквы.

**Пример:**
```json
{
  "AuthTypes": [
    {
      "Type": "phone-code",
      "IsDefault": true,
      "AllowRegister": true,
      "AutoRegister": true,
      "PrivacyLink": null,
      "HideProviders": true,
      "Visibility": "all",
      "RegisterPrivacyLink": null,
      "RegistrationType": "email"
    },
    {
      "Type": "email-code",
      "IsDefault": false,
      "AllowRegister": false,
      "AutoRegister": true,
      "PrivacyLink": null,
      "HideProviders": true,
      "Visibility": "mobile",
      "RegisterPrivacyLink": null,
      "RegistrationType": "email"
    },
    {
      "Type": "login-pass",
      "IsDefault": true,
      "AllowRegister": true,
      "AutoRegister": false,
      "PrivacyLink": null,
      "HideProviders": false,
      "Visibility": "web",
      "RegisterPrivacyLink": null,
      "RegistrationType": "phone"
    }
  ]
}
```

---

## `AutomationScriptsLogDaysKept`

**Тип:** `string` · **По умолчанию:** —

Раздел «Журналы». Срок хранения журнала автоматизаций, который удаляет задача `ClearAutomationScriptsLog`. Пустое, отрицательное или не число — настройка не задана, чистка выполняется по прежнему сроку семь дней. Положительное число задаёт свой срок. `0` — записи не удаляются, чистка отключена. Ключ создаётся автоматически при первом обращении.

---

## `backgroundTasks`

**Тип:** JSON · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Настройки сервисных фронтовых заданий.

**Формат:**
```json
{
  "backgroundTasks": {
    "mailboxes / events": {
      "isEnabled": true,
      "interval": 0
    }
  }
}
```

Почтовые ящики:
```json
{ "backgroundTasks": { "mailboxes": { "isEnabled": true, "interval": 60 } } }
```

Баннеры встреч:
```json
{ "backgroundTasks": { "events": { "isEnabled": true, "interval": 60 } } }
```

---

## `BackgroundQueueMaxConcurrency`

**Тип:** `int` · **По умолчанию:** `50`

Максимальное число фоновых задач, выполняемых одновременно в `QueuedHostedService`. При значении `1` задачи обрабатываются последовательно (поведение как до версии 2.268).

---

## `BackgroundQueueTaskTimeoutMinutes`

**Тип:** `int` · **По умолчанию:** `10`

Таймаут выполнения одной фоновой задачи в `QueuedHostedService` (в минутах). По истечении времени задача прерывается.

---

## `BackwardCompatibilityQueryOption`

**Тип:** `string` (CSV) · **По умолчанию:** —

Опции выполнения запроса для инструкции SQL `OPTION` в отчётах. Задаётся в формате `[ViewName]:[OPTION],...,...` — каждая пара «имя представления : опция» разделяется запятой. Для запроса по конкретному представлению подставляются только подходящие по имени опции (`OPTION(...)`). Если ключ не задан или пуст — `OPTION` не добавляется.

---

## `BrandSettings`

**Тип:** JSON · **По умолчанию:** —

Настройки корпоративного стиля, панели навигации и сайдбара из общих настроек приложения.

Слоты логотипов панелей лежат в секциях `Navigation` и `Sidebar` ключа: `Navigation.Logo` и `Navigation.LogoDark` — горизонтальная панель, `Sidebar.Logo` и `Sidebar.LogoDark` — вертикальная; каждый слот содержит путь и идентификатор файла. Подсекции `Logo.HorizontalPanel` и `Logo.VerticalPanel` сохраняют только ширину и высоту и читаются как запасной источник пути. Цвет панели хранится в `Navigation.DefaultColor` именем токена палитры, а не кодом цвета, поэтому проверки формата `#RRGGBB` у него нет.

Логотип кладётся в слот действием загрузки файла `UploadFileToFileStorageFolderAction` с указанием слота: файл сохраняется в папке файлохранилища, а ключ загруженного файла (путь и идентификатор) записывается в один из четырёх слотов панелей. За одну загрузку принимается ровно один файл, расширение проверяется, и допущены SVG, PNG и JPG — файл другого формата отклоняется с сообщением. Четырьмя слотами панелей выбор и ограничен: логотип страницы авторизации задаётся отдельной настройкой `LoginLogoPath`, подсекция `Logo.AuthPage` в загрузке не участвует. Загрузка меняет только ключ `BrandSettings` — плоские пути формы настроек (`Settings.AppLogoPathSPA…`) остаются как были. Незаполненный слот логотип не отдаёт: значение берётся из запасных подсекций `Logo.HorizontalPanel` / `Logo.VerticalPanel`, а если и там пусто, поле логотипа остаётся незаданным.

Загрузка логотипа и сохранение формы настроек правят одну и ту же строку `BrandSettings`, поэтому идут через общий замок: строка читается целиком, меняется своё поле, результат записывается обратно. Сохранение формы переносит в слоты только фактически изменённые колонки логотипов, поэтому правка ширины или высоты соседней колонки не затирает ключ файла, записанный загрузкой. Замок внутрипроцессный: при нескольких рабочих процессах на одной площадке щель между чтением и записью остаётся.

Секции `Navigation` и `Sidebar` несут не только логотипы, но и политику уровня Core. Она отдаётся в `app-settings.json` отдельной секцией `branding` (имена полей там в camelCase).

Секция `Navigation`: `DefaultPosition` — положение панели навигации по умолчанию (`Left`, `Right`, `Above`); `AllowedColors` — список имён токенов палитры, разрешённых к выбору; `AllowUserChangePosition` и `AllowUserChangeColor` — разрешено ли пользователю менять положение и цвет панели.

Секция `Sidebar`: `DefaultVisible` — отображается ли боковая панель по умолчанию; `AllowUserHide` — разрешено ли пользователю её скрывать.

Значения-разрешения — необязательные булевы: пустое значение означает «не задано». Секция `branding` отсутствует в `app-settings.json` целиком, пока не задана хотя бы одна из секций `Navigation` или `Sidebar`.

При сохранении проверяется идентификатор файла в каждом слоте логотипа: ноль недопустим, положительное значение означает загруженный файл, отрицательное принимается только из каталога встроенных SVG-пресетов, иначе настройка отклоняется с сообщением. Изменённая ссылка на загруженный файл дополнительно проверяется по содержимому — сигнатура SVG, ограничение размера (1 МБ), запрет скриптов, внешних ссылок и DTD; неизменённые ссылки не перепроверяются.

Ранее сохранённые плоские настройки логотипов переносятся в эти слоты миграцией, а плоские ключи вида `appLogoPathSPA…` в `app-settings.json` продолжают отдаваться — значения берутся из новых слотов с откатом на прежние подсекции.

Генерируется при обновлении значений настроек:

- Горизонтальный логотип, светлая тема.
- Вертикальный логотип, светлая тема.
- Горизонтальный логотип, темная тема.
- Вертикальный логотип, темная тема.
- Ширина логотипа (SPA) вертикальная панель.
- Высота логотипа (SPA) вертикальная панель.
- Ширина логотипа (SPA) горизонтальная панель.
- Высота логотипа (SPA) горизонтальная панель.

> ℹ️ Ключ не предполагает редактирование.

**Формат:**
```json
{
  "BackgroundLoginPagePath": "string",
  "FaviconPath": "string",
  "IconKioskScreenLoadingPath": "string",
  "IconSpaAppPath": "string",
  "Logo": {
    "AuthPage": {
      "General": { "Path": "" }
    },
    "HorizontalPanel": {
      "Dark": { "Path": "" },
      "Height": 0,
      "Light": { "Path": "" },
      "Width": 0
    },
    "VerticalPanel": {
      "Dark": { "Path": "" },
      "Height": 0,
      "Light": { "Path": "" },
      "Width": 0
    }
  }
}
```

**Параметры:**

- `BackgroundLoginPagePath` — путь к фону на странице авторизации.
- `FaviconPath` — путь к favicon.
- `IconKioskScreenLoadingPath` — путь к обложке киоска.
- Кастомный загрузчик SPA (экран загрузки) в ключе `BrandSettings` не хранится: он задаётся отдельной системной настройкой «Кастомный лоадер SPA (Lottie JSON)» в секции «Веб-приложение» формы `system-settings` — см. [admin.md](https://help.1forma.ru/domains/system/admin.md).
- `IconSpaAppPath` — путь к иконке приложения SPA.

При запуске приложения с включённым `IsSpaHost` логотип страницы авторизации, `FaviconPath`, `IconKioskScreenLoadingPath` и `IconSpaAppPath` читаются либо как загруженный файл, либо с диска внутри веб-корня площадки; абсолютный путь внутри веб-корня тоже принимается. Путь, выходящий за веб-корень (с `..` или на другой диск), не читается: в журнал записывается ошибка, и этот элемент оформления остаётся штатным. Кастомный загрузчик SPA задаётся не путём, а значением настройки и от диска не зависит.

Секция `Logo`:
- `AuthPage` — путь к логотипу на странице авторизации.

Секция `HorizontalPanel`:
- `Light` — путь к логотипу (SPA) горизонтальная панель.
- `Dark` — путь к логотипу (SPA) горизонтальная панель, тёмная тема.
- `Width` — ширина логотипа (SPA) горизонтальная панель.
- `Height` — высота логотипа (SPA) горизонтальная панель.

Секция `VerticalPanel`:
- `Light` — путь к логотипу (SPA) вертикальная панель.
- `Dark` — путь к логотипу (SPA) вертикальная панель, тёмная тема.
- `Width` — ширина логотипа (SPA) вертикальная панель.
- `Height` — высота логотипа (SPA) вертикальная панель.

У каждой записи логотипа помимо `Path` есть `FileId` — идентификатор файла: пустое значение означает, что логотип не задан или задан путём, положительное — загруженный файл, отрицательное — встроенный пресет из каталога. В каталоге четыре SVG-логотипа Первой Формы из состава сборки — два белых (широкий и квадратный) и два цветных (квадратный и широкий), идентификаторы от −1 до −4. Выбор пресета и есть сброс слота на дефолтное логотип 1Ф: удалять загруженный файл отдельно не нужно. Прежние настройки, заданные путём, продолжают читаться. В `app-settings.json` каталог пресетов отдаётся ключом `logoPresetCatalog` — списком пар «идентификатор, SVG», а идентификаторы слотов — полями `appLogoPathSPAHorizontalFileId`, `appLogoPathSPAHorizontalDarkFileId`, `appLogoPathSPAVerticalFileId` и `appLogoPathSPAVerticalDarkFileId`.

---

## `MailBoxesLegacyReEncryptionCompleted`

**Тип:** `bool` · **По умолчанию:** `false`

Признак того, что площадка перевела все сохранённые пароли почтовых ящиков в формат `VENC:`. При `true` рабочий путь чтения перестаёт расшифровывать значения старого формата: подключение к ящику с таким остатком завершается отказом, в журнал пишется идентификатор ящика и источник значения. Утилита перешифровки читает старый формат независимо от этого ключа, поэтому остаток лечится её повторным прогоном. Выставляется вручную после прогона утилиты на всех инстансах, работающих с одной базой.

В сертифицированной сборке (1F Certificate Edition) этот ключ не читается: прежний шифровальщик паролей ящиков в неё не входит, поэтому отказ от значения прежнего формата безусловен, а утилиты перешифровки в поставке нет. Остаток чинится заменой пароля ящика либо перешифровкой на исходной площадке, на полной сборке, до формирования дампа — см. [Хранение паролей ящиков](https://help.1forma.ru/domains/mail/admin.md#хранение-паролей-ящиков).

---

## `CacheFullUpdateTimeoutSeconds`

**Тип:** `int` · **По умолчанию:** `600`

Предел времени (в секундах) одной полной загрузки кэша: по его истечении загрузка отменяется, снимок, полученный после отмены, не применяется, кэш продолжает отдавать прежние значения, а в журнал записываются имя кэша и длительность загрузки.

Настройка действует на любую полную перезагрузку кэша на ноде: по команде шины, при массовом обновлении, при прямом вызове из админки, доменного сервиса или задания планировщика и при загрузке кэшей на старте ноды. Если по типу кэша уже идёт полная загрузка, новый запрос склеивается с ней и ждёт результат не дольше этого предела. Если загрузчик кэша не принимает токен отмены, предел по нему не срабатывает — тип остаётся занятым до фактического конца чтения, а ожидающие возвращаются по своему пределу с прежними данными. Принимается только положительное значение: неположительное или неразбираемое трактуется как `600`.

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

---

## `CacheFullUpdateStaggerWindowSeconds`

**Тип:** `int` · **По умолчанию:** `120`

Окно (в секундах), в пределах которого нода-получатель команды полной перезагрузки кэша начинает загрузку со своим сдвигом. Сдвиг свой для каждого инстанса и типа кэша и рассчитывается из идентификатора инстанса и типа кэша, поэтому тяжёлый кэш не перезаполняется на всех нодах в одну и ту же минуту.

Нода, инициировавшая полную перезагрузку (правка администратора, сервис), обновляет свой кэш сразу, без сдвига. Ноды-получатели команды начинают загрузку в пределах окна, каждая в свой момент.

Значение `0` возвращает прежнее поведение: загрузка на получателе стартует сразу, без сдвига. Принимается неотрицательное целое число.

Пока идёт окно, остальные ноды отдают прежние данные — это принятая цена решения: правка справочника на одной ноде больше не заставляет весь кластер перезаполнять кэш одновременно.

Повторная команда на тот же тип кэша во время ожидания не запускает вторую загрузку: она склеивается с уже ожидающей и не переносит старт за пределы окна. Инвалидация по ключу и по значению между нодами, плановое обновление по расписанию и загрузка при старте ноды работают как прежде.

Настройка действует на полную перезагрузку кэшей по команде шины. Ключ создаётся автоматически при первом обращении.

## `CalendarExtParams`

**Тип:** JSON · **По умолчанию:** —

Календарные ДП для планирования встреч из задач.

**Формат:**
```json
{
  "allDayExtParamId": 0,
  "conferenceExtParamId": 0,
  "freeBusyStatusIDExtParamId": 0,
  "fromExtParamId": 0,
  "locationIdExtParamId": 0,
  "meetingCommentIDExtParamId": 0,
  "participantIDExtParamId": 0,
  "taskExtParamId": 0,
  "toExtParamId": 0,
  "typeIdExtParamId": 0
}
```

**Пример:**
```json
{
  "allDayExtParamId": 1111,
  "conferenceExtParamId": 1112,
  "freeBusyStatusIDExtParamId": 1113,
  "fromExtParamId": 1114,
  "locationIdExtParamId": 1115,
  "meetingCommentIDExtParamId": 1116,
  "participantIDExtParamId": 1117,
  "taskExtParamId": 1118,
  "toExtParamId": 1119,
  "typeIdExtParamId": 1120
}
```

---

## `CalendarPopupMenuSubcats`

**Тип:** `array` · **По умолчанию:** —

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

Если ключ не задан, в контекстном меню будут отображаться пункты «Событие в календаре», «Задача в категории» и список всех календарных категорий (с настройкой «Тип категории» = «Календарь»), если такие категории есть.

---

## `CalendarRequestTimeoutInMilliseconds`

**Тип:** `int` · **По умолчанию:** `30000` (30 секунд)

Определяет максимальное время ожидания (таймаут) в миллисекундах для выполнения запросов к календарю EWS.

---

## `CalendarSyncMinAppoinmentEndDaysBack`

**Тип:** `int` · **По умолчанию:** `3`

Минимальное количество дней назад от текущей даты, до которых учитываются завершённые встречи при синхронизации с Exchange.

---

## `ChangeLanguageInAppBar`

**Тип:** `bool` · **По умолчанию:** —

Отображает кнопку переключения языка интерфейса в верхней панели приложения.

---

## `CommitTransactionAfterSubcatIDChange`

**Тип:** `bool` · **По умолчанию:** `false`

Определяет стратегию работы с транзакциями при переносе задачи между категориями, в ходе которого вызывается хранимая процедура `dbo.UpdateTaskSubcatIDIsClosed`.

Если значение `true`, то обновление ДП при переносе задачи делается вне транзакции.

---

## `CompressDSSettings`

**Тип:** `bool` · **По умолчанию:** `true`

Управление форматом хранения настроек табличного вида списка задач категорий.

При включённом сжатии (`true`) настройки сохраняются в сжатом GZip формате в атрибуте `ValueGZip` таблицы `DataSourceSettings`. При отключении сжатия (`false`) настройки сохраняются в несжатом JSON в поле `Value`.

Система обеспечивает обратную совместимость: при загрузке настроек сначала проверяется наличие сжатых данных в `ValueGZip`, затем — JSON в поле `Value`. Если оба поля пусты, применяются настройки по умолчанию.

---

## `ConferenceDefaultUserRoomSettings`

**Тип:** JSON · **По умолчанию:** —

Дефолтные настройки для персональных ВКС-комнат пользователей. Применяются ко всем user-комнатам, у которых нет индивидуальных настроек.

При невалидном JSON применяются хардкод-значения системы, ошибка записывается в лог. Фактические значения по умолчанию (когда ключ не задан или JSON невалиден): `IsRecordingOnByDefault=true`, `IsTranscribationOnByDefault=true`, `HasLobby=false`.

**Формат:**
```json
{
  "IsRecordingAllowed": true,
  "IsRecordingOnByDefault": false,
  "IsTranscribationAllowed": true,
  "IsTranscribationOnByDefault": false,
  "HasLobby": true
}
```

**Параметры:**

- `IsRecordingAllowed` — разрешить запись ВКС.
- `IsRecordingOnByDefault` — включать запись автоматически при старте.
- `IsTranscribationAllowed` — разрешить транскрибацию.
- `IsTranscribationOnByDefault` — включать транскрибацию автоматически при старте.
- `HasLobby` — включить режим лобби.

---

## `ConferenceRoomUrlTemplate`

**Тип:** `string` · **По умолчанию:** `https://{origin}/{room}`

Параметризация автоматически генерируемой ссылки на ВКС.

Шаблон по умолчанию: `https://{origin}/{room}`, где:
- `{origin}` — `Services.Conference.Domain`.
- `{room}` — сгенерированный ID комнаты.

**Пример:**
```
https://<host>/conference/?room={room}
```

---

## `CreateIfNeeded`

**Тип:** JSON · **По умолчанию:** —

История наката кодовых миграций.

---

## `CSVImportMaxThreadsCount`

**Тип:** `int` · **По умолчанию:** `20`

Управляет количеством потоков для обработки данных при импорте задач из CSV-файла. Увеличение числа потоков ускоряет загрузку, но может вызывать ошибки («Specified argument was out of the range of valid values»). Для избежания ошибок рекомендуется установить значение `1` — загрузка будет выполняться в один поток, что приведёт к более длительной, но безошибочной загрузке.

Предел размера загружаемого файла этой настройкой не регулируется: на импорте задач, импорте базового плана и обновлении значений ДП из CSV он задан в коде постоянной величиной 50 МБ, и файл большего размера отклоняется до чтения.

Предел размера загружаемого файла этой настройкой не регулируется: на импорте задач, импорте базового плана и обновлении значений ДП из CSV он задан в коде постоянной величиной 50 МБ, и файл большего размера отклоняется до чтения.

---

## `custom-admin-panel`

**Тип:** `string` · **По умолчанию:** —

Пользовательскый конфиг административной панели в SPA. Если ключ не пустой и содержит валидный JSON, при старте приложения в корне www создаётся файл `custom-admin-panel.json` с содержимым из ключа.

---

## `custom-app-settings`

**Тип:** JSON · **По умолчанию:** —

Список расширенных свойств приложения. Свойства перечисляются в формате JSON. Отдельные свойства этой группы описаны в данном справочнике как самостоятельные ключи (`AdminPath`, `allowCSVGridFilter`, `AllowThemes`, `backgroundTasks` и другие).

---

## `CustomTaskUsedAsEpBlocksExtSettings`

**Тип:** JSON · **По умолчанию:** —

Позволяет не закрывать модальное окно после создания задачи из БИ.

Значение `true` для `isCloseNewTaskAfterCreate` означает, что после создания задачи из БИ будет открыта карточка созданной задачи (МТФ); при `false` пользователь останется в БИ.

**Формат:**
```json
{
  "$$TASKUSED_BLOCK_ID": {
    "isCloseNewTaskAfterCreate": false
  }
}
```

**Пример:**
```json
{ "15": { "isCloseNewTaskAfterCreate": false } }
```

---

## `customWorkersDictionarySP`

**Тип:** `string` · **По умолчанию:** —

Хранимая процедура, которая используется как источник данных для справочника сотрудников вместо стандартного источника данных.

---

## `DadataAddressProviderAppendApiV2Path`

**Тип:** `bool` · **По умолчанию:** `true`

Управляет тем, дописывать ли `/api/v2` к URL провайдера адресов Dadata. Исходное поведение (`true`) — путь дописывается. Только явное значение `false` отключает добавление пути; любое другое значение, отсутствие ключа или `null` трактуются как `true`. Используется для клиентов с актуальным форматом URL Dadata или корпоративным прокси.

---

## `DataSourceAggregates`

**Тип:** JSON · **По умолчанию:** —

Позволяет осуществить вывод и автоматический подсчёт итогов (сумма, среднее значение, минимум, максимум) числовых и денежных полей в списке задач категории и в блоке «Используется». Каждая операция отображается отдельной строкой в нижней части грида.

**Формат:**
```json
[
  {
    "type": "{type}",
    "id": 0,
    "gridTotalColumns": {
      "{column}": ["sum", "avg", "min", "max"]
    }
  }
]
```

**Параметры:**

`{type}`:
- `subcat` — для категории.
- `taskUsed` — для блока «Используется».

`{id}`:
- для категории: ID категории.
- для блока «Используется»: ID БИ из таблицы БД `CustomTaskUsedAsEpBlockSettings`.

`{column}`:
- для ДП: `ExtParam{ExtParamId}` (пример: если ID ДП = 123, то `ExtParam123`).
- для основных параметров: имя параметра (пример: «Общие плановые трудозатраты» = `overallPlan`, «Общие фактические трудозатраты» = `overallFact`).

**Пример для категории:**
```json
[{ "type": "subcat", "id": 5574, "gridTotalColumns": { "ExtParam65930": ["sum", "avg"] } }]
```

**Пример для блока «Используется»:**
```json
[{ "type": "taskUsed", "id": 39, "gridTotalColumns": { "ExtParam1709": ["sum", "avg"] } }]
```

Записи с типом `subcat` сервер больше не читает: источник итогов табличного вида категории — её собственные настройки таблицы (подсчёт итогов и операции по колонкам). Ключ `DataSourceAggregates` действует только для блока «Используется» (`taskUsed`); сохранённые ранее записи `subcat` остаются в базе, но на вывод итогов не влияют. Источник итогов категории переехал в её настройки таблицы.

---

## `DecodeBigTextEp`

**Тип:** `bool` · **По умолчанию:** —

Наличие ключа позволяет отображать эмодзи в ДП «Большой текст без/с форматированием». Ограничение ДП, к которым не будет применяться настройка, задаётся в ключе `DecodeBigTextEpExcept`.

---

## `DecodeBigTextEpExcept`

**Тип:** `array` · **По умолчанию:** —

Список ДП, к которым не будет применяться настройка `DecodeBigTextEp`.

---

## `DefaultConverterPdf`

**Тип:** `string` · **По умолчанию:** `SautinSoft`

Для преобразования документов в приложении используются конвертеры. Настройка позволяет выбрать конвертер по умолчанию для файлов с расширением `.pdf`.

Возможные значения:
- `Devexpress`
- `SautinSoft` (по умолчанию)
- `Aspose`

Если не задан, проверяется ключ `UseDevexpressDocToPdfConverter` в системном файле `appsettings.json`. Если ни `UseDevexpressDocToPdfConverter` (или задан в `false`), ни `DefaultConverterPdf` не заданы — используется `SautinSoft`.

> ℹ️ После добавления или изменения ключа требуется рестарт приложения.

---

## `DefaultConvertLib`

**Тип:** `string` · **По умолчанию:** `Devexpress` (при пустом значении)

Библиотека для конвертации форматов Word. Возможные значения:
- `Devexpress` — по умолчанию, если ключ не задан.
- `Aspose` — корректно конвертирует защищённые формы (`edit="forms"`), которые DevExpress ломает.

> ℹ️ Значение считывается при старте приложения — после добавления или изменения ключа требуется рестарт.

---

## `DefaultRevisionLib`

**Тип:** `string` · **По умолчанию:** `Devexpress` (при пустом значении)

Библиотека для работы с правками (ревизиями) в документах Word. Возможные значения:
- `Devexpress` — по умолчанию, если ключ не задан.
- `Aspose` — в отличие от DevExpress не требует нативного Skia.

> ℹ️ Значение считывается при старте приложения — после добавления или изменения ключа требуется рестарт.

---

## `DiadocLastEventsId`

**Тип:** JSON · **По умолчанию:** —

Идентификатор последних событий Диадок. Наличие ключа является обязательным условием для интеграции.

**Формат:**
```json
{
  "LastEvents": [
    {
      "BoxId": "string",
      "ClientId": " ",
      "Timestamp": 1704067200
    }
  ]
}
```

**Параметры:**

- `BoxId` — идентификатор организации. Можно посмотреть в веб-интерфейсе системы Диадок.
- `ClientId` — уникальный строковый идентификатор клиента. Получается после заключения договора на использование API Диадок.
- `Timestamp` — количество тиков в наносекундах от начальной даты 01.01.0001 до момента, когда в «Первую Форму» должен прийти первый документ. При значении `0` автоматически устанавливается дата первого подключения к Диадок.

---

## `DiadocLogEnabled`

**Тип:** `bool` · **По умолчанию:** `false`

Включение логирования ответов для интеграции с сервисом «Диадок».

---

## `DiagnosticEnabled`

**Тип:** `bool` · **По умолчанию:** `false`

Определяет, включена ли запись логов диагностики. При значении `true` участки кода, обёрнутые в `TCDiagnosticScope`, пишут в лог дерево операций со временем выполнения каждой.

---

## `DirectoryServices_TreatDomainAsDirectoryServer`

**Тип:** `array` · **По умолчанию:** —

Список доменов, которые трактуются как directory server (Active Directory) при поиске через DirectoryServices. Если ключ не задан, используется пустой список.

---

## `DisableAllCachesUpdate`

**Тип:** `bool` · **По умолчанию:** `false`

Отключение автоматического запуска обновления кэша после импорта конфигурации.

---

## `DisableCertificateCheckForMailDomains`

**Тип:** `string` (CSV) · **По умолчанию:** —

Список доменов почтовых серверов через запятую, для которых отключается проверка SSL-сертификата (IMAP, POP3, SMTP). Если ключ не задан, проверка сертификата выполняется для всех доменов.

---

## `DisableSmtpChunking`

**Тип:** `bool` · **По умолчанию:** `false`

Отключение разбиения на фрагменты (chunks) для SMTP. При включении система будет передавать всё тело письма как один монолитный блок данных вместо использования механизма чанкования.

---

## `DiskCacheDebounceWindowSeconds`

**Тип:** `int` · **По умолчанию:** `10`

Окно debounce (в секундах) для перестроения дисковых кэшей (`DiskFilePathCache` и подобных). Все вызовы `FullUpdate` в пределах этого окна объединяются в одно перестроение. Значение `<= 0` игнорируется — используется значение по умолчанию.

---

## `DiskCacheMaxDebounceWindowSeconds`

**Тип:** `int` · **По умолчанию:** `60`

Максимальное суммарное время ожидания (в секундах) с момента первого вызова `FullUpdate` в серии, по истечении которого перестроение дискового кэша запускается принудительно, даже если вызовы продолжают поступать. Защищает от бесконечного откладывания перестроения при непрерывном потоке вызовов. Значение `<= 0` игнорируется — используется значение по умолчанию.

---

## `DSUpdateCSVPermissions`

**Тип:** JSON · **По умолчанию:** —

Ключ влияет на право «Создание/обновление из CSV»: при отсутствии права у текущего пользователя в списке задач не будут отображаться соответствующие кнопки.

**Формат:**
```json
[
  {
    "subcats": [],
    "groups": []
  }
]
```

**Параметры:**

- `groups` — список ID групп, для пользователей которых необходимо включить кнопки.
- `subcats` — список ID категорий, для которых необходимо включить кнопки.

**Пример:**
```json
[{ "subcats": [41380], "groups": [1620] }]
```

---

## `EdsSettings`

**Тип:** JSON · **По умолчанию:** —

Настройки электронной подписи (ЭП) в системе.

---

## `EnableAnfisaSessionPanel`

**Тип:** `bool` · **По умолчанию:** `true`

Управляет отображением панели AI-сессий во вкладке чата ИИ-ассистента Анфисы. Если значение явно задано (`true`/`false`), используется оно. Если ключ не задан, панель показывается только при условии, что заданы оба ключа — `anfisa_user_id` и `AnfisaJobScriptId`.

---

## `EnableCipherInUniversalApiCallbackUrls`

**Тип:** `bool` · **По умолчанию:** `false`

Включить шифрование в URL-адресах обратного вызова UniversalAPI.

---

## `EnabledLocalizedSearch`

**Тип:** `bool` · **По умолчанию:** —

Позволяет учитывать локализованные значения при поиске в списке задач категории.

---

## `EnableEwsCalendarInboxAccess`

**Тип:** `bool` · **По умолчанию:** —

Управление обращением к папке Inbox при синхронизации с Exchange в функционале календаря.

---

## `EnableEwsEmailSubscriptions`

**Тип:** `bool` · **По умолчанию:** —

Управление подпиской на события в почтовом ящике Inbox при синхронизации с Exchange.

---

## `EnableEwsSetDirectSyncDisabledWhenEwsErrorsOccurs`

**Тип:** `bool` · **По умолчанию:** —

Управление функционалом, при котором в случае возникновения ошибок Exchange (`ServiceError.ErrorNonExistentMailbox`, `ServiceError.ErrorItemNotFound`, `ServiceError.ErrorFolderNotFound`, `ServiceError.ErrorInvalidFolderId`, `ServiceError.ErrorInvalidSmtpAddress`) у пользователя увеличивается счётчик ошибок синхронизации.

---

## `EnableEwsSubscriptions`

**Тип:** `bool` · **По умолчанию:** —

Управление подпиской на события Exchange.

---

## `EveryTagExtParams`

**Тип:** `array` · **По умолчанию:** —

Необходимо для интеграции с файловым провайдером EveryTag. Содержит массив ID ДП. При обработке запросов на скачивание/просмотр файлов из этих ДП в EveryTag отправляется информация для установки метки времени.

---

## `EveryTagSubcats`

**Тип:** `array` · **По умолчанию:** —

Необходимо для интеграции с файловым провайдером EveryTag. Содержит массив ID категорий. При обработке запросов на скачивание/просмотр файлов из этих категорий в EveryTag отправляется информация для установки метки времени.

---

## `ExcludeSystemSubstitutes`

**Тип:** `bool` · **По умолчанию:** `true`

Установка запрета акцепта подписей замещаемых пользователей для заместителей. Запрошенные подписи не будут отображаться в таблице «Ожидающие вашей подписи» и не будут учитываться в счётчике подписей у заместителей.

При запросе подписи заместители не добавляются в акцептанты, если данная настройка включена (`true`) и активна опция подписи на переходе «Запретить подписывать заместителю».

---

## `ExchangeConnectionLifetime`

**Тип:** `int` · **По умолчанию:** `1`

Время существования соединения с подписками в минутах (от 1 до 30).

---

## `ExchangeConnectionPoolSize`

**Тип:** `int` · **По умолчанию:** `100`

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

---

## `ExchangeNotification_ConnectionLifetime`

**Тип:** `int` · **По умолчанию:** `30`

Время действия соединения при обновлении событий из Exchange, задаётся в минутах от 1 до 30. Применяется после переподключения.

---

## `ExchangePermissionsCacheLifeTime`

**Тип:** `int` · **По умолчанию:** `240` (4 часа)

Время жизни кеширования Exchange в минутах.

---

## `ExchangeSemaphoreCount`

**Тип:** `int` · **По умолчанию:** `50`

Количество одновременно обрабатывающихся конкурентных запросов в семафоре.

---

## `ExchangeSemaphoreWait`

**Тип:** `int` · **По умолчанию:** `0`

Время ожидания семафора в миллисекундах (таймаут).

---

## `ExchangeSubscriptionsToLog`

**Тип:** `bool` · **По умолчанию:** —

Включает запись в журнал ошибок при создании подписок.

---

## `ExperimentalTableEpIds`

**Тип:** `string` (CSV) · **По умолчанию:** —

Список ID ДП-таблиц через запятую, для которых включён экспериментальный режим (миграция на UI Angular 2). Если ключ не задан или пуст, экспериментальный режим не применяется.

---

## `ExportAgGridAsCsv`

**Тип:** `bool` · **По умолчанию:** `false`

Позволяет экспортировать список задач категории в формат `.csv` по кнопке «В Excel». Если ключ отсутствует или `false`, файл экспортируется в формате `.xlsx`.

---

## `ExportDataToExcelAllowedProcedures`

**Тип:** список имён · **По умолчанию:** —

Хранимые процедуры, которые разрешено вызывать смарт-действию «Экспортировать данные в Excel». Ключ глобальный, без привязки к пользователю. Пустое или отсутствующее значение не разрешает ни одной процедуры и при чтении не создаётся.

Записи разделяются запятой, точкой с запятой или переводом строки. Запись — это имя процедуры либо префикс, оканчивающийся звёздочкой (например, `sp_met_*`), чтобы новые имена той же группы не требовали правки списка. Имя — один идентификатор или `схема.идентификатор`; идентификатор начинается с буквы (в том числе кириллической) или подчёркивания, дальше буквы, цифры и подчёркивания, не длиннее 128 символов; символы `@`, `#` и `$` не принимаются. Перед сверкой из имени убираются квадратные скобки и ведущая схема `dbo`, поэтому `sp_name`, `dbo.sp_name` и `[dbo].[sp_name]` — одно и то же имя. Одиночная звёздочка игнорируется; прочие записи, не похожие на имя или префикс, пропускаются и называются в тексте отказа в журнале пакета.

---

## `ExtendedSubcatSettings`

**Тип:** JSON · **По умолчанию:** —

Позволяет отключить вопросы для категории, а также требования комментария на «Вопрос не мне».

**Формат:**
```json
{
  "$SUBCAT_ID": {
    "commentQuestionsAllow": true,
    "commentNotMeAnswerRequired": true
  }
}
```

**Параметры:**

- `commentQuestionsAllow` — если `false`, запрещено помечать вопросом комментарий в данной задаче/чате.
- `commentNotMeAnswerRequired` — если `false`, в данной задаче не требуется написание комментария при выборе «Вопрос не мне».

---

## `ExtParamExtraSettings`

**Тип:** JSON · **По умолчанию:** —

Устанавливает для ДП «Файл» режим, при котором разрешено только сканирование файла без возможности вложения (в интерфейсе будет доступна только кнопка «Сканировать»).

**Формат:**
```json
{ "ExtParamID": { "scanOnly": true } }
```

**Пример:**
```json
{ "125": { "scanOnly": true }, "6020": { "scanOnly": true } }
```

---

## `ExtParams_CalendarEventChangeLog`

**Тип:** `bool` · **По умолчанию:** `false`

Включает логирование изменений событий в календаре.

---

## `ExtParamTableLookUpTextLength`

**Тип:** `int` · **По умолчанию:** `100`

Задаёт максимально доступное значение символов для отображения значения в ячейке ДП «Таблица» с типом «Lookup поле». Символы сверх лимита обрезаются.

---

## `FaviconBadgeMode`

**Тип:** `string` · **По умолчанию:** `full`

Управляет режимом отображения счётчика непрочитанных сообщений на иконке вкладки браузера (фавиконе).

**Возможные значения:**
- `full` — по умолчанию. При наличии непрочитанных фавикон вкладки полностью заменяется круглым индикатором с числом сообщений.
- `overlay` — сохраняет оригинальный (в том числе брендированный) фавикон и накладывает компактный бейдж со счётчиком в правый нижний угол иконки.
- `off` — отключает счётчик и мигание на фавиконе: вкладка всегда показывает статичный значок, а число непрочитанных остаётся в текстовом заголовке вкладки (`title`).

Значение отдаётся в анонимном конфиге `GET /app-settings.json` и применяется глобально для всей площадки после обновления страницы.

---

## `FileIdToStartOcr`

**Тип:** `int` · **По умолчанию:** —

Минимальный ID файла (из таблицы БД `FileStorageFiles`), с которого начинается обработка файлов заданиями по таймеру `OcrJob` и `TikaJob` (каждые 15 минут в течение дня).

- `OcrJob` — распознавание текста в изображениях (img, jpg, png).
- `TikaJob` — распознавание текста в документах (pdf, doc, docx, xsl, xslx, ppt, pptx, txt, xml, html, eml, sql, pgsql, xml, json).

---

## `FirstCommentIdWithNoRecipients`

**Тип:** `int` · **По умолчанию:** —

ID комментария, начиная с которого адресаты комментария больше не хранятся в теле комментария.

Ключ действует начиная с релиза 2.240. Создан для большей совместимости интерфейса SPA и задания по таймеру `ClearCommentRecipientsArchiveJob`. Рекомендуется использовать компаниям, работающим в интерфейсе SPA.

Если значение ключа больше `0`, то в пользовательском интерфейсе поддерживается форматирование комментариев.

---

## `ForbidAuthByPhone`

**Тип:** `bool` · **По умолчанию:** —

Запрещает авторизацию по номеру телефона.

---

## `ForbidEmailAsLogin`

**Тип:** `bool` · **По умолчанию:** `false`

Если ключ активен, вход в систему осуществляется только по логину, а вход по email становится невозможен.

---

## `ForbidPhoneAsLogin`

**Тип:** `bool` · **По умолчанию:** —

Запрещает использование номера телефона в качестве логина при входе.

---

## `ForbidSubcatRightsInheritanceToDirector`

**Тип:** `true/false` или `1/0` · **По умолчанию:** `true`

Руководители по умолчанию не наследуют право на просмотр всех задач категории от своих подчинённых.

- `true` или `1` — права не наследуются.
- `false` или `0` — права наследуются.

Значение хранится строкой. Миграция, включающая запрет, пишет `true` в MS SQL и `1` в PostgreSQL; читатели разбирают его булевым приведением — `try_cast(… as bit)` в MS SQL и `dbo.try_cast_bool(…)` в PostgreSQL, поэтому обе формы записи равнозначны. Целочисленный разбор для этой настройки не годится: на строке `true` он даёт NULL, что читается как «запрет не задан».

Учитывает только право «Просмотр всех задач» в настройках доступа категории для групп. Отдельно можно выдать запрет для руководителя на наследование через опцию в общих настройках приложения «Руководитель наследует право на просмотр задач, где его подчинённые заказчики или исполнители».

---

## `ForbidTCLogin`

**Тип:** `1/0` · **По умолчанию:** `0`

Опциональная проверка входа в приложение TaskCenter.

- `1` — доступ к приложению будет проверяться при попытке входа.
- `0` — в приложение TaskCenter сможет войти любой пользователь.

> ℹ️ Относится к legacy-приложению TaskCenter (.NET Framework). Актуально только для старых инсталляций.

---

## `FromUtpTableFirstOrderSubcats`

**Тип:** JSON · **По умолчанию:** —

Массив ID категорий, для которых в запросе списка задач запрос прав будет первым в выражении FROM.

**Формат:**
```json
{
  "LookupSubcatIds": [],
  "LookupSummaryIds": []
}
```

**Параметры:**

- `LookupSubcatIds` — ID категорий.
- `LookupSummaryIds` — ID категорий сводного раздела.

---

## `ganttExportPdfUrl`

**Тип:** `string` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Полный адрес подключения к сервису `pdfExport`. Используется для экспорта проекта в PDF в проектном управлении «Первой Формы».

Предварительно требуется настройка сервиса экспорта PDF.

---

## `ganttImportMppUrl`

**Тип:** `string` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Полный адрес подключения к сервису `Mpp-Importer`. Используется для загрузки файла проекта с расширением `.mpp`, созданного в Microsoft Project, в проектном управлении «Первой Формы».

Предварительно требуется настройка сервиса импорта `Mpp-Importer`.

---

## `GantSettings`

**Тип:** JSON · **По умолчанию:** —

Настройка проектного управления в представлении Диаграммы Ганта. Актуально для версий 2.256 — 2.261.

**Формат:**
```json
{
  "projectEpId": 0,
  "orderedDateEpId": 0
}
```

**Параметры:**

- `projectEpId` — ID ДП для связи проекта с задачами.
- `orderedDateEpId` — ID ДП с дополнительным сроком.

**Пример:**
```json
{ "projectEpId": 1234, "orderedDateEpId": 5678 }
```

---

## `GridColumnOperationRestrictionsDisabled`

**Тип:** `bool` · **По умолчанию:** `false`

Отключает ограничение операций по колонкам дополнительных параметров для всей площадки. При `true` фильтр, быстрый поиск, сортировка, группировка, итоги и список значений работают по колонкам с матрицей доступа, пакетной SQL-функцией и настройкой «Доступ зависит от статуса» так же, как по колонке того же типа без настроенного доступа — в таблице задач категории и в таблицах выбора лукапа и мультилукапа. Сужение выборки по читаемым состояниям при этом в запрос не добавляется.

Любое другое значение, отсутствие строки настройки и сбой её чтения сохраняют прежнее поведение: ограничение работает как обычно. Маскировка значений от настройки не зависит — значение, которое пользователь не читает, по-прежнему скрыто в ячейке, карточке задачи, таблице выбора и выгрузке. Отдельных настроек по категории, параметру, пользователю или виду операции нет.

Ключ создаётся при первом чтении, применяется на всех узлах без перезапуска пула. Описание механизма и точек перехвата — [Отключение ограничения операций по колонкам ДП](https://help.1forma.ru/domains/grids/column-operation-restrictions-switch.md).

---

## `GroupsInProfile`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Отображает список групп пользователя в его профиле.

---

## `HelperCustomLink`

**Тип:** `string` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Пользовательская ссылка Help. Если значение параметра отлично от пустой строки, то при нажатии на иконку Help (в правом верхнем углу) будет открываться страница по указанной ссылке.

---

## `HideDefaultTags`

**Тип:** `bool` · **По умолчанию:** `false`

Входит в группу расширенных свойств приложения `custom-app-settings`. Скрыть теги в ленте комментариев. Если параметр отсутствует или `false`, то в качестве тегов по умолчанию отображается название категории и статус задачи.

---

## `HideEmptyEpOnNtf`

**Тип:** `bool` · **По умолчанию:** `false`

Входит в группу расширенных свойств приложения `custom-app-settings`. Настройка «Скрыть на НТФ при пустом значении». Если `true`, то ДП в карточке создания задачи с включённой настройкой «Скрыть при пустом значении», не имеющие значений, будут скрыты.

---

## `hideSubcatSyndicateControls`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Скрывает элементы управления синдикацией в настройках категории.

---

## `HideUserInfoButton`

**Тип:** `bool` · **По умолчанию:** `false`

Входит в группу расширенных свойств приложения `custom-app-settings`. Скрывает пункт «Инфо пользователя» в контекстном меню пользователя при клике на имя в комментариях, в ДП «Выбор пользователя» и «Адресаты Email», а также в контекстном меню исполнителя карточки задачи — и в списке исполнителей, и по чипу сотрудника в открытом поле.

---

## `HideUserVoipToken`

**Тип:** `bool` · **По умолчанию:** —

Позволяет скрыть `VoipToken` в отдаче данных о пользователях.

---

## `highCharts`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Использование по умолчанию библиотеки highCharts для отображения графиков и диаграмм. Если отключено, используется библиотека ApexCharts.

---

## `imageCompressionEngine`

**Тип:** JSON · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Компрессия изображений.

> ℹ️ По умолчанию в системе используется Compressorjs.

**Формат:**
```json
{
  "imageCompressionEngine": {
    "engine": "BrowserImageCompression | Squoosh | Compressorjs",
    "BrowserImageCompression": {
      "maxSizeMB": 1,
      "maxWidthOrHeight": 1920,
      "initialQuality": 0.8,
      "alwaysKeepResolution": false
    }
  }
}
```

---

## `ImapTimeout`

**Тип:** `int` · **По умолчанию:** `40000` (40 секунд)

Таймаут на выполнение IMAP операции при синхронизации в миллисекундах.

---

## `IsFeedsViewOnly`

**Тип:** `bool` · **По умолчанию:** `false`

Входит в группу расширенных свойств приложения `custom-app-settings`. При клике в Избранном на категории открывается представление Лента, а представление Таблица будет скрыто. Также в дереве «Мои задачи» будут отображаться «Заказчик», «Исполнитель», «Подписка», а скрыты «Согласования» и «Задачи подчинённых».

---

## `IsOldSignTicker`

**Тип:** `bool` · **По умолчанию:** `false`

Входит в группу расширенных свойств приложения `custom-app-settings`. Позволяет открывать старый список подписей по соответствующему индикатору в интерфейсе SPA.

---

## `LazyJobsNumberOfItemsToProcessInBatch`

**Тип:** `int` · **По умолчанию:** `20`

Позволяет задать значение количества записей, которые будут единоразово обработаны в задании по таймеру `LazyUpdatableCachesUpdateJob`.

---

## `LazyJobsShowDetailedLog`

**Тип:** `bool` · **По умолчанию:** —

Выводит более подробные данные в сообщении задания по таймеру `LazyUpdatableCachesUpdateJob`: ключи и полученные значения.

---

## `LDAP_AdGlobalCatalogHosts`

**Тип:** `string` · **По умолчанию:** —

Список доменов, для которых **все** LDAP-запросы (включая синхронизацию пользователей и навигацию по дереву AD) направляются через порты глобального каталога Active Directory: 3269 (LDAPS) и 3268 (LDAP) вместо стандартных 636/389.

Ускоряет запросы, однако глобальный каталог содержит не все атрибуты — часть из них может отсутствовать при синхронизации. Если это критично, используйте `LDAP_AdGlobalCatalogHostsNavigate`.

Если ни `LDAP_AdGlobalCatalogHosts`, ни `LDAP_AdGlobalCatalogHostsNavigate` не заданы, запросы идут через стандартные порты 636/389. Значения задаются в виде доменных имён через запятую.

---

## `LDAP_AdGlobalCatalogHostsNavigate`

**Тип:** `string` · **По умолчанию:** —

Список доменов, для которых порты глобального каталога Active Directory (3269/3268) используются **только при построении дерева навигации**. Для остальных операций, в том числе синхронизации пользователей, применяются стандартные порты 636/389.

Используйте этот ключ вместо `LDAP_AdGlobalCatalogHosts`, если в глобальном каталоге отсутствуют атрибуты, необходимые для синхронизации, но навигация по дереву AD должна работать быстро. Значения задаются в виде доменных имён через запятую.

---

## `LogPlanExecution`

**Тип:** `int` · **По умолчанию:** —

Позволяет задать порог логирования для анализа производительности запросов. Значение — время в миллисекундах.

Если длительность выполнения SQL-запроса превышает значение, установленное в настройке, то автоматически формируется план выполнения, который записывается в колонку «План запроса» в логе автоматизации.

Функция доступна только для СУБД PostgreSQL. Работает только при включённом логировании SQL-запросов в общей настройке приложения.

---

## `LogRefreshTokenRequests`

**Тип:** `bool` · **По умолчанию:** —

Действия пользователей логируются в таблице `LoginsLog` и отображаются в логах МП и журнале пользователя не только после входа в мобильное приложение, но и при обновлениях токена.

---

## `matomo`

**Тип:** JSON · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Инициализирует код отслеживания Matomo для расчёта базовой аналитики.

**Формат:**
```json
{
  "matomo": {
    "baseURL": "https://***/matomo.php",
    "serverAddress": "**.**.ru",
    "siteId": 5,
    "analyticGroups": []
  }
}
```

**Параметры:**

- `baseURL` — базовый URL-адрес.
- `serverAddress` — адрес сервера.
- `siteId` — уникальный идентификатор сайта.
- `analyticGroups` — аналитическая группа пользователей. Указываются идентификаторы групп через запятую. При наличии значений параметр запускает отслеживание данных указанных пользователей.

**Пример:**
```json
{
  "matomo": {
    "baseURL": "https://matomo.1forma.ru/matomo.php",
    "serverAddress": "matomo.1forma.ru",
    "siteId": 2,
    "analyticGroups": [5350, 5360]
  }
}
```

---

## `MaxExcelExportRows`

**Тип:** `int` · **По умолчанию:** `50000`

Глобальный лимит строк для экспорта в Excel. Проверяется **до** формирования файла: если запрошено больше строк, чем задано в ключе, система вернёт ошибку. Значение также передаётся на фронтенд.

Для ограничения непосредственно при формировании Excel-файла используйте `MaxGridExcelExportRows`.

Лимит действует на два экспорта: табличное представление категории и портальный блок. Для блока он применяется независимо от источника — представление ограничивается в самом запросе, у хранимой процедуры результат читается последовательно и чтение обрывается, как только строк оказалось больше лимита. При превышении экспорт завершается ошибкой вида «Max rows to export: N», где N — значение ключа, и лишние строки в память не загружаются.

Предельное значение ключа — `int.MaxValue` (2 147 483 647): оно снимает ограничение по числу строк, выгрузка идёт целиком. При любом другом значении лимит работает как описано выше.

---

## `MaxGridCsvExportRows`

**Тип:** `int` · **По умолчанию:** —

Лимит строк при фактическом формировании CSV-файла (обработчик CsvHelper). Проверяется в момент записи данных в файл. Если не задан — лимит не применяется.

Отличие от `MaxExcelExportRows`: тот ключ — предварительная глобальная проверка, этот — ограничение конкретно на этапе записи CSV.

---

## `MaxGridExcelExportRows`

**Тип:** `int` · **По умолчанию:** —

Лимит строк при фактическом формировании Excel-файла (обработчик ClosedXML). Проверяется в момент записи данных в файл. Если не задан — лимит не применяется.

Отличие от `MaxExcelExportRows`: тот ключ — предварительная глобальная проверка, этот — ограничение конкретно на этапе записи Excel.

---

## `MaxLogSizeIndexRebuid`

**Тип:** `int` · **По умолчанию:** `10000`

Максимальный размер лога в процедуре ночного обслуживания индексов `IndexRebuild`. При некорректном значении ключа применяется `10000`.

> ℹ️ В имени ключа в коде допущена опечатка («Rebuid» без буквы «l») — ключ нужно задавать именно в таком написании.

---

## `MaxSMSLength`

**Тип:** `int` · **По умолчанию:** `189`

Максимально допустимое количество символов в отправляемом из «Первой Формы» SMS-сообщении. Символы, выходящие за указанный лимит, будут обрезаны.

---

## `MigrationExportJobIsRunning`

**Тип:** `bool` · **По умолчанию:** `false`

Служебный флаг «джоб экспорта миграции выполняется». Устанавливается в `true` при запуске `MigrationExportJob` и предотвращает повторный запуск экспорта, пока предыдущий не завершён. Ключ создаётся автоматически при первом обращении.

> ℹ️ Ключ устанавливается системой и не предполагает ручного редактирования.

---

## `MigrationExportPageSizeSettingKey`

**Тип:** `int` · **По умолчанию:** `5000`

Размер страницы при экспорте данных в ходе переноса категорий (модуль `ModuleMigration`).

---

## `MigrationExportSettings`

**Тип:** `string` · **По умолчанию:** —

Исключение типов объектов из экспорта конфигурации.

В качестве значения указывается полный путь до типа данных. Для нескольких типов — перечислите через запятую.

**Пример** отключения экспорта прав доступа групп к категории:
```json
{ "ExcludeTypes": ["TCDataAccess.Kernel.Domain.Entities.Groups.GroupPermissionEntity"] }
```

---

## `MigrationImportWizardState`

**Тип:** JSON · **По умолчанию:** —

Служебное состояние мастера импорта при переносе категорий (модуль `ModuleMigration`): владелец операции, токен, загруженный файл. Заполняется и читается самим мастером по ходу импорта.

> ℹ️ Ключ устанавливается системой и не предполагает ручного редактирования.

---

## `MobileAppSettings`

**Тип:** JSON · **По умолчанию:** —

Настройки мобильного приложения. Отдельные параметры этой группы (`mspaByDefault`, `openInBrowserDomains`) описаны ниже как самостоятельные ключи.

---

## `mspaByDefault`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу `MobileAppSettings`. Отображение в мобильной версии кнопки «Перейти в Desktop версию» в разделе «Настройки» бокового меню.

---

## `MultiLookupChooseAllLimit`

**Тип:** `int` · **По умолчанию:** `10000`

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

---

## `NewCustomGrid.FromUtpTableFirstOrderSubcats`

**Тип:** JSON · **По умолчанию:** —

Управляет порядком таблицы прав в SQL-запросе нового грида для указанных категорий. Аналог `FromUtpTableFirstOrderSubcats` для нового табличного представления.

---

## `NewCustomGrid.UtpTableApplyOnSummarys`

**Тип:** JSON · **По умолчанию:** —

Применяет таблицу прав (`utp`) к сводным разделам в новом табличном представлении.

---

## `newEpTable`

**Тип:** JSON · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Отображает ДП «Таблица» в новом виде для определённых пользователей и категорий.

**Формат:**
```json
[
  {
    "users": [],
    "subcat": []
  }
]
```

**Параметры:**

- `users` — список ID пользователей, для которых необходимо включить новую таблицу.
- `subcat` — список ID категорий, для которых необходимо включить новую таблицу.

Чтобы включить таблицу для всех пользователей или для всех категорий, в качестве значения нужно задать `"*"`.

**Пример:**
```json
[{ "users": [123, 456], "subcat": [1111, 2222] }]
```

Для всех пользователей и всех категорий:
```json
[{ "users": "*", "subcat": "*" }]
```

---

## `NewsSettings`

**Тип:** JSON · **По умолчанию:** —

Настройки модуля новостей. Определяет служебные категории, используемые для хранения и отображения новостей в системе.

---

## `newTaskSpa`

**Тип:** JSON · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Новый НТФ. Включает отображение новой карточки создания задачи с новыми ДП для указанных пользователей и категорий.

> ℹ️ Обратите внимание: добавленные ранее вставки не будут корректно работать при переходе на новый НТФ в SPA.

**Формат:**
```json
{
  "newTaskSpa": {
    "excludeSubcats": [],
    "excludeUsers": [],
    "rules": [
      {
        "subcats": [],
        "users": []
      }
    ]
  }
}
```

**Параметры:**

- `excludeSubcats` — список ID категорий, для которых нужно исключить отображение новой карточки создания задачи.
- `excludeUsers` — список ID пользователей, которых нужно исключить из правила.
- `rules`:
  - `users` — список ID пользователей, для которых нужно включить новую карточку.
  - `subcats` — список ID категорий, в которых нужно включить новую карточку для указанных пользователей.

Чтобы включить для всех пользователей или для всех категорий, в качестве значения задать `"*"`.

**Пример:**
```json
{
  "newTaskSpa": {
    "excludeSubcats": [6915, 9251, 44950],
    "excludeUsers": [29359],
    "rules": [{ "subcats": [8631, 5860], "users": "*" }]
  }
}
```

---

## `NoValidateFixLengthPlan`

**Тип:** `bool` · **По умолчанию:** —

Позволяет изменить плановые трудозатраты, если фактические списания превышают плановые.

---

## `OfficeOnlineEditor`

**Тип:** JSON · **По умолчанию:** —

Настройка редактора офисных файлов: замена сервера, кастомизация настроек редактора.

Для Р7-Офис в параметре `editor` указывается `"r7"`, для ONLYOFFICE Docs — `"onlyOffice"`. Значение `"webApps"` в актуальных сборках не работает: интеграция с MS Office Web Apps удалена.

**Формат:**
```json
{
  "editor": "string",
  "settings": {
    "serverAddress": "string",
    "allowedIPs": [],
    "internalKeyLifetimeHours": 12
  }
}
```

**Параметры:**

- `editor` — указывает используемый редактор. Доступные значения: `r7`, `onlyOffice`.
- `serverAddress` — адрес сервера (например, `https://r7.1forma.ru/` или `https://1f.domain/office/`). Кроме выдачи браузеру используется как доверенный адрес, с которого принимается содержимое новой версии: сверяются схема, хост и порт.
- `allowedIPs` — список разрешённых IP-адресов или подсетей. Может быть пустым — тогда пускает всех и пишет предупреждение в журнал.
- `internalKeyLifetimeHours` — срок жизни конверта личности в обратном адресе редактора и ссылок на аватары, в часах. Не задан или не положителен — 12 часов.

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

> ℹ️ В версиях 2.264 Кассиопея и ниже для Р7-Офис и OnlyOffice необходимо указывать значение `"r7"`. Начиная с версии 2.265 Цефей доступно значение `"onlyOffice"` для одноимённого редактора.

**Пример:**
```json
{ "editor": "r7", "settings": { "serverAddress": "https://r7.1forma.ru/", "allowedIPs": [] } }
```

---

## `OktellIntegration`

**Тип:** JSON · **По умолчанию:** —

Настройки интеграции с телефонной системой Oktell.

---

## `OnlyNameUsersSearch`

**Тип:** `bool` · **По умолчанию:** `false`

Позволяет изменить логику того, по каким параметрам работает поиск сотрудников.

- `true` — при поиске по сотрудникам учитываются только параметры `DisplayName` и `FullName`.
- `false` — в результатах поиска отображаются профили пользователей, у которых совпало имя, телефон или любой другой параметр с введённым значением.

---

## `openInBrowserDomains`

**Тип:** `array` · **По умолчанию:** —

Входит в группу `MobileAppSettings`. Добавление доменов для открытия ссылок в браузере мобильного устройства вместо встроенного браузера WebView внутри приложения.

Массив должен содержать список доменов, которые будут открыты из МП в браузере устройства. Домены указываются без протокола `https://`.

**Пример:**
```json
"openInBrowserDomains": ["2ip.ru", "ya.ru"]
```

---

## `OrgStructure_AllowNonUniqueOrgUnitNames`

**Тип:** `bool` · **По умолчанию:** `false`

Установка ограничения на создание нескольких организационных единиц с одинаковыми названиями внутри одной ветки дерева.

- `true` — ограничение не установлено.
- `false` — ограничение установлено.

---

## `ParseCommentsLinksJob_LastParsedCommentId`

**Тип:** `int` · **По умолчанию:** —

ID последнего обработанного комментария заданием по таймеру `ParseCommentsLinksJob`.

---

## `PasswordRecoveryText`

**Тип:** `string` (Markdown) · **По умолчанию:** —

Пользовательскый текст, отображаемый на странице восстановления пароля (`/spa/entry/password-recovery`). Поддерживает Markdown-форматирование.

---

## `PathToDebugFiles`

**Тип:** `string` · **По умолчанию:** `C:/temp/`

Путь к папке для сохранения файлов выгрузки оргструктуры из 1С (`SyncOrgStructure1C`). Если путь не оканчивается на `/`, слеш добавляется автоматически; при отсутствии папки она создаётся.

---

## `PatMaxExpirationDays`

**Тип:** `int` · **По умолчанию:** `365`

Задаёт максимально допустимый срок действия PAT-токена в днях. Значение `0` означает, что разрешено создавать бессрочные токены. Если параметр не задан, максимальный срок действия составляет 1 год (365 дней).

---

## `PatMaxTokensPerUser`

**Тип:** `int` · **По умолчанию:** `10`

Определяет максимальное количество активных (не отозванных) PAT-токенов, которые может иметь один пользователь. Если параметр не указан, по умолчанию действует лимит в 10 токенов.

---

## `personalDynSignaturesOnly`

**Тип:** `array` · **По умолчанию:** `[]`

Отдельный ключ кастомных настроек приложения — не входит в группу расширенных свойств `custom-app-settings`. Строка создаётся автоматически с пустым массивом, добавлять её вручную не нужно. Значение — массив `SubcatID` (ID категорий). В задачах этих категорий окно «Запросить подпись» показывает только личные подписи: переключателя «Должностные подписи / Личные подписи» нет, окно сразу открывается на личных, а параметр общих настроек приложения «Вид динамической подписи по умолчанию» для них не действует. Пустой массив — ограничение выключено.

Ограничение работает в окне «Запросить подпись» веб-интерфейса. Сервер ключ не проверяет: запросы подписи через API, смарт-действия и подписи на маршруте он не ограничивает.

---

## `pm-defaultTaskColor`

**Тип:** `string` · **По умолчанию:** —

Отдельный ключ кастомных настроек приложения — не входит в группу расширенных свойств `custom-app-settings`. Строка создаётся автоматически при старте приложения с пустым значением, администратору добавлять её не нужно. Задаёт цвет, которым при создании нового проекта окрашиваются его задачи в проектном Ганте. Допустимые значения: `Default`, `Blue`, `Green`, `Orange`, `Red`, `Purple`, `Gray` — строго в таком написании, с учётом регистра; другие варианты (в том числе `Grey`) при сохранении отклоняются с ошибкой. `Default` или пустое значение — цвет не назначается. Цвет применяется только к задачам без собственного цвета (уже окрашенные задачи не перекрашиваются). Это не режим отображения «Цвет задач» — он задаётся отдельной настройкой проектного Ганта.

---

## `pm-defaultTaskColorMode`

**Тип:** `string` · **По умолчанию:** `none`

Входит в группу расширенных свойств приложения `custom-app-settings`. Задаёт режим окраски задач проектного Ганта, действующий на площадке по умолчанию: он предвыбран в окне создания плана и применяется к планам, в которых собственный режим не сохранён. Допустимые значения: `none` («Нет») — задачи не окрашиваются; `markers` («Маркеры») — используется цвет-маркер, заданный задаче в плане, а новым задачам подставляется цвет из `pm-defaultTaskColor`; `taskColor` («Цвет задач») — берётся цвет связанной задачи 1Ф, а при его отсутствии — цвет её категории. Регистр значения не учитывается; пустое или неизвестное значение равнозначно `none`. Режим, сохранённый в настройках конкретного плана, имеет приоритет над этим ключом.

---


## `PostMarkAsAnsweredWithUserType`

**Тип:** `bool` · **По умолчанию:** `false`

Комментарий «Как отвеченный» для вопросов по умолчанию становится пользовательского типа. Если ключ не задан или `false`, комментарии «Как отвеченный» относятся к системным.

---

## `ProjectReferenceTableExtParamId`

**Тип:** `int` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Хранит ID сквозного ДП-таблицы (Reference Table ExtParam), используемого для проектов.

Используется в readonly-режиме Ганта: когда Гант отображается не в проектной категории, данные берутся из EP-таблицы по этому ID, а не через `gantt/data`. Также используется в `task-card.component.ts` для определения, есть ли у задачи проектная привязка через сквозной ДП.

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

**Пример:**
```json
"ProjectReferenceTableExtParamId": 86611
```

---

## `ProjectTableJSONExtParamID`

**Тип:** `int` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Вывод в карточку проектной задачи дополнительной кнопки «Проектный гант» для перехода в новый проектный интерфейс.

Актуально для нового проектного интерфейса. В качестве значения ключа задаётся ID ДП с типом «Таблица».

**Пример:**
```json
"ProjectTableJSONExtParamID": 86610
```

---

## `QuartzRunInClusterMode`

**Тип:** `bool` · **По умолчанию:** `false`

Включение кластера Quartz. По умолчанию Quartz отключён.

---

## `QueueEventsAmount`

**Тип:** `int` · **По умолчанию:** `50`

Число событий, которые обрабатывает джоб за 1 запуск.

---

## `Rebus_BackoffTimes`

**Тип:** `string` · **По умолчанию:** `500,1000,2000,4000`

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

Примеры:
- `"100"` — опрос очереди каждые 100 миллисекунд.
- `"100,200,500,1000"` — если через 100 мс нет сообщений, следующий опрос через 200 мс, и так далее до 1000 мс.

---

## `Rebus_MaxParallelism`

**Тип:** `int` · **По умолчанию:** `5`

Максимальное число асинхронных запросов, выполняемых в рамках одного потока разбора очереди шины сообщений.

---

## `Rebus_NumberOfWorkers`

**Тип:** `int` · **По умолчанию:** `1`

Число потоков, в рамках которых идёт разбор очереди шины сообщений.

---

## `Rebus_PublishTimeoutSeconds`

**Тип:** `int` · **По умолчанию:** `60`

Срок жизни команды, публикуемой в шину сообщений, в секундах: команда, не опубликованная за это время, отбрасывается, а публикация следующих продолжается. Допустимый диапазон — от 1 до 4294967; неразбираемое или выходящее за диапазон значение заменяется на 60 секунд с предупреждением в журнал.

---

## `RecurrenceTasksMaterializationDays`

**Тип:** `int` · **По умолчанию:** `365`

Количество дней вперёд от текущей даты, на которое система заблаговременно материализует (создаёт) повторяющиеся задачи.

---

## `RedefiningIdentity`

**Тип:** `bool` · **По умолчанию:** `false`

Определяет механизм смещения автоинкремента строк таблиц сущностей и работает в связке с `dbo.Settings.Serveridkey`.

---

## `RegistrationFields`

**Тип:** JSON · **По умолчанию:** —

Набор обязательных полей на странице самостоятельной регистрации.

> ℹ️ Приоритет пользовательского ключа выше, чем настройка «Обязательные поля профиля пользователя» в общих настройках приложения!

При регистрации среди полей не будет поля, которое было указано при получении кода верификации: «Телефон» или «Email», даже если оно не скрыто в ключе (`"IsHidden": false`).

**Формат:**
```json
[
  {
    "Key": "RegistrationCode",
    "IsRequired": true,
    "IsHidden": false
  }
]
```

**Параметры:**

- `Key` — поле на странице регистрации. Возможные значения:
  - `Email` — адрес почты.
  - `CellPhone` — мобильный телефон.
  - `Nick` — псевдоним.
  - `FirstName` — имя.
  - `LastName` — фамилия.
  - `Gender` — пол.
  - `City` — город.
  - `Password` — пароль.
  - `Note` — текстовое примечание. Поддерживаются HTML-теги. Дополнительные параметры: `title` (отображаемый текст) и `Color` (цвет поля).
- `IsRequired` — обязательное поле.
- `IsHidden` — скрытое поле.

Для пароля задаётся секция `PasswordSettings`:
- `MinNumberOfChar` — минимальное количество символов.
- `MaxNumberOfChar` — максимальное количество символов.
- `UpperLowercaseRequired` — обязательно наличие заглавных и строчных букв.
- `AcceptableLanguage` — допустимый язык (пример: `ru-RU`).
- `MinNumberOfDigits` — минимум цифр.
- `NoSpaces` — без пробелов.
- `MinNumberOfSpecialChar` — минимум спецсимволов.
- `DisallowLoginOrBirthdayPattern` — запретить повторение логина или последовательности цифр по дате рождения. По умолчанию `false`.
- `DisallowedSequenceLength` — запретить последовательности из N и более букв и цифр подряд.
- `DisallowedRepeatingPatternLength` — запретить повторяющиеся комбинации из N и более букв и цифр.
- `NumberOfPreviousPasswordsToCheck` — пароль не должен совпадать с не менее чем N ранее используемыми. Рекомендуемое значение — не менее 10.
- `MinCharPasswordDifference` — пароль должен отличаться от ранее используемого не менее чем на N символов. Рекомендуемое значение — не менее 5.

> ℹ️ Требования к паролям в `RegistrationFields` учитываются только для формы самостоятельной регистрации. Для создания пользователей из режима администрирования и при сбросе пароля параметры задаются в блоке «Настройки требований к паролям» в общих настройках приложения.

**Пример:**
```json
[
  { "Key": "Email", "isRequired": false, "IsHidden": false },
  { "Key": "CellPhone", "isRequired": false, "IsHidden": false },
  { "Key": "Nick", "isRequired": false, "IsHidden": true },
  { "Key": "FirstName", "isRequired": false, "IsHidden": false },
  { "Key": "Gender", "isRequired": true, "IsHidden": false },
  { "Key": "LastName", "isRequired": false, "IsHidden": false },
  { "Key": "City", "isRequired": false, "IsHidden": true }
]
```

**Пример с настройкой пароля:**
```json
[
  { "Key": "FirstName", "isRequired": false, "IsHidden": false },
  { "Key": "LastName", "isRequired": false, "IsHidden": false },
  {
    "Key": "Password",
    "isRequired": false,
    "IsHidden": false,
    "PasswordSettings": {
      "MinNumberOfChar": 1,
      "MaxNumberOfChar": 2,
      "UpperLowercaseRequired": true,
      "AcceptableLanguage": "ru-RU",
      "MinNumberOfDigits": 3,
      "NoSpaces": true,
      "MinNumberOfSpecialChar": 4,
      "DisallowLoginOrBirthdayPattern": true,
      "DisallowedSequenceLength": 3,
      "DisallowedRepeatingPatternLength": 4,
      "NumberOfPreviousPasswordsToCheck": 5,
      "MinCharPasswordDifference": 6
    }
  }
]
```

**Пример с настройкой примечания:**
```json
[
  { "Key": "FirstName", "isRequired": false, "IsHidden": false },
  { "Key": "LastName", "isRequired": false, "IsHidden": false },
  {
    "Key": "Note",
    "isRequired": false,
    "IsHidden": false,
    "title": "Примечание",
    "Color": "red"
  }
]
```

---

## `refreshGridEvents`

**Тип:** JSON · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Отключение автообновления списка задач категории.

> ℹ️ Работает начиная с версии 2.254.

**Формат:**
```json
{
  "refreshGridEvents": {
    "tabActivate": false,
    "refreshMTF": false
  }
}
```

- Если `refreshGridEvents.tabActivate = false`, то при активации вкладки список задач категории не обновляется.
- Если `refreshGridEvents.refreshMTF = false`, то список задач категории не обновляется при сигнале `refreshMTF`.

---

## `requestTimeout`

**Тип:** `int` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Timeout на http-запросы. Не используется, если не задано.

---

## `requestTimeoutExcludeUrls`

**Тип:** `array` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Timeout на http-запросы с исключением URL. Список исключаемых URL указывается через запятую.

---

## `resourceExtendAddEnable`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Включает расширенный режим добавления ресурсов в представлении «Ресурсы». При активации в каждой строке доступна кнопка добавления, даже если ресурсы уже назначены.

---

## `resourcesSubcatDefaults`

**Тип:** JSON · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Конфигурация представления категории «Ресурсы».

**Формат:**
```json
[
  {
    "subcatId": 0,
    "newTaskSubcatId": 0,
    "postTaskMode": "newTaskForm",
    "ignoreCreateAllocation": false,
    "resourceExtendAddEnable": false,
    "performerExtParamId": 0,
    "DatetimeFromExtParamId": 0,
    "DatetimeToExtParamId": 0,
    "createOnly": false
  }
]
```

**Параметры:**

- `subcatId` — ID категории в представлении «Ресурсы».
- `newTaskSubcatId` — ID категории, в которой будут поставлены новые задачи.
- `postTaskMode` — режим формы создания задачи. Значение `newTaskForm` — открывать карточку создания новой задачи. Если не задан, отображается стандартное окно добавления ресурсов.
- `ignoreCreateAllocation` — при `true` возможность создания задач по кнопке в правой части представления недоступна.
- `resourceExtendAddEnable` — при `true` в списке доступных действий по кнопке с многоточием станет доступен пункт «Расширенное добавление».
- `performerExtParamId` — ID ДП с типом «Lookup», источником которого является категория со значениями исполнителей.
- `DatetimeFromExtParamId` — ID ДП с типом «Дата и время», которое автоматически заполняется датой начала распределения ресурса.
- `DatetimeToExtParamId` — ID ДП с типом «Дата и время», которое автоматически заполняется датой окончания распределения ресурса.
- `createOnly` — при `true` доступно только создание и просмотр значений; изменение перетаскиванием краёв карточки ресурса запрещено.

**Пример:**
```json
[{
  "subcatId": 61360,
  "newTaskSubcatId": [61430],
  "postTaskMode": "newTaskForm",
  "ignoreCreateAllocation": true,
  "resourceExtendAddEnable": true,
  "performerExtParamId": 96360,
  "DatetimeFromExtParamId": 96820,
  "DatetimeToExtParamId": 96830,
  "createOnly": true
}]
```

---

## `SamlSessionAbsoluteLifetimeMinutes`

**Тип:** `int` · **По умолчанию:** `720`

Абсолютный потолок длительности SAML-сессии в минутах для провайдеров с режимом продления по активности. Отсчёт идёт от выдачи первого токена 1Формы, а не от момента аутентификации на стороне IdP. По достижении потолка сессия прекращается независимо от активности пользователя, и требуется полный интерактивный вход.

Значение `0` снимает потолок. Нечисловое или отрицательное значение игнорируется: в журнал пишется ошибка, применяется значение по умолчанию.

На режимы продления `IdentityProvider` и `None`, а также на вход по логину и паролю, AD и OpenLDAP ключ не влияет. Токены, выданные до появления потолка, сессию не обрывают — у них нет отметки времени выдачи, по которой считается срок.

---

## `SautinSoftLicenseKey`

**Тип:** `string` · **По умолчанию:** —

Лицензионный ключ библиотеки `SautinSoft.PdfMetamorphosis`, используемой для конвертации документов в PDF (см. `DefaultConverterPdf`).

Если ключ не заполнен или отсутствует — лицензия не активируется, конвертер `SautinSoft` работает в ограниченном (пробном) режиме.

> ℹ️ После добавления или изменения ключа требуется рестарт приложения.

---

## `SaveExecuteJobLogForEmailJobSyncFolders`

**Тип:** `bool` · **По умолчанию:** `false`

Логирование синхронизации папок почтовых ящиков в журнал выполненных заданий по таймеру.

---

## `SbisLastEventsId`

**Тип:** JSON · **По умолчанию:** —

Идентификатор последних событий СБИС. Наличие ключа является обязательным условием для интеграции.

**Формат:**
```json
{
  "LastEvents": [
    {
      "EventId": 0,
      "ServiceId": 0
    }
  ]
}
```

**Параметры:**

- `EventId` — ID события.
- `ServiceId` — ID сервиса.

**Пример:**
```json
{ "LastEvents": [{ "EventId": null, "ServiceId": 23 }] }
```

---

## `ScDisableMail`

**Тип:** `0/1` · **По умолчанию:** `0`

Автоматическое включение настройки категории «Не посылать почтовые сообщения».

---

## `SearchEncryptedTasks`

**Тип:** `bool` · **По умолчанию:** `false`

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

---

## `SearchSubcategoryFolders`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Включает поиск по папкам (разделам) категорий в глобальном поиске.

---

## `ServiceAccountUserIds`

**Тип:** `string` (CSV) · **По умолчанию:** пусто

Идентификаторы служебных учётных записей — телефонных и мессенджерных роботов, интеграционных и персональных токенов — через запятую, без пробелов и кавычек: `2397,2349`. По этим учёткам не пересчитываются системные тикеры, пользовательские индикаторы и счётчик дерева категорий — ни по событию, ни по фоновому пересчёту, поэтому время операции по такой учётке от числа её открытых задач не зависит. Нечисловые и несуществующие идентификаторы пропускаются; пустое значение означает, что список не задан; удаление идентификатора возвращает пересчёт со следующего события без перезапуска. Если сотрудник зайдёт под такой учёткой, счётчики у него не обновятся — это ожидаемое поведение.

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

Проверка состава исключённых на стенде:

```sql
select UserID
from dbo.fn_TickersExcludedUsers()
order by UserID;
```

## `showAI`

**Тип:** `bool` · **По умолчанию:** `false`

Входит в группу расширенных свойств приложения `custom-app-settings`. Включение в системе инструментов AI: векторный поиск.

---

## `showCalendarMessageCounter`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Отображает счётчик непрочитанных сообщений в иконке календаря.

---

## `ShowCommentsFeed_ExecLog`

**Тип:** `0/1` · **По умолчанию:** `0`

Логирование выполнения хранимой процедуры `ShowCommentsFeed`.

---

## `ShowTasksFeed_ExecLog`

**Тип:** `0/1` · **По умолчанию:** `0`

Логирование выполнения хранимой процедуры `ShowTasksFeed`. Значение читается гейтом внутри самой процедуры: при отсутствии ключа логирование выключено.

---

## `signal`

**Тип:** `string` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Обеспечивает корректную совместную работу нового и старого функционала (.Net Core и Task Center). Позволяет корректно обновлять значения в новом списке задач категории, используя старую карточку задачи.

Параметр должен принимать значение `"tc-core"`.

Предварительно необходимо в конфигурационном файле `app-settings.json` добавить ключ `"SignalRMode": "Mixed"`.

**Пример:**
```json
"signal": "tc-core"
```

---

## `SignaturesGridSettings`

**Тип:** JSON · **По умолчанию:** —

Настройка колонок списка активных подписей.

> ℹ️ Устаревшее, не используется начиная с версии 2.266 Дракон.

> ℹ️ Скрытые колонки будут недоступны для вывода даже из списка доступных колонок.

> ℹ️ Если колонка явно не указана в ключе, то она будет доступна, как если бы было задано `"isHidden": false`.

**Формат:**
```json
{
  "columns": [
    { "key": "taskText", "type": "general", "isHidden": false },
    { "key": "signatureReason", "type": "general", "isHidden": false },
    { "key": "signatureOrderedTime", "type": "general", "isHidden": false },
    { "key": "description", "type": "general", "isHidden": false },
    { "key": "signatureAndText", "type": "general", "isHidden": false },
    { "key": "signatureAcceptants", "type": "general", "isHidden": false },
    { "key": "signatureInitializeDate", "type": "general", "isHidden": false },
    { "key": "subcatName", "type": "general", "isHidden": false },
    { "key": "ownerName", "type": "general", "isHidden": false },
    { "key": "responsiblePerformer", "type": "general", "isHidden": false },
    { "key": "requestorName", "type": "general", "isHidden": false },
    { "key": "timeToSign", "type": "general", "isHidden": false },
    { "key": "actions", "type": "general", "isHidden": false },
    { "key": "commentsFromMeCount", "type": "general", "isHidden": false },
    { "key": "commentsToMeCount", "type": "general", "isHidden": false },
    { "key": "isAnyUnAnswered", "type": "general", "isHidden": false },
    { "key": "taskId", "type": "general", "isHidden": false },
    { "key": "ExtParamId", "type": "extparam", "isHidden": false },
    { "key": "taskState", "type": "general", "isHidden": false },
    { "key": "activeSubtasks", "type": "general", "isHidden": false },
    { "key": "totalSubtasks", "type": "general", "isHidden": false },
    { "key": "subtasksRes", "type": "general", "isHidden": false },
    { "key": "taskPriority", "type": "general", "isHidden": false },
    { "key": "signatureCreatedTask", "type": "general", "isHidden": false }
  ]
}
```

**Параметры:**

- `taskText` — текст задачи.
- `signatureReason` — причина запроса подписи.
- `signatureOrderedTime` — срок.
- `description` — описание.
- `signatureAndText` — подпись и текст задачи.
- `signatureAcceptants` — согласующие.
- `signatureInitializeDate` — дата запроса.
- `subcatName` — категория.
- `ownerName` — заказчик.
- `responsiblePerformer` — исполнитель.
- `requestorName` — запросивший подпись.
- `timeToSign` — время на подпись.
- `actions` — действия.
- `commentsFromMeCount` — вопросы от меня.
- `commentsToMeCount` — вопросы мне.
- `isAnyUnAnswered` — мои вопросы.
- `taskId` — номер задачи.
- `ExtParamId` — ID ДП.
- `taskState` — статус.
- `activeSubtasks` — активных подзадач.
- `totalSubtasks` — всего подзадач.
- `subtasksRes` — подзадачи.
- `taskPriority` — приоритет.
- `signatureCreatedTask` — дата создания задачи.

В списке запрошенных подписей помимо системных параметров можно вывести и дополнительные. Для этого в качестве типа необходимо указать `"extparam"`, а в параметре `"key"` задать ID нужного ДП. Не влияет на информационные ДП, которые отображаются в виде серых блоков под строкой подписи.

**Пример скрытия колонки:**
```json
{ "columns": [{ "key": "signatureOrderedTime", "type": "general", "isHidden": true }] }
```

**Пример добавления ДП:**
```json
{ "columns": [{ "key": 1234, "type": "extparam", "isHidden": false }] }
```

---

## `SimpleSearchByTasks.PhonesSubcatIDs`

**Тип:** `string` · **По умолчанию:** —

Список ID подкатегорий (через запятую) для поиска по телефонным номерам. Если пользователь не указал конкретную подкатегорию, а введённый запрос состоит только из цифр и знаков `+`, `-`, `(`, `)` длиной не более 10 символов — поиск ограничивается указанными подкатегориями. Если ключ не задан или пуст — фильтрация не применяется. Если цифр не более 3 — результат всегда пустой.

**Пример:** `123,456,789`

---

## `SimpleSearchByTasks_ExecLog`

**Тип:** `0/1` · **По умолчанию:** `0`

Логирование выполнения хранимой процедуры `SimpleSearchByTasks`.

---

## `SmartAction_ExecuteSql_CommandTimeout`

**Тип:** `int` (секунды) · **По умолчанию:** `30`

Таймаут SQL-команды смарт-действия «Выполнить SQL». В действии «Выполнить SQL» значение по умолчанию — 30 секунд; при использовании в смарт-выражениях таймаут по умолчанию не задаётся (без ограничения).

---

## `SmartAction_SendHttpRequest_AllowedHosts`

**Тип:** список хостов · **По умолчанию:** —

Хосты, на которые смарт-действию «Отправить HTTP-запрос» разрешено отправлять запросы. Записи разделяются запятой, точкой с запятой или переводом строки. В записи допускаются схема и порт — они снимаются перед сверкой, имя в Unicode приводится к punycode, сравнение идёт по точному совпадению имени хоста: поддомены и звёздочка не покрываются. Список действует всегда, включая пустой: незаполненная настройка запрещает любой исходящий вызов действия. Схема запроса при этом ограничена `http` и `https` независимо от списка.

---

## `SmartActionMaxPerformers`

**Тип:** `int` · **По умолчанию:** `20`

Максимальное число исполнителей на задаче при назначении через смарт-действия «Добавить исполнителя» (`AddPerformer`) и «Добавить группу исполнителей» (`AddPerformerGroup`). Если итоговый состав исполнителей превышает лимит, смарт-действие завершается ошибкой и никто не назначается.

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

Отказ происходит, только если назначение одновременно превышает лимит и увеличивает состав. На задачах, где исполнителей уже больше лимита, повторное назначение уже назначенного пользователя проходит, а добавление нового — отклоняется.

Лимит действует только на эти два смарт-действия. Назначение исполнителей из карточки задачи, массовыми операциями, через API, маршруты, ресурсное планирование и прочие сценарии им не ограничивается.

Значение `0` (как и отрицательное) полностью отключает проверку. Пустое или нечисловое значение трактуется как значение по умолчанию. Запись создаётся автоматически при первом срабатывании одного из этих смарт-действий.

---

## `SmartScriptCompileParallelism`

**Тип:** `int` · **По умолчанию:** `1`

Число обработчиков фоновой очереди компиляции C#-смарт-скриптов на узле: они перепроверяют работу и переподписывают готовые байты параллельно, а компиляция в подпроцессе на узле всегда одна и с пониженным приоритетом, при любом значении. Пусто, `0` или отрицательное — `1`; читается при старте, изменение требует перезапуска пула.

---

## `SmartScriptCompileServeLastGood`

**Тип:** `bool` · **По умолчанию:** `true`

Управляет поведением при перекомпиляции C#-смарт-скрипта, когда исходник изменился, а новые байты ещё не готовы:
- `true` (по умолчанию) — отдаётся прежняя валидная версия, перекомпиляция ставится в очередь, вызов не блокируется;
- `false` — перекомпиляция выполняется синхронно на потоке вызова (прежнее поведение).

Служит для аварийного отката к синхронному поведению без релиза.

---

## `SmartScriptCompileStatusTtlSeconds`

**Тип:** `int` (секунды) · **По умолчанию:** —

Время жизни (TTL) записей о статусе фоновой компиляции C#-смарт-скриптов в памяти.

---

## `SmartScriptCompileTimeoutSeconds`

**Тип:** `int` (секунды) · **По умолчанию:** `120`

Лимит времени на компиляцию C#-скрипта (Roslyn) в подпроцессе: сохранение в редакторе, компиляция при промахе кеша и фоновая перекомпиляция. Пустое, нечисловое или неположительное значение даёт 120 секунд и предупреждение; изменение действует без перезапуска пула.

---

## `SmartScriptJSEngineTimeoutMinutes`

**Тип:** `int` · **По умолчанию:** `15`

Таймаут выполнения JavaScript SmartScript в движке Jint (в минутах). Применяется к таймауту выполнения скрипта и к `PromiseTimeout`. Изменение вступает в силу без перезапуска сервера.

---

## `SmartScriptLogLevel`

**Тип:** `string` · **По умолчанию:** `Error`

Задаёт минимальный уровень логирования выполнения Смарт-скриптов. Если настройка не задана или значение не распарсилось, используется `Error`.

Поддерживаемые значения (без учёта регистра): `Debug`, `Info`, `Error`.

- `Debug` — в журнал записываются все сообщения (отладочные, информационные, ошибки).
- `Info` — информационные сообщения и ошибки.
- `Error` — только ошибки.

Настройка влияет как на обычное выполнение скрипта, так и на запуск из редактора.

---

## `SmartScriptRoslynAdditionalAssemblies`

**Тип:** `string` (CSV) · **По умолчанию:** —

Список путей к дополнительным сборкам через запятую, подключаемым при компиляции C#-смартов (Roslyn). Пути ограничены каталогом `{AppDir}/SmartScriptExtensions/`. При изменении значения базовый набор ссылок компиляции пересобирается.

---

## `SmartScriptRoslynTimeoutMinutes`

**Тип:** `int` · **По умолчанию:** `15`

Таймаут компиляции и выполнения C#-смартов (Roslyn) в минутах. По истечении времени выполнение скрипта прерывается. Значение `<= 0` игнорируется — используется значение по умолчанию.

---

## `SmartScriptRoslynWarmUpScriptIds`

**Тип:** — · **По умолчанию:** —

Предназначен для прогрева Roslyn-компиляции C#-смартов по списку ID скриптов при старте приложения. Ключ зарезервирован, но в текущей версии не активен.

---

## `SocialNetworksSettings`

**Тип:** JSON · **По умолчанию:** —

Конфигурация социальных сетей.

**Формат:**
```json
{
  "RootCategoryId": 0,
  "PersonalPublicationsSubcatId": 0,
  "HeaderStyle": 0,
  "GroupsForPublicationsId": 0,
  "GroupsForClosedPublicationsId": 0,
  "ArticlesSubcatId": 0,
  "ExtParams": {
    "ExtParamCoverId": 0
  }
}
```

**Параметры:**

- `RootCategoryId` — ID системного раздела «Социальные сети».
- `PersonalPublicationsSubcatId` — ID служебной категории «Личные публикации» с типом «Группы соц.сетей». Категория должна находиться в разделе «Социальные сети».
- `HeaderStyle` — стиль отображения шапки группы соц.сети. Необязательный параметр. `0` — в шапке только аватар группы (по умолчанию), `1` — в шапке отображается имя автора и его аватар.
- `GroupsForPublicationsId` — ID служебной категории «Группы для публикаций».
- `GroupsForClosedPublicationsId` — ID служебной категории «Группы для закрытых публикаций».
- `ArticlesSubcatId` — ID системной категории «Статьи» для хранения статей, создаваемых из формы написания поста.
- `ExtParamCoverId` — ID ДП с типом «Файл» для хранения обложки (задаётся в секции `ExtParams`).

**Пример:**
```json
{
  "RootCategoryId": 4441,
  "PersonalPublicationsSubcatId": 62720,
  "HeaderStyle": 1,
  "GroupsForPublicationsId": 62730,
  "GroupsForClosedPublicationsId": 62900,
  "ArticlesSubcatId": 62830,
  "ExtParams": { "ExtParamCoverId": 100020 }
}
```

---

## `SpaceSettings`

**Тип:** JSON · **По умолчанию:** —

Конфигурация «Пространство» (wiki).

**Формат:**
```json
{
  "ExtParams": {
    "Content": 0,
    "Cover": 0,
    "CoverPreview": 0,
    "Extra": 0,
    "Parent": 0,
    "SpecialSection": 0
  },
  "IsActive": true,
  "RootCatId": 0
}
```

В качестве значений ключа используются ID ДП, полученные в кодовой миграции:

- `SpecialSection` — «Пространство - Спецраздел» (Выпадающий список). Список служебных разделов: «Вне меню», «Архив», «Корзина».
- `Content` — «Пространство - Содержимое страницы» (Большой текст с форматированием).
- `Extra` — «Пространство - Дополнительная информация» (Большой текст с форматированием).
- `Parent` — «Пространство - Родительский элемент» (Число). ID родительского пространства.
- `Cover` — «Пространство - Обложка» (Файл). Пропорции по умолчанию 22:6.
- `CoverPreview` — «Пространство - Превью обложки» (Файл). Пропорции по умолчанию 16:9.

Если указан параметр `RootCatId` (ID системного раздела Пространств), в меню пространств будут отображаться только дочерние элементы, сам раздел будет скрыт.

Чтобы скрыть пространства в левом боковом меню, задать `"IsActive": false`.

**Пример:**
```json
{
  "ExtParams": {
    "Content": 76950,
    "Cover": 100130,
    "CoverPreview": 100140,
    "Extra": 76960,
    "Parent": 76970,
    "SpecialSection": 76940
  },
  "IsActive": true,
  "RootCatId": 3021
}
```

---

## `spaResources`

**Тип:** JSON · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Глобальные JS вставки. В ключе можно указать js-ресурсы, которые будут загружаться при инициализации или успешном входе в приложение.

**Формат:**
```json
[
  {
    "type": "js",
    "src": "https://Адрес_ссылки.js"
  }
]
```

---

## `StageExtParamId`

**Тип:** `int` · **По умолчанию:** `0`

ID дополнительного параметра, используемого как «этап» при загрузке файлов. Применяется для разграничения файлов по стадиям процесса.

---

## `StartCalendarSyncFromDate`

**Тип:** `string` · **По умолчанию:** —

Дата начала синхронизации событий календаря с Exchange. События раньше этой даты синхронизироваться не будут. Ключ одноразовый: после однократной отработки задания синхронизации строка настройки удаляется автоматически.

---

## `Sync1CQueueMaxRetryCount`

**Тип:** `int` · **По умолчанию:** `0`

Количество повторных отправок при неудачной синхронизации из «Первой Формы» в 1С.

---

## `SyncOrgStructure1C`

**Тип:** `bool` · **По умолчанию:** —

Включает синхронизацию организационной структуры из 1С в «Первую Форму».

---

## `TaskIdSetFilterMaxItems`

**Тип:** `int` · **По умолчанию:** `1000`

Максимальное число значений в фильтре колонки Лукап или Мультилукап при типе фильтра «Выбор значений». При превышении фильтр не применяется, пользователь получает сообщение с допустимым количеством.

---

## `TableEpIdsOldUI`

**Тип:** `array` · **По умолчанию:** —

Список (через запятую) ID ДП «Таблица» в старом представлении (с отключённым параметром «Использовать новую таблицу»), которые при загрузке карточки задачи должны открываться сразу в режиме редактирования. Остальные ДП «Таблица» в старом представлении при загрузке карточки задачи отображаются в режиме чтения.

---

## `taskLinkNoFrame`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Карточка задачи открывается по номеру задачи (из шапки карточки или из комментариев) в режиме `noframe`, без системной шапки приложения (логотип, панель навигации).

---

## `TC1C_CatID`

**Тип:** `int` · **По умолчанию:** `0`

ID категории, используемой для интеграции с 1С (служебная категория синхронизации).

---

## `TC1C_DaysLogKept`

**Тип:** `int` · **По умолчанию:** `7`

Количество дней хранения журнала синхронизации с 1С.

---

## `TC1C_ServiceAppAddress`

**Тип:** `string` · **По умолчанию:** адрес приложения (`ApplicationPath`)

Указывается адрес, который задан в настройках синхронизации с 1C в `TCServerName`. В качестве значения допускается использовать как доменное имя, так и конкретный IP-адрес сервера.

---

## `TC1C_SystemUser`

**Тип:** `string` · **По умолчанию:** —

Логин системного пользователя, от имени которого выполняются операции синхронизации с 1С.

---

## `TempFilePath`

**Тип:** `string` · **По умолчанию:** `C:\Windows\Temp`

Папка для временных файлов парсера шаблонов Excel (`TemplateParser`). Используется для сохранения файла данных на диск перед его разбором по шаблону.

---

## `ToDoListSettings`

**Тип:** JSON · **По умолчанию:** —

Конфигурация ДП «Выбор нескольких задач из категории (Multilookup)» со схемой оформления «To do list» (чек-лист).

**Формат:**
```json
{
  "TaskNotesExtParamId": 0,
  "TemplateTasksExtParamId": 0,
  "TemplatesSubcatId": 0
}
```

**Параметры:**

- `TaskNotesExtParamId` — ID ДП «Комментарий к задаче» в категории «Задачи шаблонов ToDo list».
- `TemplateTasksExtParamId` — ID ДП «Задачи шаблона ToDo list» в категории «Шаблоны ToDo list».
- `TemplatesSubcatId` — ID категории «Шаблоны ToDo list».

> ℹ️ Если параметр `TemplatesSubcatId` не задан или имеет пустое значение, кнопка «Добавить по шаблону» не будет отображаться в ДП для пользовательских категорий. В системной категории кнопка недоступна по умолчанию.

**Пример:**
```json
{
  "TaskNotesExtParamId": 79580,
  "TemplateTasksExtParamId": 79230,
  "TemplatesSubcatId": 56680
}
```

---

## `TranslationService`

**Тип:** `string` · **По умолчанию:** —

По умолчанию сервис `TranslateService` используется для асинхронного автоматического перевода локализованных значений с использованием AI-сервиса. Настройка позволяет вернуться к использованию Azure Cognitive Services.

Значение: `azure`

---

## `tspUrl`

**Тип:** `string` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. URL-адрес TSP-сервиса (службы метки времени) для электронной подписи.

---

## `ui-custom-palette`

**Тип:** JSON · **По умолчанию:** —

Хранение палитры для темизации. Содержимое ключа сливается с содержимым файла `ui-palette-base.json` в `ui.json`. Файл доступен по адресу `https://адрес_1Формы/ui.json`.

**Пример:**
```json
{
  "hazel": {
    "hazel-50": { "description": "", "value": "#fff8f7" },
    "hazel-100": { "description": "", "value": "#fff2f0" },
    "hazel-150": { "description": "", "value": "#f9e4cf" },
    "hazel-200": { "description": "", "value": "#ffd5ab" }
  }
}
```

---

## `ui-custom-tokens`

**Тип:** JSON · **По умолчанию:** —

Стилевые переменные для темизации. Содержимое ключа сливается с содержимым файла `ui-variables-base.json` в `ui.json`. Файл доступен по адресу `https://адрес_1Формы/ui.json`.

**Пример:**
```json
{
  "colors": {
    "light": {
      "surfaceflatzerotone": {
        "zero": { "description": "", "value": "coolgrey-100" },
        "one": { "description": "", "value": "coolgrey-150", "shadowMode": 1 },
        "two": { "description": "", "value": "coolgrey-150", "shadowMode": 2 },
        "three": { "description": "", "value": "coolgrey-200", "shadowMode": 3 }
      }
    }
  }
}
```

В секции `OnSurfaceExtra` можно задать пользовательскые цвета активным элементам, ссылкам, иконкам и кнопкам:
```json
"onsurfaceextra": {
  "primary": { "description": "", "value": "yellow-300" },
  "link": { "description": "", "value": "yellow-300" },
  "info": { "description": "", "value": "blue-300" },
  "success": { "description": "", "value": "green-300" },
  "warning": { "description": "", "value": "orange-300" },
  "danger": { "description": "", "value": "red-300" },
  "default": { "description": "", "value": "coolgrey-300" }
}
```

---

## `useEditableEpTable`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Позволяет редактировать ДП «Таблица» нажатием на иконку и в отдельном модальном окне.

---

## `UploadFileToDisk_AllowedRoots`

**Тип:** `string` (список через `;`) · **По умолчанию:** пусто

Список каталогов для действия «Выгрузить файл в сетевую папку» (`UploadFileToDisk`, ID 87): при обновлении заполняется миграцией литеральными путями из параметров существующих пакетов действия. Ключ зарезервирован: код записи файла на диск его пока не читает, путь назначения из параметров пакета не ограничивается.

---

## `UseLegacyLookupQuery`

**Тип:** `bool` · **По умолчанию:** —

Включает устаревший алгоритм запроса данных для ДП типа Lookup. Используется для обратной совместимости при возникновении проблем с новым алгоритмом.

---

## `UseMailToLinksForSignaturesFromEmails`

**Тип:** `1/0` · **По умолчанию:** —

Использовать mailto-ссылки в письмах с запросом подписи.

Ссылка `mailto` — специальный тип гиперссылки, которая при клике открывает почтовый клиент для создания нового письма с заранее заполненными данными.

Значение `1` позволяет акцептантам выносить резолюции по подписям, не заходя в интерфейс «Первой Формы», а отправляя письмо на служебный ящик.

- При значении `1` ссылки будут иметь формат:
  `mailto:<адрес>?subject=<тема ответа>&Body=<текст ответа>`, где:
  - `<адрес>` — адрес почтового ящика для ответов.
  - `<тема ответа>` — тема письма с уведомлением (`TaskSignatureID` + `ResolutionKey=`).
  - `<текст ответа>` — текст комментария к резолюции.

  По клику будет отправляться письмо на адрес, указанный в Общих настройках приложения в параметре «Почтовый ящик для ответов» или «Внешний почтовый ящик для ответов». Письмо будет обработано заданием `ServiceMailBoxesJob`, и по подписи будет вынесена выбранная резолюция. В системной категории «Уведомления о прочтении» будет создаваться задача с текстом вида `TSID=59354|A=Accept`.

- При значении `0` или пустом значении ссылки будут иметь формат обычной адресной строки, и по клику будет открываться интерфейс «Первой Формы».

> ℹ️ Если включена отправка резолюций на почту, то в системной категории «Уведомление о прочтении» на вкладке «Почтовые ящики» должен быть настроен ящик, указанный в Общих настройках приложения в параметре «Почтовый ящик для ответов».

---

## `UseNewExtParamsAndTaskUsed`

**Тип:** JSON · **По умолчанию:** —

Включает новые ДП для пользователей в категории.

**Формат:**
```json
[
  {
    "subcats": [],
    "users": []
  }
]
```

**Параметры:**

- `users` — список ID пользователей, для которых необходимо включить новые ДП.
- `subcats` — список ID категорий, для которых необходимо включить новые ДП.

**Пример:**
```json
[{ "subcats": [5574], "users": [6736] }]
```

---

## `useNewEpAndTaskUsed`

**Тип:** JSON · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Возможность включить новые ДП и БИ для определённых пользователей и категорий. Ключ также влияет на настройки в режиме администрирования.

**Формат:**
```json
[
  {
    "subcats": [],
    "users": []
  }
]
```

**Параметры:**

- `users` — список ID пользователей, для которых необходимо включить новые ДП и БИ.
- `subcats` — список ID категорий, для которых необходимо включить новые ДП и БИ.

**Пример:**
```json
[{ "subcats": [1], "users": [2, 3] }]
```

---

## `useNewExtendedSearch`

**Тип:** `bool` · **По умолчанию:** `false`

Входит в группу расширенных свойств приложения `custom-app-settings`. Включает новый расширенный поиск по задачам в SPA.

---

## `useNewFRReports`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Использование новых отчётов FastReport.

---

## `UseNewGrid`

**Тип:** JSON · **По умолчанию:** —

Включает новый грид (таблицу задач) для выбранных пользователей в выбранных контекстах. Значение — JSON-массив объектов (правил). Правила применяются независимо, можно задать несколько.

**Параметры объекта правила:**

- `subcats` (`int[]`) — список ID категорий. Игнорируется, если `allSubcats: true`.
- `users` (`int[]`) — список ID пользователей, к которым применяется правило.
- `allUsers` (`bool`, по умолчанию `false`) — применить правило ко всем пользователям.
- `allSubcats` (`bool`, по умолчанию `false`) — включить новый грид для всех категорий.
- `myTasks` (`bool`, по умолчанию `false`) — включить новый грид в разделе «Мои задачи».
- `tickers` (`bool`, по умолчанию `false`) — включить новый грид для тикеров (индикаторов).

Логика: правило срабатывает для пользователя, если `users` содержит его ID или `allUsers: true`. Если хотя бы одно подходящее правило имеет `allSubcats: true` — новый грид включается для всех категорий. Иначе — объединяются `subcats` из всех подходящих правил.

**Пример** (все пользователи, все категории, включая «Мои задачи» и тикеры):
```json
[{ "subcats": [], "users": [], "allUsers": true, "allSubcats": true, "myTasks": true, "tickers": true }]
```

**Пример** (конкретные пользователи и категории):
```json
[{ "subcats": [5574], "users": [6736], "allUsers": false, "allSubcats": false, "myTasks": false, "tickers": false }]
```

---

## `useNewMTF`

**Тип:** JSON · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Новый МТФ. Включает отображение новой карточки задачи с новыми ДП для указанных пользователей и категорий.

> ℹ️ Обратите внимание: добавленные ранее вставки не будут корректно работать при переходе на новый МТФ в SPA.

**Формат:**
```json
{
  "useNewMTF": {
    "subcats": [],
    "users": [],
    "allUsers": false,
    "allSubcats": false,
    "excludeUsers": [],
    "excludeSubcats": []
  }
}
```

**Параметры:**

- `subcats` — список ID категорий, для которых необходимо включить новый МТФ.
- `users` — список ID пользователей, для которых необходимо включить новый МТФ.
- `allUsers` — включить новый МТФ для всех пользователей системы.
- `allSubcats` — включить новый МТФ для всех категорий системы.
- `excludeUsers` — включение нового МТФ для всех пользователей, кроме указанных.
- `excludeSubcats` — включение нового МТФ для всех категорий, кроме указанных.

**Пример:**
```json
{
  "useNewMTF": {
    "subcats": [],
    "users": [],
    "allUsers": true,
    "allSubcats": true,
    "excludeUsers": [8142],
    "excludeSubcats": [8881]
  }
}
```

---

## `UseOldSurveys`

**Тип:** `0/1` · **По умолчанию:** —

Выбор редактора опросов.

- `0` — используется редактор опросов SurveyJS (рекомендуется).
- `1` — редактор опросов SurveyProject (устаревший).

---

## `UseSearchYofication`

**Тип:** `bool` · **По умолчанию:** `true`

Включает использование ёфикации (буквы «е» и «ё» считаются идентичными при поиске). Управляет процессом нормализации букв «е» и «ё» в поисковом запросе.

> ℹ️ В хранимых процедурах (`ShowTasksFeed`) настройка фактически читается под именем ключа `ShowTasksFeed.UseSearchYofication`.

---

## `UseSmtpLog`

**Тип:** `bool` · **По умолчанию:** `false`

Управляет логированием SMTP-команд в журнале «Сессии почтовых джобов».

---

## `UseSystemTickersCache`

**Тип:** `bool` · **По умолчанию:** `true`

Определяет режим расчёта системных индикаторов (счётчиков). При `true` (значение по умолчанию) активирован механизм кеширования системных счётчиков пользователя.

При `true` данные сохраняются в кеше, что позволяет избегать многократных обращений к базе данных.

При `false` система выполняет прямой запрос к БД через хранимую процедуру `GetSystemTickers` каждый раз при необходимости обновления счётчиков.

---

## `useTaskLoader`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Включает альтернативный загрузчик данных карточки задачи.

---

## `useTaskOneScroll`

**Тип:** `bool` · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Включает режим единой прокрутки в карточке задачи (без разделения на области).

---

## `UseTrigramInSimpleSearch`

**Тип:** `0/1` · **По умолчанию:** `0`

Включение возможности нечёткого поиска по тексту с учётом опечаток в окне быстрого поиска в панели инструментов.

- `0` — полнотекстовый поиск.
- `1` — триграмм поиск.

---

## `userProfileInfoExts`

**Тип:** JSON · **По умолчанию:** —

Входит в группу расширенных свойств приложения `custom-app-settings`. Добавляет в карточку профиля пользователя дополнительные поля, значения которых берутся из **расширенных свойств пользователя** (а не из системных полей учётной записи). С **2.268.366** поддерживается **любое имя расширенного свойства** в массиве `fields`, не только зашитые ранее `Zoom` и `JobTitle`. До этой версии работали только эти два поля и брались из системных полей `userInfo.zoom` / `userInfo.jobTitle`, из-за чего могли расходиться с фактически заполненными расширенными свойствами.

**Как настроить:**

1. В системную настройку `userProfileInfoExts.fields` добавить имя свойства (например, `"Zoom"`, `"JobTitle"` или любое другое имя расширенного свойства пользователя).
2. В разделе администрирования расширенных свойств пользователя создать расширенное свойство с тем же именем. У свойства указать **«Описание»** — оно используется в профиле как заголовок поля (label).
3. Заполнить значение этого свойства в карточке нужного сотрудника.

**Поведение в профиле:**

- Поля рендерятся в секции «О себе» в карточке пользователя.
- Если у конкретного пользователя значение пустое — поле не выводится.
- С 2.268.366: если **все** указанные в `fields` свойства пустые у пользователя — секция «О себе» не отрисовывается вообще (раньше создавалась с пустым содержимым).
- Источник данных и логика отображения теперь совпадают с мобильным профилем.

**Формат:**
```json
{ "userProfileInfoExts": { "fields": ["имя_поля1", "имя_поля2"] } }
```

**Пример:**
```json
{ "userProfileInfoExts": { "fields": ["Zoom", "JobTitle", "Telegram"] } }
```

---

## `usersDefaultUseNewTaskCard`

**Тип:** `0/1` · **По умолчанию:** —

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

Если ключ в настройках не указан, для пользователей по умолчанию открывается новая карточка задачи.

---

## `UserAuthenticationProviderVerificationJob_EnablePasswordScan`

**Тип:** `bool` · **По умолчанию:** —

Активация проверки паролей для задания по таймеру `UserAuthenticationProviderVerificationJob`.

---

## `VksPostProcessScriptId`

**Тип:** `int` · **По умолчанию:** `0` (постобработка отключена)

> ℹ️ Фактическое имя ключа в БД — `vks_postprocess_script_id` (заголовок раздела приведён по имени C#-константы). Задавать настройку нужно под именем `vks_postprocess_script_id`.

ID смарт-скрипта постобработки транскрипта ВКС. Скрипт вызывается перед публикацией треда с расшифровкой: получает на вход JSON-строку `transcript_json`, возвращает анонимный объект `{ transcript_json: string, stats: {...} }` с обновлённым JSON, который заменяет исходный.

Назначение — исправление ASR-ошибок Whisper в распознанном тексте до публикации треда.

При значении `0` постобработка отключена, в тред публикуется сырой результат Whisper. При сбое смарт-скрипта записывается предупреждение в лог и публикуется исходный транскрипт (публикация треда не блокируется).

---

## `WinAppLinks_ColumnIds`

**Тип:** `array` · **По умолчанию:** —

Список ID колонок ДП «Таблица» с типом «Файл». Файлы из этих колонок загружаются в распределённую систему хранения файлов «Космос».

---

## `WriteEwsRequestDurationToAutomationLog`

**Тип:** `bool` · **По умолчанию:** `false`

Управляет логированием длительности выполнения запросов EWS в журнал автоматизации. При включении настройки система будет записывать в лог время, затраченное на выполнение каждого запроса к EWS.
