Как создать батник для ежедневного автоматического резервного копирования базы 1С?

Системный администратор 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Автоматизация процесса резервного копирования — одна из важнейших задач системного администратора или программиста, сопровождающего базы 1С. Использование командных файлов (BAT/CMD) позволяет настроить этот процесс без участия пользователя. Рассмотрим подробно, как создать надежный скрипт, какие ошибки чаще всего возникают при его написании и как сделать процедуру максимально безопасной для данных.

Разбор типичных ошибок в BAT-файлах

Часто новички сталкиваются с ситуацией, когда созданный батник закрывается сразу после запуска, а файл резервной копии так и не появляется. Проанализируем типичную структуру скрипта и выясним причины неудач.

Первая и самая распространенная ошибка — несоответствие имен переменных. В командных файлах Windows мы сначала объявляем переменные с помощью команды set, а затем обращаемся к ним, заключая имя в знаки процента. Рассмотрим пример из практики:


set dat=%year%-%month%-%day%_%hour%-%minute%
"C:\Program Files\1cv8\bin\1cv8.exe" DESIGNER /F "C:\PathToBase" /DumpIB "C:\Backup\backup_%date%.dt"

Обратите внимание: в первой строке создается переменная dat, а в команде запуска 1С используется стандартная системная переменная %date%. Если системный формат даты содержит символы, недопустимые в именах файлов (например, точки или косую черту), команда DumpIB завершится ошибкой, так как путь к файлу станет некорректным. Нужно всегда использовать именно ту переменную, которую мы сформировали вручную: backup_%dat%.dt.

Второй важный момент — проблема пробела в часах. Если вы запускаете бэкап до 10 утра, стандартная системная переменная %TIME% возвращает время с пробелом вместо первого нуля (например, " 9:15"). Это разрывает строку пути в командной строке, и скрипт "вылетает". Чтобы этого избежать, используем замену пробела на ноль:


set hour=%TIME:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%

Методы резервного копирования: .DT против .1CD

В среде специалистов 1С часто ведутся споры о том, какой формат копии надежнее. Рассмотрим два основных подхода.

  1. Выгрузка в информационную базу (.DT). Этот метод использует встроенный механизм 1С. Выгрузка осуществляется через параметры DESIGNER /DumpIB. Плюс метода в том, что файл получается компактным и содержит только логические данные. Однако есть критический минус: если в физической структуре базы (файле 1Cv8.1CD) есть скрытые ошибки, выгрузка может пройти успешно, а последующая загрузка в новую базу — завершиться аварией.
  2. Прямое копирование файла базы (.1CD). Фирма "1С" рекомендует именно этот способ для файловых баз. Мы просто копируем основной файл базы данных средствами операционной системы. Это гарантирует, что мы сохраняем базу "как есть". Главное условие — в базе не должно быть активных пользователей, иначе файл будет заблокирован или скопирован с ошибками.

Проанализируем ситуацию с блокировкой. Для корректного копирования .1CD перед началом операции стоит принудительно завершить сеансы 1С. В батнике это можно сделать командой taskkill:


taskkill /F /IM 1cv8* /T
copy "C:\Bases\Trade\1Cv8.1CD" "D:\Backups\Trade_%dat%.1CD"

Создание надежного скрипта с логированием и паузой

Чтобы понять, почему скрипт не работает, на этапе отладки всегда отключайте режим "эха" и добавляйте остановку в конце. Рассмотрим правильный шаблон для диагностики:


REM @echo off - закомментируйте эту строку, чтобы видеть выполнение каждой команды
set day=%DATE:~0,2%
set month=%DATE:~3,2%
set year=%DATE:~6,4%
set dat=%year%-%month%-%day%

"C:\Program Files (x86)\1cv81\bin\1cv8.exe" DESIGNER /F "C:\MyBase" /N "admin" /P "password" /DumpIB "C:\Backups\copy_%dat%.dt" /Out "C:\Backups\log.txt"

PAUSE

Использование ключа /Out позволяет записывать все системные сообщения 1С в текстовый файл. Это бесценно при поиске причин, по которым копия не создалась (например, "Неправильный пароль" или "База занята").

Автоматическая очистка старых архивов

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

Проанализируем строку кода для очистки:

forfiles /p "C:\Backups" /s /m *.dt /d -30 /c "cmd /c del @path"

Здесь параметр /p указывает путь к папке с архивами, /m задает маску файлов, а /d -30 фильтрует файлы, созданные более месяца назад. Интегрировав эту строку в основной батник, вы получите полностью автономную систему обслуживания.

Организация работы через Планировщик задач

После того как батник протестирован и стабильно создает копии, его нужно поставить на расписание. Выясним основные правила настройки "Планировщика задач" Windows (Task Scheduler):

Рассмотрим финальный вариант продвинутого скрипта, который объединяет в себе установку даты, создание лога и очистку старых данных:


@echo off
set day=%DATE:~0,2%
set month=%DATE:~3,2%
set year=%DATE:~6,4%
set hour=%TIME:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
set min=%TIME:~3,2%
set dat=%year%-%month%-%day%_%hour%-%min%

set LogFile="C:\Backup\log_%dat%.txt"
set BackupDir="C:\Backup"
set BasePath="C:\1C_Bases\Accounting"

echo Начало процесса: %dat% >> %LogFile%

"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F %BasePath% /N "Admin" /P "Pass" /DumpIB %BackupDir%\backup_%dat%.dt /Out %LogFile% -NoTruncate

if %ERRORLEVEL% EQU 0 (
    echo Копия успешно создана >> %LogFile%
) else (
    echo ОШИБКА при создании копии! Код ошибки: %ERRORLEVEL% >> %LogFile%
)

forfiles /p %BackupDir% /m *.dt /d -14 /c "cmd /c del @path"
echo Очистка старых файлов завершена >> %LogFile%

Этот пример является универсальным шаблоном. Мы использовали объект 1cestart.exe, который автоматически выберет нужную версию платформы, применили проверку %ERRORLEVEL% для контроля результата и добавили запись в лог-файл для последующего аудита.

← На главную