← Назад к вопросам

Резервное копирование базы без доступа к конфигуратору

2.7 Senior🔥 131 комментариев
#СУБД и хранение#Стандарты разработки

Условие

Опишите и реализуйте способ резервного копирования базы данных 1С без доступа к Конфигуратору.

Возможные способы:

  1. Через пакетный запуск 1С (командная строка)
  2. Программно через внешнюю обработку
  3. Через средства СУБД (для клиент-серверной версии)
  4. Через утилиту ibcmd

Пример командной строки

1cv8.exe CONFIG /S"server\base" /DumpIB "backup.dt" /Out "log.txt"

Задание

Напишите скрипт или обработку для автоматического резервного копирования с записью в лог.

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Резервное копирование базы данных 1С без доступа к Конфигуратору

Рассмотрим несколько способов реализации автоматического резервного копирования базы 1С:Предприятие.

Способ 1: Пакетный запуск через командную строку

Основные команды для резервного копирования:

1cv8.exe CONFIG /S"Сервер\БазаДанных" /DumpIB "путь\backup.dt" /Out "путь\log.txt" /N Администратор /P пароль

Параметры команды:

  • /S — строка подключения к базе (для клиент-серверной версии)
  • /DumpIB — путь для сохранения дампа (выгрузка дескриптора ИБ)
  • /Out — файл логирования результатов
  • /N — имя пользователя
  • /P — пароль пользователя

Пример с полным путём:

C:\Program Files\1C\8.3\bin\1cv8.exe CONFIG /S"localhost\TestBase" /DumpIB "D:\Backups\backup_2024.dt" /Out "D:\Backups\log_2024.txt" /N Администратор /P 123456

Способ 2: Batch-скрипт для автоматизации

Файл backup.bat (для ОС Windows):

@echo off
SetLocal EnableDelayedExpansion

REM Параметры подключения
set SERVER=localhost
set DATABASE=TestBase
set USERNAME=Администратор
set PASSWORD=123456
set BACKUP_PATH=D:\Backups
set BIN_PATH=C:\Program Files\1C\8.3\bin\1cv8.exe

REM Генерируем имя файла с датой
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c%%a%%b)
for /f "tokens=1-2 delims=/" %%a in ('time /t') do (set mytime=%%a%%b)

set FILENAME=backup_%mydate%_%mytime%.dt
set BACKUP_FILE=%BACKUP_PATH%\%FILENAME%
set LOG_FILE=%BACKUP_PATH%\log_%mydate%.txt

REM Проверяем, существует ли директория для резервных копий
if not exist "%BACKUP_PATH%" mkdir "%BACKUP_PATH%"

REM Выполняем резервное копирование
echo Начало резервного копирования: %mydate% %mytime% >> "%LOG_FILE%"
echo Путь к базе: %SERVER%\%DATABASE% >> "%LOG_FILE%"

"%BIN_PATH%" CONFIG /S"%SERVER%\%DATABASE%" /DumpIB "%BACKUP_FILE%" /Out "%LOG_FILE%" /N %USERNAME% /P %PASSWORD%

if %ERRORLEVEL% equ 0 (
    echo Резервная копия успешно создана: %BACKUP_FILE% >> "%LOG_FILE%"
    echo Успешно >> "%LOG_FILE%"
) else (
    echo Ошибка при создании резервной копии. Код ошибки: %ERRORLEVEL% >> "%LOG_FILE%"
)

REM Удаляем старые резервные копии (старше 30 дней)
for /f "delims=" %%A in ('powershell -Command "Get-ChildItem '%BACKUP_PATH%\backup_*.dt' -ErrorAction SilentlyContinue | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-30)} | Select-Object FullName"') do (
    del "%%A"
    echo Удалена старая резервная копия: %%A >> "%LOG_FILE%"
)

echo Завершение: %mydate% %mytime% >> "%LOG_FILE%"
pause

Способ 3: Внешняя обработка для резервного копирования

Обработка "РезервноеКопирование" (управляемая форма):

// Процедура выполнения резервного копирования
Процедура ВыполнитьРезервноеКопирование(Команда)
    
    Попытка
        ПараметрыРезервной = ПолучитьПараметрыРезервной();
        
        // Получаем текущее имя информационной базы
        ИмяБазы = ПолучитьИмяИБ();
        
        // Формируем имя файла резервной копии
        ТекущаяДата = ТекущаяДата();
        ИмяФайла = "Backup_" + Формат(ТекущаяДата, "ДФ=yyyyMMdd_hhmmss") + ".dt";
        ПолныйПутьФайла = ПараметрыРезервной.ПапкаРезервных + ИмяФайла;
        
        ЗаписатьВЖурнал("Начало резервного копирования", ПолныйПутьФайла);
        
        // Выполняем команду резервного копирования
        КоманднаяСтрока = ФормироватьКомандуРезервной(ПолныйПутьФайла, ПараметрыРезервной);
        
        Процесс = Новый ПроцессЗапуска(КоманднаяСтрока);
        Процесс.Запустить();
        Процесс.ОжидатьЗавершения();
        
        КодВозврата = Процесс.КодВозврата;
        
        Если КодВозврата = 0 Тогда
            // Проверяем размер файла
            Файл = Новый Файл(ПолныйПутьФайла);
            РазмерФайла = Файл.Размер();
            
            СообщениеОСпехе = СтрШаблон("Резервная копия успешно создана: %1 (размер: %2 байт)",
                ИмяФайла, РазмерФайла);
            ЗаписатьВЖурнал("Успешное резервное копирование", СообщениеОСпехе);
            Сообщение(СообщениеОСпехе);
        Иначе
            ОшибкаСообщение = СтрШаблон("Ошибка резервного копирования. Код: %1", КодВозврата);
            ЗаписатьВЖурнал("Ошибка резервного копирования", ОшибкаСообщение, УровеньЖурналаРегистрации.Ошибка);
            ВызватьОшибку(ОшибкаСообщение);
        КонецЕсли;
        
        // Удаляем старые резервные копии
        УдалитьСтарыеРезервныеКопии(ПараметрыРезервной.ПапкаРезервных, ПараметрыРезервной.ДнейХранения);
        
    Исключение
        ОписаниеОш = ОписаниеОшибки();
        ЗаписатьВЖурнал("Критическая ошибка резервного копирования", ОписаниеОш, УровеньЖурналаРегистрации.Ошибка);
        ВызватьОшибку("Ошибка резервного копирования: " + ОписаниеОш);
    КонецПопытки;
    
КонецПроцедуры

// Функция формирования командной строки
Функция ФормироватьКомандуРезервной(ПолныйПутьФайла, ПараметрыРезервной)
    
    ПутьК1С = ПараметрыРезервной.Путь1С;
    ИмяБазы = ПолучитьИмяИБ();
    
    // Для локальной базы
    Если ПараметрыРезервной.ТипБазы = "Локальная" Тогда
        КоманднаяСтрока = СтрШаблон(
            "\"%1\" CONFIG /N%2 /P%3 /IBPath %4 /DumpIB \"%5\"",
            ПутьК1С,
            ПараметрыРезервной.ПользовательНомер,
            ПараметрыРезервной.Пароль,
            ПараметрыРезервной.ПапкаБазы,
            ПолныйПутьФайла
        );
    Иначе
        // Для клиент-серверной базы
        КоманднаяСтрока = СтрШаблон(
            "\"%1\" CONFIG /S\"%2\%3\" /DumpIB \"%4\" /N%5 /P%6",
            ПутьК1С,
            ПараметрыРезервной.Сервер,
            ИмяБазы,
            ПолныйПутьФайла,
            ПараметрыРезервной.ПользовательНомер,
            ПараметрыРезервной.Пароль
        );
    КонецЕсли;
    
    Возврат КоманднаяСтрока;
    
КонецФункции

// Удаление старых резервных копий
Процедура УдалитьСтарыеРезервныеКопии(ПапкаРезервных, ДнейХранения)
    
    Попытка
        Поиск = Новый НайтиФайлы(ПапкаРезервных, "*.dt");
        НайденныеФайлы = Поиск.НайтиВсе();
        
        ТекущаяДата = ТекущаяДата();
        ДатаУдаления = ТекущаяДата - (ДнейХранения * 86400);
        
        Для Каждого Файл Из НайденныеФайлы Цикл
            Если Файл.ВремяИзменения < ДатаУдаления Тогда
                УдаляемыйФайл = Новый Файл(Файл.ПолноеИмя);
                УдаляемыйФайл.Удалить();
                ЗаписатьВЖурнал("Удаление старой резервной копии", Файл.ПолноеИмя);
            КонецЕсли;
        КонецЦикла;
    
    Исключение
        // Игнорируем ошибки при удалении старых копий
        ЗаписатьВЖурнал("Ошибка удаления старых копий", ОписаниеОшибки(), УровеньЖурналаРегистрации.Предупреждение);
    КонецПопытки;
    
КонецПроцедуры

// Получение параметров резервного копирования
Функция ПолучитьПараметрыРезервной()
    
    Параметры = Новый Структура();
    
    // Данные должны быть загружены из конфигурации или параметров
    Параметры.Вставить("Путь1С", "C:\\Program Files\\1C\\8.3\\bin\\1cv8.exe");
    Параметры.Вставить("ПапкаРезервных", "D:\\Backups\\");
    Параметры.Вставить("ПапкаБазы", "D:\\1CBase\\"); // Для локальной базы
    Параметры.Вставить("Сервер", "localhost"); // Для КС
    Параметры.Вставить("ПользовательНомер", "Администратор");
    Параметры.Вставить("Пароль", "password123");
    Параметры.Вставить("ТипБазы", "Локальная"); // или "КлиентСервер"
    Параметры.Вставить("ДнейХранения", 30);
    
    Возврат Параметры;
    
КонецФункции

// Получение имени ИБ
Функция ПолучитьИмяИБ()
    Возврат "ТестоваяБаза"; // Получить реальное имя
КонецФункции

// Логирование
Процедура ЗаписатьВЖурнал(Событие, Сообщение, Уровень = УровеньЖурналаРегистрации.Информация)
    ЗаписатьВВнутреннийЖурнал(Сообщение, Уровень, , , Событие);
КонецПроцедуры

Способ 4: Регламентное задание для автоматизации

Настройка в конфигураторе:

// Регламентное задание
РегламентноеЗадание РезервноеКопированиеКаждыйДень
  Название: "Резервное копирование каждый день в 22:00"
  Использование: "Используется"
  Расписание: "Каждый день в 22:00"
  ПроцедурaName: "ОбщийМодуль.РезервноеКопирование.ВыполнитьРезервноеКопирование"
КонецРегламентногоЗадания

Способ 5: Резервное копирование на уровне СУБД

Для PostgreSQL (клиент-серверная 1С):

@echo off
set PGPASSWORD=postgres_password
set BACKUP_PATH=D:\Backups
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c%%a%%b)

pg_dump.exe -h localhost -U postgres -d base_name > "%BACKUP_PATH%\backup_%mydate%.sql"

if %ERRORLEVEL% equ 0 (
    echo Резервная копия успешно создана >> "%BACKUP_PATH%\log_%mydate%.txt"
) else (
    echo Ошибка при создании резервной копии >> "%BACKUP_PATH%\log_%mydate%.txt"
)

Для MS SQL Server:

-- Скрипт SQL для резервного копирования
BACKUP DATABASE [YourDatabaseName]
TO DISK = 'D:\\Backups\\backup_' + FORMAT(GETDATE(), 'yyyyMMdd_hhmmss') + '.bak'
WITH COMPRESSION, STATS = 1;

Чеклист реализации резервного копирования

1. Выбор способа:

  • Локальная база → пакетный запуск
  • Клиент-серверная → через СУБД + пакетный запуск

2. Автоматизация:

  • Регламентные задания 1С
  • Планировщик задач Windows
  • Cron для Linux

3. Хранение:

  • Разделение по датам
  • Удаление старых копий
  • Многоуровневое хранилище

4. Контроль:

  • Логирование всех операций
  • Проверка целостности копий
  • Алерты при ошибках

5. Восстановление:

  • Документирование процесса
  • Регулярное тестирование
  • Хранение инструкций

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