Скрипты для бэкапа файловой базы 1С Предприятия

Для ежедневных работ по архивации баз данных 1С Предприятия в файловом варианте я использую программу Handy Backup.

Бесплатный аналог в скрипте можно брать здесь >>

Конечно, данная тема также подымается и на курсе: Администратор 1С!

 

Программка конечно удобная, но это все же сторонний софт, который приходится ставить на сервер. И такое решение конечно подходит, к сожалению не всем и не всегда.

Альтернативой всегда были батники (скрипты), которые пользователи в основном запускают либо руками, когда требуется создать резервную копию базы, или, зарядив скрипт в «планировщик заданий windows», который по расписанию запускает уже эти скрипты.

Фирма 1С рекомендует создавать резервную копию файловой базы путем копирования файлов базы.

И хоть на практике бэкап сделанный выгрузкой в *dt (на малых файловых базах) меня еще не подводил, но тем не менее существует небольшой риск что Вы из такого бэкапа можете не восстановить потом базу 1С. (Так пишет 1С).

Что ж, игнорировать это предупреждение нет смысла, так как есть, конечно, простые способы правильно «забэкапить» файловую базу, как программой, так и скриптом.

Собственно в этой статье я расскажу и поделюсь скриптами, что делают бэкапы путем копирования файлов.

(Что касается софта, который делает резервное копирование баз, так на блоге уже есть хорошая статья на эту тему, вот здесь можете почитать).

 

О скриптах…

Друзья, ниже Вы сможете скачать несколько скриптов, которые я иногда использую для создания бэкапов.  (Если Вы уже пользуетесь подобными скриптами, тогда большая просьба опубликовать их в комментариях под статьей, и я и многие другие пользователи будут Вам благодарны!).

И так первый скрипт это VBS.

Option Explicit

Const ForReading = 1, ForWriting = 2, ForAppending = 8

Dim MySource, MyTarget, MyZipName, MyHex, MyBinary, i
Dim oShell, oApp, oFolder, oCTF, oFile
Dim oFileSys

MySource = "C:\Users\AdminKuhar\Documents\1C\DemoTrade\"
MyTarget = "E:\DemoTrade.zip"

MyHex = Array(80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

For i = 0 To UBound(MyHex)
MyBinary = MyBinary & Chr(MyHex(i))
Next

Set oShell = CreateObject("WScript.Shell")
Set oFileSys = CreateObject("Scripting.FileSystemObject")


Set oCTF = oFileSys.CreateTextFile(MyTarget, True)
oCTF.Write MyBinary
oCTF.Close
Set oCTF = Nothing

Set oApp = CreateObject("Shell.Application")

Set oFolder = oApp.NameSpace(MySource)
If Not oFolder Is Nothing Then
oApp.NameSpace(MyTarget).CopyHere oFolder.Items
End If

wScript.Sleep(5000)


Set oFile = Nothing
On Error Resume Next
Do While (oFile Is Nothing)

Set oFile = oFileSys.OpenTextFile(MyTarget, ForAppending, False)
If Err.number <> 0 then
Err.Clear
wScript.Sleep 3000
End If
Loop

Set oFile=Nothing
Set oFileSys=Nothing

 

Он быстро упакует Вашу файловую базу 1С в *zip архив и создаст его на диске что Вы укажете.

Работает быстро и просто.

Из настроек, что нужно сделать:

MySource = «C:\Users\AdminKuhar\Documents\1C\DemoTrade\»    -Каталог с базой 1С.

MyTarget = «E:\DemoTrade.zip»   -Куда поместить «бэкап».

Во втором варианте мы используем *bat файл который выполнит «бэкап» нашей базы в нужное место и упакует его в *rar архив.

@echo off 
REM chcp 1251 
copy C:\Users\AdminKuhar\Documents\1C\DemoTradeEntr\1Cv8.1CD C:\1Cv8.1CD 
set hour=%time:~0,2% 
if %hour% lss 10 set hour=0%time:~1,1% 
set namefiles=%date:~8,2%%date:~3,2%%date:~0,2%%hour%%time:~3,2%%time:~6,2% 
C:\Progra~1\WinRAR\RAR.exe m -m5 E:\Arhiv\%namefiles%.rar C:\1Cv8.1CD 
copy E:\Arhiv\%namefiles%.rar \\freenas\backup\%namefiles%.rar

 

Особенность скрипта в том что во первых он копирует только сам файл 1Cv8.1CD (без логов и прочего, другими словами делает «бэкап» довольно быстро и с отображением прогресса выполнения работы + дает понятное имя архиву в виде текущий даты).

05-10-2017 17-01-42

Конечно, здесь требуется архиватор WinRAR.

Настройки также предельно простые, нужно лишь указать, что и куда копируем.

 

И вот еще один вариант бэкапа.

Этот способ нравиться мне больше всего, так как работает очень быстро и что главное безопасно! (очень надежный).

"C:\Program Files\7-Zip\7z.exe" u -ssw -mx0 -mmt2 -ms=off -r E:\Arhiv\m_backup.7z @"E:\Arhiv\listbackup.txt" >> E:\Arhiv\m_backup_%date%.log

Им можно «забэкапить» сразу все нужные базы.

Вместе с «бэкапом» создается подробный лог файл, 

05-10-2017 17-48-30

Так Вы точно будете знать, если что-то пошло не так при его создании!

Чтоб скрипт заработал у Вас:

 

1. В том месте откуда Вы будете его запускать нужно создать файлик простой текстовый (listbackup.txt), и в него поместить адреса (указать пути к папкам с базами 1С).

listbackup.txt

05-10-2017 17-10-39

05-10-2017 17-12-59

2. Нужно установить архиватор 7Zip.

 

Кстати вот расшифровка параметров:

u — Обновление файлов в архиве. Если файла нет, создает новый.

-ssw — Включить файл в архив, даже если он в данный момент используется. Для резервного копирования очень полезный ключ.

-mx0 —Не используем сжатие (Для скорости создания бэкапа!).

-mmt2 — использовать два потока (пригодится при обновлении архива).

-ms=off — по дефолту создаются solid-архивы. отключаем ибо они работают медленнее. возможно, для mx0 — некритично, но для mx1 и т.д. — оптимальнее.

-r — рекурсивно обрабатывать поддиректории.

e:\Backup_Base1S.7z — результирующий файл архива.

@«e:\listbackup.txt» — (файл в UTF8 нужно сохранить) с папками, которые следует «забэкапить».

>> e:\m_backup_%date%.log — все (удачные и неудачные) результаты пишем в лог с датой.

 

Абсолютно все скрипты можно модернизировать, например написать команду для «выгона» пользователей из базы 1С.

(Тот же TASKKILL и другие.)

Внимание!

Последний скрипт для «бэкапа» баз 1С, может создавать резервную копию даже если в базе 1С работают пользователи, НО это не значит что такой «бэкап» считается хорошим.

Всегда нужно предварительно завершить работу пользователей и только потом делать копию!

Если Вы хотите больше узнать о технической стороне 1С, тогда регистрируйтесь на первый бесплатный модуль курса: Администратор 1С >>>

27 комментариев к “Скрипты для бэкапа файловой базы 1С Предприятия”

  1. Спасибо большое за статью. Как раз сейчас стоит такая задача. Но файлы архивных копий нужно сохранять на ftp ресурсе. Подойдут ли эти скрипты для такой задачи или какие изменения нужно внести в скрипт, чтобы сохранение бэкапов (архивов) производилось на ftp ресур? Скорость записи на ресурс весьма низкая и результат не всегда предсказуем — бывают срыв сеанса записи. Возможно даже лучше сохранять сначала на локальный диск, а потом перемещать на ресурс с возможностью повторного копирования, при сбое.

  2. chcp 1251
    @echo off
    set day=%DATE:~0,2%
    set month=%DATE:~3,2%
    set year=%DATE:~6,4%
    if exist G:timearhProgi_01*.rar del G:timearhProgi_01*.rar
    «E:ProgProbWinRarWinRAR.exe» a -r -m5 G:timearhProgi_01_%year%-%month%-%day%.rar E:Progi
    if exist G:arhivProgi_03*.rar del G:arhivProgi_03*.rar
    if exist G:arhivProgi_02*.rar ren G:arhivProgi_02*.rar Progi_03.rar
    if exist G:arhivProgi_01*.rar ren G:arhivProgi_01*.rar Progi_02.rar
    xcopy G:timearhProgi_01_*.rar G:arhiv

    Батник закинуть в планировщик, для запуска по расписанию
    Создает в папке «arhiv» — архив нужного файла.
    Хранит последние 3 архива. ( **_01, **_02, **_03)
    При создании четвертого, удаляет самый старый (***_03).
    (Можно настроить на хранение сколько угодно архивов.)

    Создает копию, в папке «timearh» крайнего по времени создания архива (**_01)

    E:ProgProbWinRarWinRAR.exe — путь к архиватору
    E:Progi — папка. которую архивируем.
    G:arhiv — папка на нужном диске для хранения архивов
    G:timearh — папка для хранения копии крайне созданного архива.
    Progi_ — имя под которым создаем архив.
    Все пути (папки) англ буквы!

  3. Не знаю как тут относятся, но для работы с базами, особенно что касается бэкапов и обновления, втч облачных — не видел пока ничего лучше «Обновлятора 1с». Может быть автор сайта пропустил этот продукт, может сознательно игнорирует. Но простому человекупрограммистуразработчику, можно поставить обновлятор и забыть Handy или другие утилиты + кучи скриптов как страшный сон.

      • Я сам когда то пытался использовать бесплатную (с поддержкой Я.Диска) и платную версию Handy, но столкнулся с несколькими глюками при работе программы в режиме службы + когда администратор не один а двое. Также недостаточно гибкие возможности настроить глубину хранения ( количество дневных, недельных, месячных, квартальных, годовых) копий, отдельно настроить глубину для облачного хранения. Ну и естественно, не умеет автоматически бэкапить базы перед обновлениями, опасными операциями и тд. Но как я понял, вы для вышеперечисленного используете свой продукт в связке с Handy. Наверное, тоже вполне рабочее решение.

        • Основных возможностей Handy хватит большинству пользователей. Один администратор должен отвечать за бэкапы (в основном). Создаете учетку с нужными правами, под ней и работает Handy. Обновлениями в 1С в первую очередь должен заниматься программист 1С (админ редко). Обновлятор вещь больше для разработчика. Handy бэкапит не только 1С (Часто бэкапить нужно много всего вместе — например те же базы MySQL). Универсальное решение.

    • Обновлятор прекрасен. Кроме шуток, очень хорошо сделан и каждая настройка разжёвана прям в контекстной справке.
      Мне кроме архивации баз нужно было ещё кое-что делать, поэтому я продолжаю использовать скрипты на PowerShell.
      Но для большинства людей Обновлятор — лучшее решение. Разумеется, если купить полную версию (за совершенно условные деньги, надо сказать).

  4. Еженощно:
    #Подгрузим переменные
    . C:UsersАдминистраторDocumentsScriptsПеременные.ps1

    #Остановим службу Сбербанк Бизнес Онл@йн
    #Stop-Service -Name SberBank_BO

    #Очистим очередь печати
    Stop-Service -Name Spooler -Force
    Remove-Item c:WindowsSystem32spoolPRINTERS*
    Start-Service -Name Spooler

    #Удаляем старые файлы в рабочих папках
    #Создадим список путей, где нужно удалить файлы
    [string[]]$TempDir = $(resolve-path C:Users*AppDataLocalTemp) + «C:UsersPublicDocumentsScanfiles»
    #Удалим все файлы старше семи дней
    foreach ($elm in $TempDir) { Get-ChildItem $elm -recurse | Where-Object { $_.LastWriteTime -lt $(Get-Date).AddDays(-7) } | Remove-Item -recurse -force}

    #Удаляем архивы старше одного месяца
    $include = @(‘1CBases-*.7z’,’Docs-*.7z’,’CommonDocs-*.7z’)
    Get-ChildItem «$BackUp*» -recurse -Include $include | Where-Object { $_.LastWriteTime -lt $(Get-Date).AddDays(-30) } | Remove-Item

    #Перемещаем архивы SPU_ORB
    #move-item -path «C:Program Files (x86)Spu_orbARHIV*» -destination $BackUp

    #Архивируем базы 1С, за исключением файлов, указаных в exclud_1C.txt
    $ArchName = «1CBases-$(get-date -uformat %d-%m-%Y).7z»
    &7Zip a «$BackUp$ArchName» $Param `-xr@`»c:Program Files7-Zipexclud_1C.txt`» `-p$Password «$1CBases*»

    #Архивируем файлы находящиеся в личных документах и на рабочих столах пользователей
    #Создадим список файлов, изменённых за последние сутки
    $AddArch = foreach ($element in $(resolve-path «C:Users*Documents», «C:Users*Desktop»)) {Get-ChildItem $element* -recurse -include $Filetype | Where-Object {$_.LastWriteTime -gt $(Get-Date).AddDays(-1)}}
    Out-File -FilePath $SourcePath -encoding UTF8 -InputObject $(foreach ($element in $AddArch) {$element.fullname -replace «C:\Users\»})
    #Задаём команды архиватору
    $ArchName = «Docs-$(get-date -uformat %d-%m-%Y).7z»
    Set-Location C:Users
    &7Zip a «$BackUp$ArchName» -mx9 -mhe `-p$Password `@$SourcePath
    Remove-Item $SourcePath

    #Архивируем общие документы
    #Создадим список файлов, изменённых за последние сутки
    $AddArch = $(Get-ChildItem $CommonDocs* -recurse -include $Filetype | Where-Object {$_.LastWriteTime -gt $(Get-Date).AddDays(-1)})
    Out-File -FilePath $SourcePath -encoding UTF8 -InputObject $(foreach ($element in $AddArch) {$element.fullname -replace «C:\Users\Public\Documents\»})
    #Задаём команды архиватору
    $ArchName = «CommonDocs-$(get-date -uformat %d-%m-%Y).7z»
    Set-Location $CommonDocs
    &7Zip a «$BackUp$ArchName» -mx9 -mhe `-p$Password `@$SourcePath
    Remove-Item $SourcePath

  5. Файл «Еженощно.ps1»

    #Подгрузим переменные
    . C:UsersАдминистраторDocumentsScriptsПеременные.ps1

    #Архивируем базы 1С, за исключением файлов, указаных в exclud_1Cm.txt
    $ArchName = «1CBasesFull-$(get-date -uformat %d-%m-%Y).7z»
    &7Zip a «$BackUp$ArchName» $Param `-xr@`»c:Program Files7-Zipexclud_1Cm.txt`» `-p$Password «$1CBases*»

    #Архивируем все файлы пользователей
    $AddArch = foreach ($element in $(resolve-path «C:Users*Documents», «C:Users*Desktop»)) {Get-ChildItem $element* -recurse -include $Filetype}
    Out-File -FilePath $SourcePath -encoding UTF8 -InputObject $(foreach ($element in $AddArch) {$element.fullname -replace «C:\Users\»})
    #Задаём команды архиватору
    $ArchName = «DocsFull-$(get-date -uformat %d-%m-%Y).7z»
    Set-Location C:Users
    &7Zip a «$BackUp$ArchName» $Param `-p$Password `@$SourcePath
    Remove-Item $SourcePath

    #Архивируем все общие документы
    $AddArch = $(Get-ChildItem $CommonDocs* -recurse -include $Filetype)
    Out-File -FilePath $SourcePath -encoding UTF8 -InputObject $(foreach ($element in $AddArch) {$element.fullname -replace «C:\Users\Public\Documents\»})
    #Задаём команды архиватору
    $ArchName = «CommonDocsFull-$(get-date -uformat %d-%m-%Y).7z»
    Set-Location $CommonDocs
    &7Zip a «$BackUp$ArchName» $Param `-p$Password `@$SourcePath
    Remove-Item $SourcePath

    #Архивируем ключи подписей
    $ArchName = «KeyDisk-$(get-date -uformat %d-%m-%Y).7z»
    Set-Location Z:
    &7Zip a «$BackUp$ArchName» $Param `-p$Password * -r

  6. Файл «Переменные.ps1»

    #Задаём сквозные переменные
    set-alias 7Zip «$env:ProgramFiles7-Zip7z.exe»
    $Password = «Мой невероятный пароль» #Этот пароль используем для всех архивов
    $Filetype = «*.xls*»,»*.doc*»,»*.od*»,»*.rtf»,»*.txt»,»*.xml»,»*.jpg»,»*.tif*»,»*.pdf»,»*.png»,»*.lnk»
    $Param = «-slp»,»-ms=2g»,»-mx=9″,»-mhe»,»-m0=LZMA2:d=64m:fb=64″,»-mmt=8″,»-v9g» #Параметры архиватора для больших объёмов
    $BackUp = «C:UsersАдминистратор.WIN-AUTKLLF494MYandexDiskFirmaNameСервер»
    $CommonDocs = «C:UsersPublicDocuments»
    $1CBases = «C:UsersPublic1CBases»
    $SourcePath = «C:UsersАдминистраторDocumentsaddarch.txt»

  7. Раньше я отправлял файлы в хранилку по FTP. Сейчас (как видно из остальных скриптов) сохраняю в папку Яндрес.Диска — они сами улетают в облако. Гораздо удобней и надёжнее.
    Тем не менее кому-то может пригодиться:

    Файл «FTP.ps1»
    #Отправляем файлы по FTP в укромное место
    #Создаём список файлов, подлежащих отправке
    $CopyList = Get-ChildItem E:BackUp* | Where-Object { $_.LastWriteTime -gt $(Get-Date).AddHours(-12) } | foreach {Write-Output «send $_»}
    #Готовим коммандный файл для FTP
    $FTPCommand = «open 77.55.55.55», «name», «password», «binary»
    $FTPTrans = $FTPCommand + $CopyList + «bye»
    Out-File -FilePath C:TempFTPTrans.txt -encoding ASCII -InputObject $FTPTrans
    #Запусткаем ftp с указанием коммандного файла
    &c:WindowsSystem32ftp.exe -s:C:TempFTPTrans.txt
    Remove-Item C:TempFTPTrans.txt

  8. @echo off
    set Today=%DATE%
    Set cfg=C:Program Files (x86)1cv8common1cestart.exe
    set baseway=D:1CR_WORK_JTI_ACC
    set keyway=F
    set user=
    set pass=
    set archivname=D:1Carchiv
    set basename=
    «%cfg%» CONFIG /%keyway%»%baseway%»/N %user% /P %pass% /DumpIB «%archivname%/%basename%_%Today%.dt»

  9. Архивирование на ubuntu сервере в облако на yandex.disk.
    Предварительно устанавливаем клиента yandex.disk на ubuntu c дистрибутива https://yandex.ru/support/disk/cli-clients.html

    Далее собственно скрипт, который запускается через cron ночью, получая циклический недельный архив.

    #архивируем файл *.1CD в имя пишем номер дня недели в отдельный каталог на сервере.
    tar -czPf /backup/buh/`date ‘+%u’`_buh_1Cv8.1CD.tgz /database/buh/1Cv8.1CD
    #копируем в каталог синхронизации яндекс диска
    cp /logs/backup/buh/`date ‘+%u’`_buh_1Cv8.1CD.tgz /data/backup_on_yandex
    #запускаем процесс синхронизации
    yandex-disk sync

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

База знаний 1С