# FAQ: миграция видимости ДП с JS-вставок на смарт-фильтры

Как перенести логику показа и скрытия блоков ДП с устаревших JavaScript-вставок на штатные смарт-фильтры.

## 1. Симптомы

Пользователь/администратор спрашивает:

- «После обновления интерфейса поля пропали / всегда видны»
- «Была JS-вставка, которая скрывала ДП — теперь не работает»
- «Как перенести логику видимости из JS в системные механизмы?»
- «Где настроить условное скрытие блоков ДП без JavaScript?»

## 2. Что изменилось

### Старый подход: JS-вставки (SubcategoriesInclude)

Как видимость настраивалась раньше:

- Администратор писал JavaScript-код, который при открытии формы задачи скрывал/показывал элементы по DOM-селекторам
- Хранение: таблица `SubcategoriesInclude` (FK → `Includes`) привязана к категории
- Типы: `useForMtf` (главная форма) и `useForNewTask` (форма создания)
- **Проблемы:** хрупко при обновлении интерфейса, нет серверного контроля, нет аудита

### Новый подход: смарт-фильтры на блоках/группах ДП

Штатный механизм на стороне сервера, не зависит от JS:

| Уровень | Таблица | Колонки | Что контролирует |
|---------|---------|---------|-----------------|
| **Блок ДП** | `ExtParamBlocks` | `HiddenSmartFilterId` | Скрытие блока на МТФ |
| | | `HiddenOnNtfSmartFilterId` | Скрытие блока на НТФ |
| | | `MinimizedSmartFilterId` | Сворачивание блока по умолчанию |
| **Группа блоков** | `ExtParamBlocksGroups` | `HiddenSmartFilterId` | Скрытие группы |
| | | `MinimizedSmartFilterId` | Сворачивание группы |

Каждая колонка — FK на `SmartExpressions`. Смарт-выражение вычисляется **на сервере при открытии задачи** и возвращает `true/false`.

## 3. Как мигрировать

### Шаг 1. Определить логику старой JS-вставки

Найти JS-вставку в AdminSPA → Категория → Вкладка «Includes» (или через БД: `SubcategoriesInclude`).

Типичные паттерны:
```javascript
// Скрыть блок ДП если значение поля = "X"
if (task.extParam_12345 === "X") { $(".ep-block-67").hide(); }
```

### Шаг 2. Создать эквивалентное смарт-выражение

Создать SmartExpression с аналогичным условием:

- Если `ExtParam[12345] = "X"` → результат `true` (блок скрыт)
- Тип: фильтр (`IsFilter = 1`)
- Привязка к категории

### Шаг 3. Привязать к блоку ДП

В AdminSPA → Категория → Настройки блоков ДП → выбрать блок → поле «Скрывать по смарт-фильтру» → выбрать созданное выражение.

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

Или через БД:
```sql
update dbo.ExtParamBlocks
set HiddenSmartFilterId = @smartExpressionId
where ExtParamBlockId = @blockId;
```

### Шаг 4. Протестировать

После привязки проверьте оба сценария:

- Открыть задачу с условием → блок должен быть скрыт
- Открыть задачу без условия → блок должен быть виден
- Проверить НТФ отдельно (если нужно, использовать `HiddenOnNtfSmartFilterId`)

> Смарт-фильтр видимости блока/группы блоков корректно вычисляется и на форме создания задачи (НТФ), в том числе если ссылается на свойства самой задачи (например, статус).

### Шаг 5. Удалить старую JS-вставку

После подтверждения — деактивировать/удалить JS-include.

## 4. Сравнение подходов

Ключевые различия двух механизмов:

| Аспект | JS-вставки | Смарт-фильтры |
|--------|-----------|---------------|
| Хранение | `SubcategoriesInclude` + `Includes` | FK в `ExtParamBlocks` → `SmartExpressions` |
| Выполнение | На стороне браузера (клиент) | На стороне сервера (при открытии формы) |
| Условия | Произвольный JS | Смарт-выражение (визуальный конструктор) |
| Контекст | DOM задачи | Данные задачи (ДП, состояние, пользователь) |
| Аудит | Нет | Изменения фиксируются в журнале администрирования |
| Устойчивость к обновлениям интерфейса | Хрупко | Стабильно |
| МТФ/НТФ | Одна логика на оба | Раздельные колонки |

## 5. Что подготовить для миграции

Что понадобится:

- ID категории (SubcatID)
- Текст JS-вставки (или скриншот из AdminSPA)
- Описание ожидаемого поведения: «при каком условии какое поле/блок скрывается»
- ID блоков ДП, которые нужно контролировать

## 6. Когда обращаться в поддержку 1Ф

В некоторых случаях миграцию лучше выполнять при участии поддержки 1Ф:

- Если JS-логика слишком сложна для одного смарт-выражения (каскадные зависимости, множественные условия) — для проектирования набора смарт-выражений
- Если после миграции поведение отличается от ожидаемого — для проверки логики смарт-выражения

## 7. Связанные документы

Смежные разделы:

- [Настройка категорий](https://help.1forma.ru/domains/categories/admin.md) — где настраиваются блоки ДП и смарт-фильтры
