Подробный гайд: Автосохранение в LibreOffice Calc после каждого изменения

Настройка автосохранения в LibreOffice Calc после каждого изменения: макросы, расширения, резервные копии для защиты данных

2026.04.21                  


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


Вариант 1: Стандартное автосохранение (AutoRecovery)

Это встроенная функция, которая сохраняет информацию для восстановления каждые заданные минуты:

Настройка:

  1. Откройте Сервис → Параметры (или Alt+F12)
  2. Перейдите в Загрузка/сохранение → Общие
  3. Установите галочку «Сохранять информацию для автовосстановления каждые»
  4. Укажите минимальный интервал (например, 1 минута)
  5. Нажмите ОК

Важно:

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

Вариант 2: Резервные копии при каждом сохранении

Чтобы при каждом ручном сохранении (Ctrl+S) создавалась резервная копия:

  1. Сервис → Параметры → Загрузка/сохранение → Общие
  2. Включите опцию «Всегда создавать резервную копию»
  3. При необходимости измените путь к папке резервных копий:
   LibreOffice → Пути → Резервные копии

Резервные файлы имеют расширение .BAK и сохраняются в указанной папке.


Вариант 3: Макрос для автосохранения при изменении (наиболее близко к «после каждого изменения»)

Макрос с таймером (рекомендуемый)

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

Option Explicit

Global Const gsTime = "00:01:00" ' Интервал: 1 минута (формат ЧЧ:ММ:СС)
Global Const gsMacro = "Standard.AutoSave.EndBackup"
Global Const gsExt = ".autosave"

Global goKeyHandler As Object, goDocController As Object, goMouseHandler As Object
Global gTime As Date, gBackupTime As Date

Sub StartBackup
    gTime = Now
    gBackupTime = TimeValue(gsTime)

    ' Привязка макроса к событию закрытия вида
    Dim mEventProps(1) As New com.sun.star.beans.PropertyValue
    mEventProps(0).Name = "EventType"
    mEventProps(0).Value = "StarBasic"
    mEventProps(1).Name = "Script"
    mEventProps(1).Value = "macro:///" & gsMacro
    ThisComponent.Events.ReplaceByName("OnPrepareViewClosing", mEventProps())

    RegisterHandlers
    MsgBox "Автосохранение включено. Интервал: " & gsTime, 64, "Готово"
End Sub

Sub EndBackup
    UnregisterHandlers
    Dim mEventProps(0) As New com.sun.star.beans.PropertyValue
    mEventProps(0).Name = ""
    mEventProps(0).Value = ""
    ThisComponent.Events.ReplaceByName("OnPrepareViewClosing", mEventProps())
    SaveFile
End Sub

Sub CreateCopy
    If Now() > gTime + gBackupTime Then
        SaveFile
        Dim s As String
        s = ThisComponent.Location
        If s <> "" Then FileCopy(s, s & gsExt)
        gTime = Now
    End If
End Sub

Sub SaveFile
    CreateUnoService("com.sun.star.frame.DispatchHelper").executeDispatch( _
        ThisComponent.CurrentController.Frame, ".uno:Save", "", 0, Array())
End Sub

Sub RegisterHandlers
    goDocController = ThisComponent.CurrentController
    goKeyHandler = CreateUnoListener("Key_", "com.sun.star.awt.XKeyHandler")
    goDocController.addKeyHandler(goKeyHandler)
    goMouseHandler = CreateUnoListener("Mouse_", "com.sun.star.awt.XMouseClickHandler")
    goDocController.addMouseClickHandler(goMouseHandler)
End Sub

Sub UnregisterHandlers
    If Not IsNull(goDocController) And Not IsEmpty(goDocController) Then
        goDocController.removeKeyHandler(goKeyHandler)
        goDocController.removeMouseClickHandler(goMouseHandler)
    End If
End Sub

' Обработчики событий
Function Key_keyReleased(Optional oEvt) As Boolean
    CreateCopy
    Key_keyReleased = False
End Function

Function Key_keyPressed(Optional oEvt) As Boolean
    Key_keyPressed = False
End Function

Function Key_disposing(Optional oEvt)
End Function

Function Mouse_mouseReleased(oEvent As com.sun.star.awt.MouseEvent) As Boolean
    CreateCopy
    Mouse_mouseReleased = False
End Function

Function Mouse_mousePressed(oEvent As com.sun.star.awt.MouseEvent) As Boolean
    Mouse_mousePressed = False
End Function

Как установить макрос:

  1. Откройте документ Calc
  2. Нажмите Alt+F11 → откроется редактор макросов
  3. В Standard создайте новый модуль (ПКМ → Insert → Module)
  4. Вставьте код выше
  5. Сохраните модуль
  6. Запустите макрос StartBackup для включения автосохранения

Важно:

  • Документ должен быть сохранён в формате .ods с поддержкой макросов, иначе код не сохранится.

Вариант 4: Расширение Timestamped Backup

Установите официальное расширение для автоматического создания резервных копий с метками времени:

  • Timestamped Backup на extensions.libreoffice.org - extensions.libreoffice.org/en/extensions/show/timestamp-backup

Преимущества:

  • Автоматическое создание копий с интервалом
  • Не требует написания кода
  • Копии имеют уникальные имена (с датой/временем)

Сравнение методов

Метод Сохраняет после каждого изменения Требует макросов Надёжность Сложность
AutoRecovery Нет (по таймеру) Нет Высокая Низкая
Резервные копии Нет (только при Ctrl+S) Нет Очень высокая Низкая
Макрос с таймером Да (почти) Да Высокая Средняя
Расширение Backup Да (по таймеру) Нет Очень высокая Средняя

Важные предупреждения

  1. Частое сохранение на диск может замедлить работу с большими файлами
  2. Макросы должны быть включены:
   Сервис → Параметры → LibreOffice → Безопасность → Безопасность макросов
  1. При использовании макросов отключите запросы на сохранение при закрытии, если не хотите двойного сохранения
  2. Для максимальной надёжности комбинируйте: макрос + облачное хранилище (Dropbox, Nextcloud и т.п.)

Рекомендация

Для большинства пользователей оптимальна комбинация:

  1. Включить AutoRecovery с интервалом 1–2 минуты
  2. Включить резервные копии при сохранении
  3. Использовать облачную синхронизацию папки с документами

Это обеспечит защиту данных без риска потери производительности или сложности настройки макросов.