# История изменений

- Human documentation: [https://docs.univer.ai/ru-RU/guides/boards/features/edit-history](https://docs.univer.ai/ru-RU/guides/boards/features/edit-history)

- Agent Markdown: [https://docs.univer.ai/ru-RU/guides/boards/features/edit-history.md](https://docs.univer.ai/ru-RU/guides/boards/features/edit-history.md)

- Requested language: `ru-RU`

- Content language: `ru-RU`

- Documentation version: `1.2.0`

- Source: [boards/features/edit-history.ru-RU.mdx](https://github.com/dream-num/documentation/blob/dev/content/guides/boards/features/edit-history.ru-RU.mdx)

---

#### Package metadata

```json
{
  "preset": [],
  "plugins": [
    {
      "client": "@univerjs-pro/edit-history",
      "facade": "@univerjs-pro/edit-history/facade"
    },
    {
      "client": "@univerjs-pro/edit-history-ui",
      "locale": "@univerjs-pro/edit-history-ui/locale/ru-RU",
      "style": "@univerjs-pro/edit-history-ui/lib/index.css"
    },
    {
      "client": "@univerjs-pro/boards-history"
    },
    {
      "client": "@univerjs-pro/boards-history-ui",
      "locale": "@univerjs-pro/boards-history-ui/locale/ru-RU",
      "style": "@univerjs-pro/boards-history-ui/lib/index.css"
    }
  ],
  "license": true,
  "server": true
}
```

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

## Подготовка сервисов совместного редактирования и истории

Выполните [интеграцию совместного редактирования](https://docs.univer.ai/ru-RU/server/collaboration/browser-integration.md) и [настройку лицензии](https://docs.univer.ai/ru-RU/server/license.md). Убедитесь, что два сеанса могут редактировать один документ Boards и что изменения сохраняются после перезагрузки.

Следуйте разделу [Расширения совместного редактирования Office](https://docs.univer.ai/ru-RU/server/collaboration/extensions.md) и [примеру истории](https://docs.univer.ai/ru-RU/server/collaboration/examples.md#history), чтобы подключить хранение истории и права доступа. Базовое совместное редактирование не включает историю автоматически. Сервер также должен поддерживать список версий, их содержимое и восстановление.

## Добавление плагинов истории

Добавьте следующую настройку к существующей конфигурации продукта, лицензии и совместного редактирования. Если пресет или другая конфигурация уже регистрирует эти плагины, измените её, а не регистрируйте плагины повторно.

#### npm

```bash
npm install @univerjs-pro/edit-history @univerjs-pro/edit-history-ui @univerjs-pro/boards-history @univerjs-pro/boards-history-ui
```

#### pnpm

```bash
pnpm add @univerjs-pro/edit-history @univerjs-pro/edit-history-ui @univerjs-pro/boards-history @univerjs-pro/boards-history-ui
```

#### yarn

```bash
yarn add @univerjs-pro/edit-history @univerjs-pro/edit-history-ui @univerjs-pro/boards-history @univerjs-pro/boards-history-ui
```

#### bun

```bash
bun add @univerjs-pro/edit-history @univerjs-pro/edit-history-ui @univerjs-pro/boards-history @univerjs-pro/boards-history-ui
```

```ts
import { UniverEditHistoryPlugin } from '@univerjs-pro/edit-history'
import EditHistoryLocale from '@univerjs-pro/edit-history-ui/locale/en-US'
import { UniverBoardsHistoryPlugin } from '@univerjs-pro/boards-history'
import { UniverBoardsHistoryUIPlugin } from '@univerjs-pro/boards-history-ui'
import HistoryLocale from '@univerjs-pro/boards-history-ui/locale/en-US'
import { LocaleType, mergeLocales } from '@univerjs/core'

import '@univerjs-pro/edit-history-ui/lib/index.css'
import '@univerjs-pro/boards-history-ui/lib/index.css'

const historyServerUrl = '/api/history'

univerAPI.loadLocales(LocaleType.EN_US, mergeLocales(EditHistoryLocale, HistoryLocale))
univer.registerPlugin(UniverEditHistoryPlugin, { historyServerUrl })
univer.registerPlugin(UniverBoardsHistoryPlugin)
univer.registerPlugin(UniverBoardsHistoryUIPlugin, {
  univerContainerId: 'app',
  historyServerUrl,
})
```

Замените `/api/history` адресом API истории вашего приложения и убедитесь, что API соответствует запросам клиента. Оба значения `historyServerUrl` должны совпадать. В `univerContainerId` укажите DOM ID контейнера редактора и загрузите языковой пакет, соответствующий языку редактора.

Просмотрщик истории создаёт отдельный редактор только для чтения. Для собственного контента используйте `viewerPlugins`, чтобы добавить плагины, которые ещё не входят в просмотрщик. Не регистрируйте встроенные плагины просмотрщика повторно.

## Просмотр и восстановление версий

Откройте историю из меню редактора и выберите версию, чтобы просмотреть её содержимое и изменения. Восстановление изменяет текущий общий документ. Эта операция должна быть доступна только пользователям с правом восстановления, и сервер обязан проверять это право.

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

Если список пуст, проверьте, записывалась ли история документа, затем проверьте ID документа и URL сервиса. Если просмотр работает, а восстановление нет, проверьте право восстановления и соединение совместного редактирования. Чтение истории тоже требует авторизации: старые версии могут содержать данные, которые позднее были удалены.

## Сравнение снимков

Для экрана проверки или передачи изменений в AI Agent используйте `compareUnitData()` либо один раз подготовьте результат через `prepareUnitComparison()`. Зарегистрируйте History-плагин продукта и импортируйте точку входа Facade. Передайте два полных снимка одного документа как `beforeSnapshot` и `afterSnapshot`. Сравнение только читает данные: сервис истории не нужен, восстановление и слияние не выполняются.

```ts
import { UnitComparisonDetailLevel, UnitComparisonFidelity } from '@univerjs-pro/edit-history'
import { UniverInstanceType } from '@univerjs/core'

import '@univerjs-pro/edit-history/facade'

const comparison = univerAPI.prepareUnitComparison({
  comparisonId: 'review-1',
  unitId: beforeSnapshot.id,
  type: UniverInstanceType.UNIVER_BOARD,
  fidelity: UnitComparisonFidelity.SNAPSHOT,
  leftData: beforeSnapshot,
  rightData: afterSnapshot,
})
const overview = comparison.query({ detail: UnitComparisonDetailLevel.SUMMARY })
const scope = overview.scopes[0]
const page = comparison.query({ scope, offset: 0, limit: 100 })
console.log(page.items, page.page.hasMore, page.diagnostics)
```

Получите доступные представления из `scopes` и передайте область в `query()`, чтобы отфильтровать результат без повторного вычисления. По умолчанию возвращается 100 элементов, максимум — 1 000 на страницу. Используйте `page.hasMore` и `offset` для следующих страниц. `summary` описывает всё сравнение независимо от фильтра. Проверяйте `diagnostics.readiness` и `diagnostics.codes`, прежде чем считать результат полным. Для Node.js или CLI без редактора см. [API сравнения без интерфейса](https://docs.univer.ai/ru-RU/reference/packages/plugins/univerjs-pro/edit-history.md#headless-comparison).
