# ctx.getModel()

Возвращает экземпляр модели (например, `BlockModel`, `PageModel`, `ActionModel` и т. д.) на основе `uid` модели из текущего движка или стека представлений. Используется в RunJS для доступа к другим моделям между блоками, страницами или всплывающими окнами.

Если вам нужна только модель или блок, в котором находится текущий контекст выполнения, отдавайте приоритет использованию `ctx.model` или `ctx.blockModel` вместо `ctx.getModel`.

## Сценарии использования

| Сценарий | Описание |
|------|------|
| **JSBlock / JSAction** | Получение моделей других блоков по известному `uid` для чтения или записи их `resource`, `form`, `setProps` и т. д. |
| **RunJS во всплывающих окнах** | Когда необходимо получить доступ к модели на странице, открывшей всплывающее окно, передайте `searchInPreviousEngines: true`. |
| **Пользовательские действия** | Поиск форм или подмоделей в панели настройки по `uid` через стеки представлений для чтения их конфигурации или состояния. |

## Определение типов

```ts
getModel<T extends FlowModel = FlowModel>(
  uid: string,
  searchInPreviousEngines?: boolean
): T | undefined
```

## Параметры

| Параметр | Тип | Описание |
|------|------|------|
| `uid` | `string` | Уникальный идентификатор целевого экземпляра модели, указанный при настройке или создании (например, `ctx.model.uid`). |
| `searchInPreviousEngines` | `boolean` | Необязательно, по умолчанию `false`. Если `true`, поиск выполняется от текущего движка вверх до корня в «стеке представлений», что позволяет получить доступ к моделям в движках верхнего уровня (например, на странице, открывшей всплывающее окно). |

## Возвращаемое значение

- Возвращает экземпляр соответствующего подкласса `FlowModel` (например, `BlockModel`, `FormBlockModel`, `ActionModel`), если он найден.
- Возвращает `undefined`, если модель не найдена.

## Область поиска

- **По умолчанию (`searchInPreviousEngines: false`)**: Поиск выполняется только внутри **текущего движка** по `uid`. Во всплывающих окнах или многоуровневых представлениях каждое представление имеет независимый движок; по умолчанию поиск ведется только в пределах текущего представления.
- **`searchInPreviousEngines: true`**: Поиск выполняется вверх по цепочке `previousEngine`, начиная с текущего движка, до первого совпадения. Это полезно для доступа к модели на странице, открывшей текущее всплывающее окно.

## Примеры

### Получение другого блока и обновление

```ts
const block = ctx.getModel('list-block-uid');
if (block?.resource) {
  await block.resource.refresh();
}
```

### Доступ к модели на странице из всплывающего окна

```ts
// Доступ к блоку на странице, открывшей текущее всплывающее окно
const pageBlock = ctx.getModel('page-block-uid', true);
if (pageBlock) {
  pageBlock.rerender?.();
}
```

### Чтение/запись между моделями и запуск перерисовки (rerender)

```ts
const target = ctx.getModel('other-block-uid');
if (target) {
  target.setProps({ loading: true });
  target.rerender?.();
}
```

### Проверка безопасности

```ts
const model = ctx.getModel(someUid);
if (!model) {
  ctx.message.warning('Целевая модель не существует');
  return;
}
```

## Связанные разделы

- [ctx.model](./model.md): Модель, в которой находится текущий контекст выполнения.
- [ctx.blockModel](./block-model.md): Модель родительского блока, в котором находится текущий JS; обычно доступна напрямую без использования `getModel`.