В процессе работы с 1С бухгалтерией обязательно необходимо создание резервных копий баз 1С.

На просторах интернета конечно достаточно много (для Windows) различного ПО по выполнению данной задачи, но как правило, это ПО (для выполнения некоторых задач) является платным. Конечно достаточно много вариантов и бесплатного ПО, но оно обычно имеет ограниченный функционал. Так например до недавнего времени я использовал Effector Saver. До третьей версии программа имела бесплатный вариант, но начиная с четвертой — стала платной. Конечно и третьей версии вполне достаточно, но там нет возможности делать выгрузку базы средствами 1С с отключением зависших сессий на сервере 1С, а вот уже в четвертой версии такой функционал присутствует.

Если же коснуться систем на базе Linux, то тут увы и ах… Нормального ПО просто нет, да и ненормального тоже.

По сути ничего сложного в решении данной задачи нет. Организовать создание архивной копии папки (для файлового варианта работы 1С), или создать дамп базы (для серверного варианта работы 1С), или же сделать выгрузку базы штатными средствами самой 1С (для любого варианта 1С) процесс вполне тривиальный и решается достаточно просто в любой из систем. В качестве архивных копий прощего всего использовать формат *.tar.gz, так как данный архив полностью поддерживается в любой системе изначально, ни чего доустанавливать не нужно.

Плюс ко всему, фирма 1С создала приложения командной строки rac/ras, благодаря которым можно управлять сеансами на сервере, самое главное — отключать зависшие сеансы. И теперь все эти функции можно выполнять автоматически.

И так, допустим мы имеем:

  1. Пусть на сервере крутятся как файловые базы, так и серверные базы. Пусть так же используется веб-доступ к нашим базам. В качестве сервера баз данных может использоваться как MsSQL так и PstgreSQL.
  2. Допустим, что есть некий пользователь (user), под которым прописаны все нужные нам базы в стартере 1С. Самое главное, что бы там не было «не нужных» баз или еще страшнее — не существующих баз. Мы будем использовать этот список для автоматического формирования списка баз, для которых будет создаваться резервная выгрузка баз.
  3. Создание резервных копий всех баз будет происходить в определенную папку/папки, внутри которых будет автоматически формироваться: папка с именем базы — в ней будут находиться папки — День, Неделя и Месяц — для сохранения дневных копий (за последние 4 дня), недельных копий (за последние 4 недели) и месячных копий (за последние 4 месяца) базы.
  4. Так же предположим, что в качестве Web сервера для Windows будет использоваться его родной iis, а для Linux — apach. Хотя этот момент просто изменить.
  5. Так же для Windows важен еще один момент — нужно что бы для 64 битной системы устанавливалась так же и 1С 64 бита. К тому же необходимо, что бы в качестве сервера 1С выступала последняя установленная (по номеру версии) 1С. Нет — не последняя существующая версия 1С, а последняя по версии, установленная на данный сервер версия 1С. Дело в том, что в Windows платформа 1С устанавливается в папки вида C:\Program Files\1cv8\8.x.xx.xxxx , и этих папок может быть несколько. И возникает вопрос — какая из них используется в качестве сервера? Конечно, можно жестко задать конкретный путь, но тогда в случае смены сервера можно забыть изменить этот путь в скрипте и как результат — остаться без копий. По этому было решено, что скрипт отыщет максимальную версию по названию папки и будет использовать именно его. Но тут есть один нехороший момент — иногда бывает так, что ставится более новый сервер, далее обнаруживается, что на нем база работает некорректно и сервер возвращается на предыдущий релиз. И вот в этом случае, даже если Вы из программ удалите свежий релиз 1С, то вот папка в C:\Program Files\1cv8\ к сожалению останется, и тогда скрипт опять же не отработает. Т.е. в этом случае потом нужно будет вручную так же удалить не нужную уже папку от удаленной версии.
  6. И последнее — если создаются выгрузки из баз 1С, то необходимо что бы во всех базах был некий пользователь User1C с одинаковым паролем, который будет как раз использоваться для создания выгрузок из базы 1С.

А теперь собственно говоря сами скрипты для выполнения данных задач:

Для Windows:

@echo off
rem *******************************************************************************************
rem ********************** Ввод первоначальных данных *****************************************
rem *******************************************************************************************

mode con: cp select=1251
rem Переменная пути, где будут сохраняться выгрузки из баз
rem Можно указать через ; несколько путей, в конце обязательно\
set patharcall=D:\ARC\;D:\ARC1\
rem Переменная отвечает за день недели в который будет происходить создание недельной копии
rem Понедельник - 1 ..... Воскресенье - 7
set weekday=5
rem Переменная отвечает за день месяца в который будет происходить создание месячной копии
set monthday=1
rem Переменная отвечает за то, сколько резервных копий оставлять
set copysave=4
rem Переменная задает тип сохранения для файловой базы
rem 0 - архив папки, 1 - выгрузка 1С
set fbasetype=1
rem Переменная задает тип сохранения для серверной базы
rem 0 - дамп базы из сервера, 1 - выгрузка 1С
set sbasetype=1
rem Переменная задает тип сервера базы данных
rem 0 - MsSQL, 1 - posgresql
set sqltype=1
rem Путь до файла со списком баз 1С
set file1c=%APPDATA%\1C\1CEStart\ibases.v8i

rem Имя пользователя к базам 1С для выгрузок
set username=User1C
rem Пароль к пользователю баз 1С
set userpw=passwordUser1C

rem имя пользователя сервера баз данных
set userpg=postgres
rem пароль пользователя сервера баз данных
set passpg=passwordpostgres
set PGPASSWORD=%passpg%

rem *******************************************************************************************
rem ********************* Ввод первоначальных данных завершен *********************************
rem *******************************************************************************************

cls
echo Начинаем создание резервных копий баз 1С

taskkill.exe /F /IM "1cv8.exe"
taskkill.exe /F /IM "1cv8c.exe"


iisreset /stop

SetLocal EnableDelayedExpansion

for /F "tokens=1 delims=;" %%a in ("%patharcall%") do set patharc=%%a

set ver1c="0"
FOR /f %%a IN ('dir /b /o:n /ad "C:\Program Files\1cv8"') DO (
       echo %%a|>nul find "8."&& set ver1c=%%a
)
set BinPathC="C:\Program Files\1cv8\!ver1c!\bin"
set cluster="0"


FOR /f %%a IN ('dir /b /o:n /ad "C:\Program Files\PostgreSQL"') DO (
       echo %%a|>nul find "."&& set verpg=%%a
)
set BinPathPG="C:\Program Files\PostgreSQL\!verpg!\bin"

set rs=0

rem Получаем день недели в переменной DayOfWeek
set "exec=wmic path win32_LocalTime get DayOfWeek /value"
for /f "tokens=1,2 delims==" %%i in ('%exec% ^| findstr "="') do set "%%i=%%j"


rem создаем для имени файла часть из даты
set dd=%DATE%
set tt=%TIME%

set /a ddd=%dd:~0,2%
 IF %ddd% LSS 10 (
 SET day=0%ddd%) else (
 SET day=%ddd%)
 set month=%dd:~3,2%
 set year=%dd:~6,4%

set /a ttt=%tt:~0,2%

IF %ttt% LSS 10 (
SET hour=0%ttt%) else (
SET hour=%ttt%)
SET minute=%tt:~3,2%
SET sec=%tt:~6,2%

rem в переменной namb хранится часть имени файла из даты
SET namb=%year%%month%%day%_%hour%%minute%%sec%

set namestart="0"
set basenamex=""
set basename="qwe"
set typebase="0"
set pahtbase=""
set serverbase=""
set postgresbase=""
set pathtrue="0"

for %%b in (%patharcall%) do (
                               set /A number=number+1
                               if !number! equ 1 set patharc=%%b
                               )
 rem Путь до файла со списком баз 1С в кодировке Windows 1251
 set newfile1c=%patharc%bases1c.txt
 rem Преобразуем файл списка баз в кодировку Windows 1251
 :: UTF-8 to Win-1251
 @chcp 65001>nul
 @<"%file1c%">"%newfile1c%" (for /f "delims=" %%i in ('find/v ""') do @chcp 1251>nul& set x=%%i& cmd/v/c echo !x!)
 chcp 1251 >nul

for /F "tokens=* delims=" %%i in (%newfile1c%) do (
        set sString=%%i
        if "!sString!" neq "!sString:[=!" (
                                           set namestart="1"
                                           set basename=""
                                           set typebase="0"
                                           set pahtbase=""
                                           set serverbase=""
                                           set postgresbase=""
                                           set pathtrue="0"
                                           )

        rem Начинаем сборку имени базы
        if !basename! == "" (
                             set basename=%%i
                             set basename=!basename:~0,-1!
                             set basename=!basename:~1!
                             if "!basename!" neq "!basename:[=!" set basename=!basename:~3!
                             )
        rem Закончилась сборка имени базы

        if "!sString!" neq "!sString:ws==!" (
                                                    set typebase="3"
                                                    set pahtbase=!sString:~12!
                                                    set pahtbase=!pahtbase:~0,-2!
                                                    set pathtrue="0"
                                                     )

        if "!sString!" neq "!sString:Srvr==!" (
                                                    set typebase="2"
                                                    set pahtbase=!sString:~14!
                                                    set pahtbase=!pahtbase:~0,-2!
                                                    set pathtrue="0"
                                                    for /F "tokens=2 delims=;" %%a in ("!pahtbase!") do set postgresbase=%%a
                                                    for /F "tokens=1 delims=;" %%a in ("!pahtbase!") do set serverbase=%%a
                                                    set serverbase=!serverbase:~0,-1!
                                                    set postgresbase=!postgresbase:~5!
                                                    set pathtrue="1"
                                                       )

        if "!sString!" neq "!sString:File==!" (
                                                    set typebase="1"
                                                    set pahtbase=!sString:~14!
                                                    set pahtbase=!pahtbase:~0,-2!
                                                    set pathtrue="1"
                                                       )

rem  Мы определили и имя базы и путь до базы при этом namestart="0" pathtrue="1"
rem  Можно создавать архивы
        if !pathtrue! equ "1" (
                               if !typebase! equ "1" (
                                                       rem создание выгрузки файловой базы
                                                       set number=0
                                                       for %%b in (%patharcall%) do (
                                                                 set /A number=number+1
                                                                 mkdir "%%b!basename!\День" "%%b!basename!\Неделя" "%%b!basename!\Месяц"
                                                                 if !number! equ 1 set patharc=%%b
                                                                                     )
                                                       cd %BinPathC%
                                                       if %fbasetype% equ 1 (
                                                       rem Создание выгрузки из 1С
                                                       set rashirenie=.dt
                                                       set filemane=!patharc!!basename!\День\!namb!-День-!basename!!rashirenie!
                                                       set pathfilename=!patharc!!basename!\День
                                                       cls
                                                       echo Идет создание выгрузки базы !basename!
                                                       1cv8 CONFIG /F"!pahtbase!" /N"%username%" /P"%userpw%" /DumpIB"!filemane!"
                                                                                )
                                                       if %fbasetype% equ 0 (
                                                       rem Создание архива папки базы
                                                       set rashirenie=.tar.gz
                                                       set filemane=!patharc!!basename!\День\!namb!-День-!basename!!rashirenie!
                                                       set pathfilename=!patharc!!basename!\День
                                                       cls
                                                       echo Идет создание архива базы !basename!
                                                       tar -cvvzf "!filemane!" -C "!pahtbase!" *
                                                                                )
                                                       rem теперь копируем созданную выгрузку во все папки с архивами
                                                       for %%b in (%patharcall%) do (
                                                       set pathfilename=%%b!basename!\День\
                                                       if !patharc! neq %%b copy /Z /Y "!filemane!" "!pathfilename!"
                                                       rem Удаляем из папке с бэкапами день все резервные копии кроме copysave последних
                                                       for /F "skip=%copysave% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
                                                       rem Теперь создаем недельные копии архивов
                                                       set pathfilename=%%b!basename!\Неделя\
                                                       rem Теперь непосредственно копируем
                                                       if %DayOfWeek% EQU %weekday% (
                                                                                     set filemanen2=%%b!basename!\Неделя\!namb!-Неделя-!basename!!rashirenie!
                                                                                     copy /Z /Y "!filemane!" "!filemanen2!"
                                                                                     )
                                                       rem Удаляем из папке с бэкапами неделя все резервные копии кроме copysave последних
                                                       for /F "skip=%copysave% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
                                                       rem Теперь создаем месячные копии архивов
                                                       set pathfilename=%%b!basename!\Месяц\
                                                       rem Теперь непосредственно копируем
                                                       if !day! EQU %monthday% (
                                                                                set filemanen2=%%b!basename!\Месяц\!namb!-Месяц-!basename!!rashirenie!
                                                                                copy /Z /Y "!filemane!" "!filemanen2!"
                                                                                )
                                                       rem Удаляем из папке с бэкапами месяц все резервные копии кроме copysave последних
                                                       for /F "skip=%copysave% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
                                                                                     )
                                                                                     
                                                      )

                               if !typebase! EQU "2" (
                                                       rem создание выгрузки файловой базы
                                                       set number=0
                                                       for %%b in (%patharcall%) do (
                                                                 set /A number=number+1
                                                                 mkdir "%%b!basename!\День" "%%b!basename!\Неделя" "%%b!basename!\Месяц"
                                                                 if !number! equ 1 set patharc=%%b
                                                                                     )
                                                       if %sbasetype% equ 1 (
                                                       rem Создание выгрузки из 1С
                                                       if %rs% equ 0 call :rss
                                                       cd %BinPathC%
                                                       set rashirenie=.dt
                                                       set filemane=!patharc!!basename!\День\!namb!-День-!basename!!rashirenie!
                                                       set pathfilename=!patharc!!basename!\День
                                                       for /L %%B in (0,1,1000) do (
                                                       for %%I in (^"!filemane!^") do set dumpsize=%%~zI
                                                       if !dumpsize! LEQ 0 (
                                                       call :resetuser
                                                       ping 127.0.0.1 -n 3 > nul
                                                       cls
                                                       echo Идет создание выгрузки базы !basename!
                                                       1cv8 CONFIG /S"!serverbase!\!postgresbase!"; /N"%username%" /P"%userpw%" /DumpIB"!filemane!"
                                                                            )
                                                                                     )
                                                                               )
                                                       if %sbasetype% equ 0 (
                                                       rem Создание backup-a средствами сервера баз данных
                                                       cd %BinPathPG%
                                                       set rashirenie=.dump
                                                       set filemane=!patharc!!basename!\День\!namb!-День-!basename!!rashirenie!
                                                       set pathfilename=!patharc!!basename!\День
                                                       for /L %%B in (0,1,1000) do (
                                                       for %%I in (^"!filemane!^") do set dumpsize=%%~zI
                                                       if !dumpsize! LEQ 0 (
                                                       ping 127.0.0.1 -n 3 > nul
                                                       cls
                                                       echo Идет создание дампа базы !basename!
                                                       if %sqltype% equ 1 pg_dump -Fc -Z 9 -U %userpg% --file="!filemane!" "!postgresbase!"
                                                       if %sqltype% equ 0 sqlcmd -S localhost -U %userpg% -P %passpg% -Q "BACKUP DATABASE [!postgresbase!] TO DISK = N'!filemane!' WITH NOFORMAT, NOINIT,  NAME = N'!postgresbase!-full', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10"
                                                                            )
                                                                                     )
                                                                               )
                                                       rem теперь копируем созданную выгрузку во все папки с архивами
                                                       for %%b in (%patharcall%) do (
                                                       set pathfilename=%%b!basename!\День\
                                                       if !patharc! neq %%b copy /Z /Y "!filemane!" "!pathfilename!"
                                                       rem Удаляем из папке с бэкапами день все резервные копии кроме copysave последних
                                                       for /F "skip=%copysave% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
                                                       rem Теперь создаем недельные копии архивов
                                                       set pathfilename=%%b!basename!\Неделя\
                                                       rem Теперь непосредственно копируем
                                                       if %DayOfWeek% EQU %weekday% (
                                                                                     set filemanen2=%%b!basename!\Неделя\!namb!-Неделя-!basename!!rashirenie!
                                                                                     copy /Z /Y "!filemane!" "!filemanen2!"
                                                                                     )
                                                       rem Удаляем из папке с бэкапами неделя все резервные копии кроме copysave последних
                                                       for /F "skip=%copysave% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
                                                       rem Теперь создаем месячные копии архивов
                                                       set pathfilename=%%b!basename!\Месяц\
                                                       rem Теперь непосредственно копируем
                                                       if !day! EQU %monthday% (
                                                                                set filemanen2=%%b!basename!\Месяц\!namb!-Месяц-!basename!!rashirenie!
                                                                                copy /Z /Y "!filemane!" "!filemanen2!"
                                                                                )
                                                       rem Удаляем из папке с бэкапами месяц все резервные копии кроме copysave последних
                                                       for /F "skip=%copysave% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
                                                                                     )
                                                       
                                                       )
                               )




        set pathtrue="0"
      
                                                                        )


iisreset

cls
echo Создание резервных копий баз завершено

mode con: cp select=866



exit

:resetuser

for /F "tokens=* delims=" %%i in ('rac.exe cluster list') do (
 echo %%i|>nul find "cluster"&& set b=%%i
)
for %%a in (!b!) do set cluster=%%a

echo !cluster!

rem Теперь непосредственно завершаем рабочие сессии на сервере 1С
echo Вот список сессий на сервере
set b=0
set session=0
for /F "tokens=* delims=" %%i in ('rac.exe session --cluster=!cluster!  list') do (
echo %%i|>nul find "session "&& for %%a in (%%i) do set b=%%a
    if !b! NEQ !session! (
                          set session=!b!
                          rac.exe session --cluster=!cluster! terminate --session=!session!
                          )
)
exit /b

:rss
set rs=1
set CtrlPort=1540
set AgentName=localhost
set RASPort=1545
set SrvcName="1C:Enterprise 8.3 Remote Server"
set BinPath="\"C:\Program Files\1cv8\!ver1c!\bin\ras.exe\" cluster --service --port=%RASPort% %AgentName%:%CtrlPort%"
set Desctiption="1C:Enterprise 8.3 Remote Server"
sc stop %SrvcName%
sc delete %SrvcName%
sc create %SrvcName% binPath= %BinPath% start= auto displayname= %Desctiption%
sc start %SrvcName% 
exit /b






Скачать готовый скрипт Создание резервных копий баз 1С Windows.cmd

А теперь для Linux:


#!/bin/bash
#*******************************************************************************************
#********************** Ввод первоначальных данных *****************************************
#*******************************************************************************************

# Переменная пути, где будут сохраняться выгрузки из баз
# Можно указать через ; несколько путей, в конце обязательно\
patharcall="/home/user/backup/;/home/user/backup1/"
# Переменная отвечает за день недели в который будет происходить создание недельной копии
# Понедельник - 1 ..... Воскресенье - 7
weekday="5"
# Переменная отвечает за день месяца в который будет происходить создание месячной копии
monthday="1"
# Переменная отвечает за то, сколько резервных копий оставлять
copysave=4
# Переменная задает тип сохранения для файловой базы
# 0 - архив папки, 1 - выгрузка 1С
fbasetype="1"
# Переменная задает тип сохранения для серверной базы
# 0 - дамп базы из сервера, 1 - выгрузка 1С
sbasetype="1"
# Переменная задает тип сервера базы данных
# 0 - MsSQL, 1 - posgresql
sqltype="1"
# Путь до файла со списком баз 1С
file1c=~/.1C/1cestart/ibases.v8i

#Имя пользователя к базам 1С для выгрузок
username="User1C"
#Пароль к пользователю баз 1С
userpw="passwordUser1C"
#Пароль sudo
sudopw="passwordsudo"

# Здесь переменные для подключения к серверу баз данных
# имя пользователя сервера баз данных
userpg=postgres
# пароль пользователя сервера баз данных
passpg=passwordpostgres

#*******************************************************************************************
#********************* Ввод первоначальных данных завершен *********************************
#*******************************************************************************************

copysave=$((copysave+1))

label1(){
#Завершаем работу всех сессий на сервере 1C
sudo /opt/1C/v8.3/x86_64/ras --daemon cluster
for cluster in $(sudo /opt/1C/v8.3/x86_64/rac cluster list | grep 'cluster'); do
if [ "$cluster" != 'cluster' ] &&  [ "$cluster" != ':' ];
then
echo $cluster
fi
done
#Теперь непосредственно завершаем рабочие сессии на сервере 1С
echo 'Вот список сессий на сервер:'
i="0"
for sessionserver in $(sudo /opt/1C/v8.3/x86_64/rac session --cluster=$cluster  list); do
if [ "$sessionserver" == 'session' ];
then
i="0"
else
let "i += 1"
if [ "$i" == "2" ];
         then
         sudo /opt/1C/v8.3/x86_64/rac session --cluster=$cluster terminate --session=$sessionserver
         echo $sessionserver
         fi
fi
done
}

#Отключаем apache, что бы выкинуть пользователей 1С
echo $sudopw | sudo -S service apache2 stop

#Убиваем запущенные процессы 1С
echo $sudopw | sudo -S killall -SIGKILL 1cv8c
echo $sudopw | sudo -S service srv1cv83 restart


# Устанавливаем дату
DATA=`date +"%Y-%m-%d_%H-%M"`
DAY=$(date +"%d")
DOW=$(date +%u)


namestart="0"
basenamex=""
basename=""
typebase=""
pahtbase=""
serverbase=""
postgresbase=""
pathtrue="0"
#Читаем файл записей баз 1С
while read LINE
 do

    if [[ $LINE =~ "[" ]]
    then
        namestart="1"
        basename=""
        typebase=""
        pahtbase=""
        serverbase=""
        postgresbase=""
        pathtrue="0"
    fi

#Начинаем сборку имени базы   
if [[ $basename == "" ]]
then

  if [[ $namestart == "0" ]]
    then
        echo $LINE
    else
        basenamex="$basenamex $LINE"
    fi
    
  if [[ $LINE =~ "]" ]]
    then
        namestart="0"
        basename=${basenamex:2}
        basename=${basename::-2}
        if [[ $basename =~ "[" ]]
           then
               basename=${basename:1}
           fi
        echo $basename
	basenamex=""
    fi
fi 
#Закончилась сборка имени базы

    if [[ $LINE =~ "Connect=ws=" ]]
    then
        typebase="3"
        pahtbase=${LINE:12}
        pahtbase=${pahtbase::-3}
        pathtrue="0"
    fi

    if [[ $LINE =~ "Connect=Srvr=" ]]
    then
        typebase="2"
        pahtbase=${LINE:14}
        pahtbase=${pahtbase::-3}
        serverbase=${pahtbase%'"'*}
        serverbase=${serverbase::-6}
        serverbase=$serverbase'\'
        postgresbase=${pahtbase#*'"'}
        postgresbase=${postgresbase:6}
        pathtrue="1"
    fi
    
    if [[ $LINE =~ "Connect=File=" ]]
    then
        typebase="1"
        pahtbase=${LINE:14}
        pahtbase=${pahtbase::-3}
        pathtrue="1"
    fi
# Мы определили и имя базы и путь до базы при этом namestart="0" pathtrue="1"
#Можно создавать архивы

if [ "$namestart" = '0' ] && [ "$pathtrue" = '1' ];
then
       case $typebase in
                       1)
                          
                          IFS=';' read -ra my_array <<< "$patharcall"
                          # Печать разделенной строки
                          for i in "${my_array[@]}"
                          do
                              mkdir -p "$i$basename/День" "$i$basename/Неделя" "$i$basename/Месяц"
                          done
                          patharc=${my_array[0]}
                          if [ "$fbasetype" = '0' ];
                          then
                              echo "создаем архивную копию папки с базой"
                              rashirenie=.tar.gz
                              filemane=$patharc$basename/День/$DATA-День-$basename$rashirenie
                              pathfilename=$patharc$basename/День
                              find "$pahtbase/" -printf "%P\n" -type f -o -type l -o -type d | tar -cvzf "$filemane" --no-recursion -C "$pahtbase/" -T -
                          else
                              echo "создаем выгрузку файловой базы"
                              rashirenie=.dt
                              filemane=$patharc$basename/День/$DATA-День-$basename$rashirenie
                              pathfilename=$patharc$basename/День
                              /opt/1C/v8.3/x86_64/1cv8 CONFIG /F"$pahtbase" /N"$username" /P"$userpw" /DumpIB"$filemane"
                          fi
                          # теперь копируем созданную выгрузку во все папки с архивами
                          for i in "${my_array[@]}"
                          do
                              # Разбираемся с дневными копиями
                              pathfilename=$i$basename/День
                              filemanen=$i$basename/День/$DATA-День-$basename$rashirenie
                              if [ "$patharc" != "$i" ];
                              then
                                  cp "$filemane" "$filemanen"
                              fi
                              #Оставляем в папке с бэкапами день только copysave резервных копий
                              #find "$pathfilename" -type f -mtime +4 -exec rm -rf {} \;
                              find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysave | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
                              # Разбираемся с недельными копиями
                              pathfilename=$i$basename/Неделя
                              filemanen=$i$basename/Неделя/$DATA-Неделя-$basename$rashirenie
                              if [ "$DOW" = "$weekday" ];
                              then
                                  cp "$filemane" "$filemanen"
                              fi
                              #Оставляем в папке с бэкапами неделя только copysave резервных копий
                              #find "$pathfilename" -type f -mtime +28 -exec rm -rf {} \;
                              find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysave | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
                              # Разбираемся с месячными копиями
                              pathfilename=$i$basename/Месяц
                              filemanen=$i$basename/Месяц/$DATA-Месяц-$basename$rashirenie
                              if [ "$DAY" = "$monthday" ];
                              then
                                  cp "$filemane" "$filemanen"
                              fi
                              #Оставляем в папке с бэкапами месяц только copysave резервных копий
                              #find "$pathfilename" -type f -mtime +112 -exec rm -rf {} \;
                              find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysave | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
                          done
                        ;;





                       2)
                          IFS=';' read -ra my_array <<< "$patharcall"
                          # Печать разделенной строки
                          for i in "${my_array[@]}"
                          do
                              mkdir -p "$i$basename/День" "$i$basename/Неделя" "$i$basename/Месяц"
                          done
                          patharc=${my_array[0]}
                          if [ "$sbasetype" = '0' ];
                          then
                              echo "создаем выгрузку базы из postgressql"
                              rashirenie=.dump
                              filemane=$patharc$basename/День/$DATA-День-$basename$rashirenie
                              pathfilename=$patharc$basename/День
                              var1=100
                              while [ $var1 -gt 0 ]
                              do
                              var1=$[ $var1 - 1 ]
                              if [ "$sqltype" = '1' ];
                              then
                                  PGPASSWORD=$sudopw pg_dump -Fc -Z 9 -U $userpg --file="$filemane" $postgresbase
                              else
                                  sqlcmd -S localhost -U $userpg -P $passpg -Q "BACKUP DATABASE [$postgresbase] TO DISK = N'$filemane' WITH NOFORMAT, NOINIT,  NAME = N'$postgresbase-full', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10"
                              fi
                              if [ $(du -k "$filemane" | cut -f 1) -ge 0 ]; then
                              var1=0
                              fi
                              done
                              
                          else
                              echo "создаем выгрузку базы с сервера 1С"
                              label1;
                              rashirenie=.dt
                              filemane=$patharc$basename/День/$DATA-День-$basename$rashirenie
                              pathfilename=$patharc$basename/День
                              var1=100
                              while [ $var1 -gt 0 ]
                              do
                              var1=$[ $var1 - 1 ]
                              /opt/1C/v8.3/x86_64/1cv8 CONFIG /S"$serverbase$postgresbase" /N"$username" /P"$userpw" /DumpIB"$filemane"
                              if [ $(du -k "$filemane" | cut -f 1) -ge 0 ]; then
                              var1=0
                              fi
                              done
                          fi
                          # теперь копируем созданную выгрузку во все папки с архивами
                          for i in "${my_array[@]}"
                          do
                              # Разбираемся с дневными копиями
                              pathfilename=$i$basename/День
                              filemanen=$i$basename/День/$DATA-День-$basename$rashirenie
                              if [ "$patharc" != "$i" ];
                              then
                                  cp "$filemane" "$filemanen"
                              fi
                              #Оставляем в папке с бэкапами день только copysave резервных копий
                              #find "$pathfilename" -type f -mtime +4 -exec rm -rf {} \;
                              find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysave | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
                              # Разбираемся с недельными копиями
                              pathfilename=$i$basename/Неделя
                              filemanen=$i$basename/Неделя/$DATA-Неделя-$basename$rashirenie
                              if [ "$DOW" = "$weekday" ];
                              then
                                  cp "$filemane" "$filemanen"
                              fi
                              #Оставляем в папке с бэкапами неделя только copysave резервных копий
                              #find "$pathfilename" -type f -mtime +28 -exec rm -rf {} \;
                              find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysave | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
                              # Разбираемся с месячными копиями
                              pathfilename=$i$basename/Месяц
                              filemanen=$i$basename/Месяц/$DATA-Месяц-$basename$rashirenie
                              if [ "$DAY" = "$monthday" ];
                              then
                                  cp "$filemane" "$filemanen"
                              fi
                              #Оставляем в папке с бэкапами месяц только copysave резервных копий
                              #find "$pathfilename" -type f -mtime +112 -exec rm -rf {} \;
                              find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysave | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
                          done

                        ;;
       
       esac

    pathtrue="0"
fi
#Резервная копия создана
    
  shift 1
 done < $file1c

#Включаем apache, что бы восстановить работу 1С
echo "$sudopw" | sudo -S service apache2 start


Скачать готовый скрипт Создание резервных копий баз 1С Linux.sh

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

Так же для удобства работы можно создать отдельно скрипты для завершения зависших сеансов пользователей на сервере 1С. Можно им так же воспользоваться когда сколько не проси пользователей выйти с сервера, а они пропускают это мимо ушей.

Для Windows:

@echo off
SetLocal EnableDelayedExpansion
set ver1c="0"
FOR /f %%a IN ('dir /b /o:n /ad "C:\Program Files\1cv8"') DO (
       echo %%a|>nul find "8."&& set ver1c=%%a
)

set CtrlPort=1540
set AgentName=localhost
set RASPort=1545
set SrvcName="1C:Enterprise 8.3 Remote Server"
set BinPath="\"C:\Program Files\1cv8\!ver1c!\bin\ras.exe\" cluster --service --port=%RASPort% %AgentName%:%CtrlPort%"
set Desctiption="1C:Enterprise 8.3 Remote Server"
sc stop %SrvcName%
sc delete %SrvcName%
sc create %SrvcName% binPath= %BinPath% start= auto displayname= %Desctiption%
sc start %SrvcName% 

set BinPath="C:\Program Files\1cv8\!ver1c!\bin"
set cluster="0"
cd %BinPath%
for /F "tokens=* delims=" %%i in ('rac.exe cluster list') do (
 echo %%i|>nul find "cluster"&& set b=%%i
)
for %%a in (!b!) do set cluster=%%a

echo !cluster!

rem Теперь непосредственно завершаем рабочие сессии на сервере 1С
echo Вот список сессий на сервере
set b=0
set session=0
for /F "tokens=* delims=" %%i in ('rac.exe session --cluster=!cluster!  list') do (
echo %%i|>nul find "session "&& for %%a in (%%i) do set b=%%a
    if !b! NEQ !session! (
                          set session=!b!
                          rac.exe session --cluster=!cluster! terminate --session=!session!
                          )
)

Скачать готовый скрипт Завершить все сеансы на сервере 1С Windows.cmd

Для Linux:

#!/bin/bash

#Завершаем работу всех сессий на сервере 1C
sudo /opt/1C/v8.3/x86_64/ras --daemon cluster
for cluster in $(sudo /opt/1C/v8.3/x86_64/rac cluster list | grep 'cluster'); do
if [ "$cluster" != 'cluster' ] &&  [ "$cluster" != ':' ];
then
echo $cluster
fi
done
#Теперь непосредственно завершаем рабочие сессии на сервере 1С
echo 'Вот список сессий на сервер:'
i="0"
for sessionserver in $(sudo /opt/1C/v8.3/x86_64/rac session --cluster=$cluster  list); do
if [ "$sessionserver" == 'session' ];
then
i="0"
else
let "i += 1"
if [ "$i" == "2" ];
         then
         sudo /opt/1C/v8.3/x86_64/rac session --cluster=$cluster terminate --session=$sessionserver
         echo $sessionserver
         fi
fi
done

Скачать готовый скрипт Завершить все сеансы на сервере 1С.sh

Ну и наконец для Linux работа по созданию (удалению) баз для 1С не очень приятный процесс, по этому вот еще пара скриптов для удобства работы (для postgresql):

Скрипт для создания базы на сервере 1С:

#!/bin/bash
sudo /opt/1C/v8.3/x86_64/ras --daemon cluster
for cluster in $(sudo /opt/1C/v8.3/x86_64/rac cluster list | grep 'cluster'); do
if [ "$cluster" != 'cluster' ] &&  [ "$cluster" != ':' ];
then
echo $cluster
fi
done

echo 'Вот список баз которые уже существуют на сервер:'
for name in $(sudo /opt/1C/v8.3/x86_64/rac infobase --cluster=$cluster  summary list | grep 'name'); do
if [ "$name" != 'name' ] &&  [ "$name" != ':' ];
then
echo $name
fi
done

echo 'Введите имя создаваемой базы:'
read B
echo 'Введите пароль от пользователя postgres:'
read PW
sudo /opt/1C/v8.3/x86_64/rac infobase --cluster=$cluster create --create-database --name=$B --dbms=PostgreSQL --db-server=localhost --db-name=$B --locale=ru --db-user=postgres --db-pwd=$PW --license-distribution=allow

echo 'Вот обновленный список баз которые уже существуют на сервер:'
for name in $(sudo /opt/1C/v8.3/x86_64/rac infobase --cluster=$cluster  summary list | grep 'name'); do
if [ "$name" != 'name' ] &&  [ "$name" != ':' ];
then
echo $name
fi
done

Скачать готовый скрипт CreatBase1C.sh

А вот скрипт для удаления базы с сервера 1С:

#!/bin/bash
sudo /opt/1C/v8.3/x86_64/ras --daemon cluster
for cluster in $(sudo /opt/1C/v8.3/x86_64/rac cluster list | grep 'cluster'); do
if [ "$cluster" != 'cluster' ] &&  [ "$cluster" != ':' ];
then
echo $cluster
fi
done

echo 'Вот список баз которые уже существуют на сервер:'
for name in $(sudo /opt/1C/v8.3/x86_64/rac infobase --cluster=$cluster  summary list | grep 'name'); do
if [ "$name" != 'name' ] &&  [ "$name" != ':' ];
then
echo $name
fi
done

echo 'Введите имя Удаляемой базы:'
read B
echo 'Введите пароль от пользователя postgres:'
read PW
i=''
for name in $(sudo /opt/1C/v8.3/x86_64/rac infobase --cluster=$cluster  summary list | grep 'name\|infobase'); do
if [ "$name" != 'name' ] &&  [ "$name" != ':' ] &&  [ "$name" != 'infobase' ];
then
if [ "$name" == "$B" ];
then
infobase=$i
fi
i=$name
echo $name
fi
done
echo $infobase
sudo /opt/1C/v8.3/x86_64/rac infobase --cluster=$cluster drop --infobase=$infobase
#sudo /opt/1C/v8.3/x86_64/rac infobase --cluster=$cluster create --create-database --name=$B --dbms=PostgreSQL --db-server=localhost --db-name=$B --locale=ru --db-user=postgres --db-pwd=$PW --license-distribution=allow

echo 'Вот обновленный список баз которые уже существуют на сервер:'
for name in $(sudo /opt/1C/v8.3/x86_64/rac infobase --cluster=$cluster  summary list | grep 'name'); do
if [ "$name" != 'name' ] &&  [ "$name" != ':' ];
then
echo $name
fi
done

Скачать готовый скрипт DelBase1C.sh

Конечно у этих скриптов есть свои минусы, ну например для Linux систем в скрипте явно указывается пароль от sudo пользователя, но это можно решить если позволить выбранному пользователю работать со службами, логика скрипта при этом не меняется.

Так же в скрипте для Windows используется переключение кодовой страницы mode con: cp select=1251 и mode con: cp select=866. Это сделано для корректной работы с кириллицей, но иногда возникает обратная ситуация, тогда эти строки нужно закомментировать.