Стратегия резервного копирования баз 1С:Предприятие

Типы баз данных 1С и подходы к бэкапу

1С:Предприятие поддерживает два режима работы с данными, каждый требует собственной стратегии резервного копирования:

  • Файловая база — данные хранятся в файле 1Cv8.1CD на файловом сервере или локальном диске. Для бэкапа достаточно копирования файла, но во время работы пользователей файл заблокирован.
  • Клиент-серверная база — данные хранятся в СУБД (Microsoft SQL Server или PostgreSQL), управление через кластер серверов 1С. Бэкап выполняется средствами СУБД или через механизм выгрузки 1С.

Стратегия резервного копирования должна включать:

  1. Полные бэкапы (еженедельно или ежедневно)
  2. Инкрементальные/дифференциальные бэкапы (ежечасно для критичных баз)
  3. Хранение копий в нескольких местах (правило 3-2-1)
  4. Регулярную проверку восстановления
  5. Документированные процедуры восстановления

Бэкап файловых баз 1С

Файловая база — это один файл 1Cv8.1CD (SQLite внутри). Основная сложность — файл заблокирован при работе пользователей.

Копирование с отключением пользователей

Самый надёжный способ — завершить все сеансы перед копированием. Скрипт для автоматизации:

@echo off
rem backup_1c_file.bat — бэкап файловой базы 1С
rem Запуск: через планировщик задач в 01:00

set BASE_PATH=D:\1C_Bases\Accounting
set BACKUP_PATH=E:\Backups\1C\Accounting
set DATE=%date:~6,4%%date:~3,2%%date:~0,2%
set LOG=E:\Backups\1C\backup.log

echo %date% %time% - Start backup >> %LOG%

rem Проверка, что пользователи отключены (файл .1CD не заблокирован)
if exist "%BASE_PATH%\1Cv8.1CD.lock" (
  echo %date% %time% - WARNING: Database is locked! >> %LOG%
  rem Принудительное завершение сеансов 1С
  taskkill /F /IM 1cv8.exe 2>nul
  timeout /t 10
)

rem Создание директории
if not exist "%BACKUP_PATH%\%DATE%" mkdir "%BACKUP_PATH%\%DATE%"

rem Копирование с проверкой
robocopy "%BASE_PATH%" "%BACKUP_PATH%\%DATE%" 1Cv8.1CD /R:3 /W:10 /LOG+:%LOG%

rem Ротация: удаление бэкапов старше 30 дней
forfiles /p "%BACKUP_PATH%" /d -30 /c "cmd /c if @isdir==TRUE rd /s /q @path" 2>nul

echo %date% %time% - Backup complete >> %LOG%

Бэкап через VSS (Volume Shadow Copy)

VSS позволяет создавать моментальные снимки тома без отключения пользователей:

# PowerShell: бэкап через VSS
$basePath = "D:\1C_Bases\Accounting\1Cv8.1CD"
$backupDir = "E:\Backups\1C\Accounting\$(Get-Date -Format 'yyyyMMdd_HHmm')"
New-Item -ItemType Directory -Path $backupDir -Force

# Создание теневой копии
$shadow = (Get-WmiObject -List Win32_ShadowCopy).Create("D:\", "ClientAccessible")
$shadowObj = Get-WmiObject Win32_ShadowCopy | Sort-Object InstallDate | Select-Object -Last 1
$shadowPath = $shadowObj.DeviceObject + "\1C_Bases\Accounting\1Cv8.1CD"

# Монтирование и копирование
cmd /c mklink /d "C:\shadow_mount" "$($shadowObj.DeviceObject)\"
Copy-Item "C:\shadow_mount\1C_Bases\Accounting\1Cv8.1CD" $backupDir
cmd /c rmdir "C:\shadow_mount"

# Удаление теневой копии
$shadowObj.Delete()

Write-Host "Backup saved to $backupDir"

Бэкап серверных баз через SQL Server

Для клиент-серверных баз 1С с SQL Server основной метод — средства самого SQL Server.

Полный и дифференциальный бэкап

Скрипт T-SQL для автоматического бэкапа всех баз 1С:

-- Полный бэкап всех баз 1С
DECLARE @dbname NVARCHAR(256)
DECLARE @backupPath NVARCHAR(512)
DECLARE @date NVARCHAR(20)

SET @date = REPLACE(CONVERT(NVARCHAR, GETDATE(), 120), ':', '-')
SET @backupPath = 'E:\SQLBackups\'

DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE name NOT IN ('master','tempdb','model','msdb')
  AND state_desc = 'ONLINE'

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname

WHILE @@FETCH_STATUS = 0
BEGIN
  DECLARE @fullPath NVARCHAR(1024)
  SET @fullPath = @backupPath + @dbname + '_FULL_' + @date + '.bak'

  BACKUP DATABASE @dbname
    TO DISK = @fullPath
    WITH COMPRESSION, CHECKSUM, INIT,
    NAME = N'Full Backup',
    STATS = 10

  -- Проверка целостности бэкапа
  RESTORE VERIFYONLY FROM DISK = @fullPath WITH CHECKSUM

  FETCH NEXT FROM db_cursor INTO @dbname
END

CLOSE db_cursor
DEALLOCATE db_cursor

Бэкап журнала транзакций

Для баз в режиме Full Recovery бэкап журнала транзакций позволяет восстановить данные на любой момент времени (Point-in-Time Recovery):

-- Проверка модели восстановления
SELECT name, recovery_model_desc FROM sys.databases
WHERE name = 'accounting_1c'

-- Установка Full Recovery (если не установлена)
ALTER DATABASE [accounting_1c] SET RECOVERY FULL

-- Бэкап журнала транзакций (каждые 15-30 минут)
BACKUP LOG [accounting_1c]
  TO DISK = 'E:\SQLBackups\TLog\accounting_1c_LOG_20260408_1030.trn'
  WITH COMPRESSION, CHECKSUM, INIT

-- Восстановление на определённый момент времени
RESTORE DATABASE [accounting_1c_restore]
  FROM DISK = 'E:\SQLBackups\accounting_1c_FULL.bak'
  WITH NORECOVERY, REPLACE,
  MOVE 'accounting_1c' TO 'D:\SQLData\accounting_1c_restore.mdf',
  MOVE 'accounting_1c_log' TO 'D:\SQLData\accounting_1c_restore_log.ldf'

RESTORE LOG [accounting_1c_restore]
  FROM DISK = 'E:\SQLBackups\TLog\accounting_1c_LOG.trn'
  WITH RECOVERY, STOPAT = '2026-04-08T10:30:00'

Бэкап через выгрузку DT

Формат DT — это встроенный механизм 1С для выгрузки/загрузки баз данных. Файл .dt содержит полную копию базы данных в сжатом виде.

rem Выгрузка базы в DT через командную строку 1С
"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" DESIGNER ^
  /S "server01\accounting" ^
  /N "Администратор" /P "password" ^
  /DumpIB "E:\Backups\DT\accounting_%date:~6,4%%date:~3,2%%date:~0,2%.dt" ^
  /Out "E:\Backups\DT\dump.log"

rem Проверка результата
if %errorlevel% neq 0 (
  echo ERROR: DT dump failed! >> E:\Backups\DT\dump.log
  exit /b 1
)

Важно: выгрузка DT блокирует базу — пользователи не смогут работать во время выгрузки. Для крупных баз (более 50 ГБ) выгрузка может занимать часы. Используйте этот метод для:

  • Еженедельного полного бэкапа в нерабочее время
  • Переноса базы между серверами
  • Бэкапа перед обновлением конфигурации

Автоматизация через PowerShell

Полный скрипт бэкапа с выгрузкой DT, ротацией и уведомлениями:

# backup-1c-dt.ps1
param(
  [string]$Server = "server01",
  [string]$Database = "accounting",
  [string]$User = "Администратор",
  [string]$Password = "password",
  [string]$BackupDir = "E:\Backups\DT",
  [int]$RetainDays = 14
)

$1CExe = "C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe"
$date = Get-Date -Format "yyyyMMdd_HHmm"
$dtFile = "$BackupDir\${Database}_${date}.dt"
$logFile = "$BackupDir\${Database}_${date}.log"

# Выгрузка
$proc = Start-Process -FilePath $1CExe -ArgumentList @(
  "DESIGNER",
  "/S `"$Server\$Database`"",
  "/N `"$User`"", "/P `"$Password`"",
  "/DumpIB `"$dtFile`"",
  "/Out `"$logFile`""
) -Wait -PassThru -NoNewWindow

if ($proc.ExitCode -ne 0 -or -not (Test-Path $dtFile)) {
  Write-Error "DT dump failed! See $logFile"
  # Отправка уведомления
  Send-MailMessage -To "admin@corp.local" -From "backup@corp.local" `
    -Subject "FAIL: 1C Backup $Database" -Body (Get-Content $logFile -Raw) `
    -SmtpServer "mail.corp.local"
  exit 1
}

# Размер файла
$size = [math]::Round((Get-Item $dtFile).Length / 1GB, 2)
Write-Host "Backup OK: $dtFile ($size GB)"

# Ротация
Get-ChildItem $BackupDir -Filter "${Database}_*.dt" |
  Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$RetainDays) } |
  Remove-Item -Force

Write-Host "Old backups cleaned (retain $RetainDays days)"

Бэкап PostgreSQL для 1С

При использовании PostgreSQL в качестве СУБД для 1С применяются стандартные инструменты PostgreSQL:

#!/bin/bash
# backup-1c-postgres.sh

PG_USER="postgres"
BACKUP_DIR="/backup/postgresql"
DATE=$(date +%Y%m%d_%H%M)
LOG_FILE="/backup/postgresql/backup.log"

# Список баз 1С
DATABASES=$(psql -U $PG_USER -t -c \
  "SELECT datname FROM pg_database WHERE datname NOT IN ('postgres','template0','template1');")

for DB in $DATABASES; do
  DB=$(echo $DB | xargs)  # trim whitespace
  DUMP_FILE="$BACKUP_DIR/${DB}_${DATE}.dump"

  echo "$(date) Backing up $DB..." >> $LOG_FILE

  # Custom format с компрессией (поддерживает параллельное восстановление)
  pg_dump -U $PG_USER -Fc -j 4 -f "$DUMP_FILE" "$DB" 2>> $LOG_FILE

  if [ $? -eq 0 ]; then
    SIZE=$(du -sh "$DUMP_FILE" | cut -f1)
    echo "$(date) OK: $DB ($SIZE)" >> $LOG_FILE
  else
    echo "$(date) FAIL: $DB" >> $LOG_FILE
  fi
done

# Ротация: удаление старше 14 дней
find $BACKUP_DIR -name "*.dump" -mtime +14 -delete

# WAL-архивирование для PITR
# В postgresql.conf:
# wal_level = replica
# archive_mode = on
# archive_command = 'cp %p /backup/postgresql/wal/%f'

Стратегия хранения и правило 3-2-1

Правило 3-2-1: три копии данных, на двух разных типах носителей, одна копия — удалённо (offsite):

  • Копия 1: SQL-бэкап на локальном диске сервера (быстрое восстановление)
  • Копия 2: Реплика на NAS/SAN (защита от отказа диска сервера)
  • Копия 3: Offsite — облачное хранилище или удалённая площадка
# Копирование бэкапов на NAS через robocopy
robocopy E:\SQLBackups \\nas01\backups\sql /MIR /R:3 /W:10 /LOG:E:\Logs\robocopy.log

# Синхронизация с S3-совместимым хранилищем через rclone
rclone sync E:\SQLBackups remote:1c-backups/sql --transfers=4 --checkers=8

# Или через AWS CLI
aws s3 sync E:\SQLBackups s3://company-backups/1c-sql/ --storage-class STANDARD_IA

Для критически важных баз 1С рекомендуемое расписание:

Тип бэкапаЧастотаХранение
Полный SQLЕжедневно, 01:0030 дней
Дифференциальный SQLКаждые 4 часа7 дней
Журнал транзакцийКаждые 15 минут7 дней
Выгрузка DTЕженедельно, Вс 02:0060 дней
Offsite копияЕжедневно после полного90 дней

Проверка и восстановление

Бэкап без проверки восстановления — не бэкап. Регулярно тестируйте процедуру восстановления:

-- SQL Server: тестовое восстановление на другой сервер
RESTORE DATABASE [accounting_test]
  FROM DISK = 'E:\SQLBackups\accounting_1c_FULL.bak'
  WITH REPLACE,
  MOVE 'accounting_1c' TO 'D:\SQLTest\accounting_test.mdf',
  MOVE 'accounting_1c_log' TO 'D:\SQLTest\accounting_test_log.ldf'

-- Проверка целостности восстановленной базы
DBCC CHECKDB ([accounting_test]) WITH NO_INFOMSGS
rem Тестовое восстановление из DT
"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" DESIGNER ^
  /S "server01\accounting_test" ^
  /N "Администратор" /P "password" ^
  /RestoreIB "E:\Backups\DT\accounting_20260408.dt" ^
  /Out "E:\Backups\DT\restore_test.log"

Рекомендуется автоматизировать тестовое восстановление в отдельную базу еженедельно и уведомлять администратора о результате. Также документируйте RTO (время восстановления) и RPO (допустимая потеря данных) для каждой базы.

Часто задаваемые вопросы

SQL-бэкап предпочтителен для ежедневного использования: он не блокирует базу, поддерживает инкрементальные копии и Point-in-Time Recovery. Выгрузка DT полезна как дополнительная мера: DT-файл не зависит от версии SQL Server, легко переносится между серверами и гарантированно содержит консистентные данные 1С. Оптимальная стратегия — комбинация обоих методов.

Выгрузка DT — однопоточная операция, ускорить которую сложно. Рекомендации: разместите файл DT на быстром SSD-диске, перед выгрузкой выполните реструктуризацию базы (для файловых баз) или обслуживание индексов (для SQL). Для баз более 100 ГБ рассмотрите отказ от DT в пользу SQL-бэкапов с COMPRESSION. Если DT нужен для миграции — выполняйте в нерабочее время.

Конфигурация хранится внутри базы данных, поэтому бэкап базы включает конфигурацию. Однако рекомендуется дополнительно хранить CF-файл конфигурации (Конфигуратор → Конфигурация → Сохранить конфигурацию в файл) в системе контроля версий (Git). Это позволяет отслеживать изменения конфигурации и быстро откатиться к предыдущей версии.

Помимо бэкапа баз данных, бэкапьте реестр кластера серверов 1С (каталог srvinfo), который содержит настройки кластера, список баз, назначения функциональности. Расположение: C:\Program Files\1cv8\srvinfo на Windows или /home/usr1cv8/.1sv8/1C/1cv8/ на Linux. Бэкап реестра кластера позволяет быстро восстановить серверную инфраструктуру 1С.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#бэкап 1С#резервное копирование 1С#1С Предприятие бэкап#SQL бэкап 1С#автоматизация бэкапа 1С#восстановление базы 1С#1С dt выгрузка
Комментарии 0

Оставить комментарий

загрузка...