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

Сведения о плагинах

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

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

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

Следуйте разделу Расширения совместного редактирования Office и примеру истории, чтобы подключить хранение истории и права доступа. Базовое совместное редактирование не включает историю автоматически. Сервер также должен поддерживать список версий, их содержимое и восстановление.

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

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

Shell
pnpm add @univerjs-pro/edit-history @univerjs-pro/edit-history-ui @univerjs-pro/boards-history @univerjs-pro/boards-history-ui
TypeScript
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. Сравнение только читает данные: сервис истории не нужен, восстановление и слияние не выполняются.

TypeScript
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 сравнения без интерфейса.

Насколько полезно это руководство?

© 2026 DreamNum Co., Ltd.