последнее редактирование 2022 10 22 (правка скрипта, добавлена возможность использования автономного сервера 1с (используется поумолчанию при создании выгрузок 1С для серверного варианта), возможности задания отдельного сервера баз данных при выгрузке используя автономный сервер, так же если по какой то причине выгрузка через автономный сервер не прошла, то делается попытка создать выгрузку используя конфигуратор ).

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

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

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

По сути ничего сложного в решении данной задачи нет. Организовать создание архивной копии папки (для файлового варианта работы 1С), или создать дамп базы (для серверного варианта работы 1С), или же сделать выгрузку базы штатными средствами самой 1С (для любого варианта 1С) процесс вполне тривиальный и решается достаточно просто в любой из систем. В качестве архивных копий легче всего использовать формат *.tar.gz, так как данный архив полностью поддерживается в любой системе изначально, ни чего доустанавливать не нужно (для Windows 10). В случае же использования более старой ОС Windows (паример Windows 2012 Server) лучше прибегнуть к средствам PowerShell и создать обычный zip архив. Ну и конечно же можно все таки и установить стороннее ПО — 7-Zip например (потому что бесплатен) и создавать архивы с его помощью. По умолчанию в скрипте используется именно этот метод.

Плюс ко всему, фирма 1С создала приложения командной строки rac/ras, благодаря которым можно управлять сеансами на сервере, самое главное — отключать зависшие сеансы. И теперь все эти функции можно выполнять автоматически. Более того, начиная с 14 релиза в 1С есть такое понятие как автономный сервер, здесь я не стану рассматривать его возможностей, но для решения нашей задачи у него есть замечательный инструмент ibcmd, который много чего позволяет делать, но самое главное, в данном случае, позволяет делать выгрузку базы в .dt формате сразу с сервера баз данных, что позволяет не «выбрасывать» работающих пользователей. А вот и конструкция вызова создания выгрузки: ibcmd infobase dump —db-server=localhost —dbms=MSSQLServer —db-name=sb_demo —db-user=test_db_user —db-pwd=test_pwd_123 —user=user1c —password=pass_1c «%tmp%\sb_demo.dt» (для платформы выше 8.3.17) или же ibcmd infobase dump —db-server=localhost —dbms=MSSQLServer —db-name=sb_demo —db-user=test_db_user —db-pwd=test_pwd_123 «%tmp%\sb_demo.dt» (для платформ от 8.3.14 до 8.3.17 включительно). В конструкции указаны конкретные значения, но я думаю, что по записи соорентироваться не сложно, что и куда. Но если не понятно, то на просторах интернета всё можно найти, как вариант вот здесь, а точнее во второй части — здесь.

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

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

А теперь собственно говоря сами скрипты для выполнения данных задач, в нем нужно лишь подправить (если будет нужно) переменные в разделе «Ввод начальных данных» :

Для Windows:

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

mode con: cp select=1251
rem Переменная пути, где будут сохраняться выгрузки из баз
rem Можно указать через ; несколько путей, в конце обязательно\
set patharcall=D:\ARC\;E:\ARC\

rem Путь до файла со списком баз 1С
set file1c=%APPDATA%\1C\1CEStart\ibases.v8i

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

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

rem Переменная отвечает за день недели в который будет происходить создание недельной копии
rem Понедельник - 1 ..... Воскресенье - 7
set weekday=5
rem Переменная отвечает за день месяца в который будет происходить создание месячной копии
set monthday=01
rem Переменная отвечает за то, сколько резервных копий оставлять
set copysave=4
rem Переменная задает тип сохранения для файловой базы
rem 0 - архив папки, 1 - выгрузка 1С
set fbasetype=0
rem Использовать архиватор 7-Zip
rem если 1, то использовать, если что то другое - то не использовать
set zip7=1
rem Переменная задает тип сохранения для серверной базы
rem 0 - дамп базы из сервера, 1 - выгрузка 1С
set sbasetype=1
rem Переменная задает тип сервера базы данных
rem 0 - MsSQL, 1 - posgresql
set sqltype=0
rem Переменная задает имя сервера баз, если она здесь не задана, то считается, что
rem сервер баз данных и сервер 1с это одно и тоже, задается без кавычек, просто имя
set servbd=""
rem Переменная задает количество попыток выгрузок баз 1С, если что то пошло не так
set popytok=5
rem Переменная указывает по какому пити искать установленные 1С
rem может принимать значения Program Files   или   Program Files (x86)
set pathprogram1C=Program Files
rem Переменная указывает на использование конкретной версии 1с, задается без кавычек
rem например 8.3.15.1830, если же версия не задана, то должны стоять кавычки ""
set ispolzovatvers=""
rem Переменная указывает на то, какой веб сервер используется
rem 0 - IIS, 1 - Apache
set webserv=0
rem Переменная содержит имя пула IIS для выгружаемой 1С,
rem что бы не выгружать полностью веб сервер, да работает так более надежно
set pooliis=DefaultAppPool



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


rem Определим, является ли операционка Windows 10

VER | FINDSTR /IL "10.0" > NUL
IF %ERRORLEVEL% EQU 0 (SET win10=1) ELSE (SET win10=0)

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

SetLocal EnableDelayedExpansion

set wwwstopflag=0

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

rem Проверим задана ли конкретная версия 1С и существует ли она, если нет то будем искать существующую
set ver1c=0
if !ispolzovatvers! neq "" (
                            if exist "C:\%pathprogram1C%\1cv8\!ispolzovatvers!\bin\1cv8.exe" (set ver1c=!ispolzovatvers!)
                            )
if !ver1c! equ 0 (
                  FOR /f %%a IN ('dir /b /o:n /ad "C:\%pathprogram1C%\1cv8"') DO (
                                                                                  echo %%a|>nul find "8."&& set ver1c=%%a
                                                                                  )
                 )
rem Выделяем из версии номер версии 1С
set ver1crel=!ver1c:~4,-5!

set BinPathC="C:\%pathprogram1C%\1cv8\!ver1c!\bin"
set cluster="0"
set racpath="C:\%pathprogram1C%\1cv8\!ver1c!\bin\rac.exe"
set raspath="C:\%pathprogram1C%\1cv8\!ver1c!\bin\ras.exe"

rem Зададим возможность использовать автосервер 1с
set fileibcmd="C:\%pathprogram1C%\1cv8\!ver1c!\bin\ibcmd.exe"
set avtserver1c="0"

if exist !fileibcmd! (
   set avtserver1c="1"
   ) else (
   set avtserver1c="0"
   )

rem Определимся с типом сервера баз данных для автосервера
set sqltypestr="PostgreSQL"
if !sqltype! LEQ 0  (
                     set sqltypestr="MSSQLServer"
                     )

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"


call :datatime


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 newfile1c1=%patharc%bases1c1.txt
set newfile1c=%patharc%bases1c.txt

(
chcp 65001
cmd/u/c type %file1c% >%newfile1c1%
chcp 1251
)


type %newfile1c1% >%newfile1c%


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" if !pathtrue! equ "1" ( 
                                                       call :datatime
                                                       rem Освободим базы от подключенных 1С
                                                       call :freebases
                                                       call :wwwstop
                                                       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
                                                       chcp 866
                                                       echo Идет создание выгрузки базы !basename!
                                                       chcp 1251
                                                       1cv8 CONFIG /F"!pahtbase!" /N"%username%" /P"%userpw%" /DumpIB"!filemane!"
                                                                             )
                                                       if %fbasetype% equ 0 ( 
                                                       rem Создание архива папки базы
                                                       if %win10% equ 1 if %zip7% neq 1 set rashirenie=.tar.gz
                                                       if %win10% neq 1 set rashirenie=.zip
                                                       if %zip7% equ 1 set rashirenie=.zip
                                                       set filemane=!patharc!!basename!\День\!namb!-День-!basename!!rashirenie!
                                                       set pathfilename=!patharc!!basename!\День
                                                       cls
                                                       chcp 866
                                                       echo Идет создание архива базы !basename!
                                                       chcp 1251
                                                       if %zip7% equ 1 "C:\Program Files\7-Zip\7z.exe" a -tzip -mx3 -ssw -r0 """!filemane!""" """!pahtbase!"""
                                                       if %zip7% neq 1 if %win10% neq 1 powershell "Add-Type -Assembly """System.IO.Compression.FileSystem""" ;[System.IO.Compression.ZipFile]::CreateFromDirectory("""!pahtbase!""", """!filemane!""");"
                                                       if %zip7% neq 1 if %win10% equ 1 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 %DD% 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" if !pathtrue! equ "1" ( 
                                                       call :datatime
                                                       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С
                                                       cd %BinPathC%
                                                       set rashirenie=.dt
                                                       set filemane=!patharc!!basename!\День\!namb!-День-!basename!!rashirenie!
                                                       set pathfilename=!patharc!!basename!\День
                                                       for /L %%B in (0,1,%popytok%) do (
                                                       for %%I in (^"!filemane!^") do set dumpsize=%%~zI
                                                       if !dumpsize! LEQ 0 (
                                                       chcp 866
                                                       echo Идет создание выгрузки базы !basename!
                                                       chcp 1251
                                                       rem Разберемся с сервером баз данных, если он задан то он такой, если нет, то он как сервер 1с
                                                       if !servbd! EQU "" (
                                                                           for /F "tokens=1 delims=:" %%a in ("!serverbase!") do set srvbd=%%a
                                                                           ) else (set srvbd=!servbd!)
                                                       if !avtserver1c! EQU "1" (
                                                            if !ver1crel! GTR 17 (
                                                                                  !fileibcmd! infobase dump --db-server=!srvbd! --dbms=!sqltypestr! --db-name=!postgresbase! --db-user=!userpg!  --db-pwd=!passpg! --user=!username! --password=!userpw! "!filemane!"
                                                                                  ) else (
                                                                                          !fileibcmd! infobase dump --db-server=!srvbd! --dbms=!sqltypestr! --db-name=!postgresbase! --db-user=!userpg!  --db-pwd=!passpg! "!filemane!"
                                                                                          )
                                                                                  )

                                                                            )
                                                                                     )
                                                       rem Если создание выгрузок через автономный сервер провалилось или невозможно сделать,
                                                       rem то делаем по старинке, через конфигуратор
                                                       for /L %%B in (0,1,%popytok%) do (
                                                       for %%I in (^"!filemane!^") do set dumpsize=%%~zI
                                                       if !dumpsize! LEQ 0 (
                                                       rem Освободим базы от подключенных 1С
                                                       call :freebases
                                                       call :wwwstop
                                                       if %rs% equ 0 call :rss
                                                       call :resetuser
                                                       ping 127.0.0.1 -n 3 > nul
                                                       cls
                                                       chcp 866
                                                       echo Идет создание выгрузки базы !basename!
                                                       chcp 1251
                                                       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,%popytok%) do (
                                                       for %%I in (^"!filemane!^") do set dumpsize=%%~zI
                                                       if !dumpsize! LEQ 0 (
                                                       ping 127.0.0.1 -n 3 > nul
                                                       cls
                                                       chcp 866
                                                       echo Идет создание дампа базы !basename!
                                                       chcp 1251
                                                       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 %DD% 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"
                               )

    
                                                   )


if %wwwstopflag% equ 1 (
rem iisreset
rem запускаем pool 1С на IIS
if %webserv% equ 1 (net start apache) else (%windir%\system32\inetsrv\appcmd start apppool /apppool.name:"%pooliis%")
                        )

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


exit

:resetuser

for /F "tokens=* delims=" %%i in ('!racpath! 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 ('!racpath! 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!
                          !racpath! 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


:datatime
rem создаем для имени файла часть из даты
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%%Min%-%Sec%"
rem в переменной namb хранится часть имени файла из даты
set namb=%fullstamp%
exit /b


:freebases
rem Закрываем открытые 1С
taskkill.exe /F /IM "1cv8.exe"
taskkill.exe /F /IM "1cv8c.exe"
rem Закрываем веб сеансы
rem taskkill.exe /F /IM "w3wp.exe"
rem Закрываем открытые по сети файлы
net session /delete /y
exit /b

:wwwstop
rem Отключим pool 1С на IIS
if %wwwstopflag% equ 0 (
if %webserv% equ 1 (net stop apache) else (%windir%\system32\inetsrv\appcmd stop apppool /apppool.name:"%pooliis%")
set wwwstopflag=1
                         )
exit /b

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

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

#!/bin/bash
#DISPLAY=:99.0 LANG=ru_RU.UTF-8 XAUTHORITY=/home/ceasar/.Xauthority /home/ceasar/ARC1C.sh
#DISPLAY=:99.0 LANG=ru_RU.UTF-8 /home/ceasar/ARC1C.sh
#Автономный сервер для выгрузки баз 1с
#ibcmd infobase dump --db-server=localhost --dbms=MSSQLServer --db-name=sb_demo --db-user=test_db_user --db-pwd=test_pwd_123 --user=user1c --password=pass_1c "%tmp%\sb_demo.dt"
#*******************************************************************************************
#********************** Ввод первоначальных данных *****************************************
#*******************************************************************************************

# Переменная пути, где будут сохраняться выгрузки из баз
# Можно указать через ; несколько путей, в конце обязательно\
patharcall="/media/ARC/ARC/;/media/sf_ARC/"

# Путь до файла со списком баз 1С
file1c=~/.1C/1cestart/ibases.v8i

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

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

# Переменная отвечает за день недели в который будет происходить создание недельной копии
# Понедельник - 1 ..... Воскресенье - 7
weekday="5"
# Переменная отвечает за день месяца в который будет происходить создание месячной копии
monthday="01"
# Переменная отвечает за то, сколько резервных копий оставлять
copysave=4
# Переменная задает тип сохранения для файловой базы
# 0 - архив папки, 1 - выгрузка 1С
fbasetype="1"
# Переменная задает тип сохранения для серверной базы
# 0 - дамп базы из сервера, 1 - выгрузка 1С
sbasetype="1"
# Переменная задает тип сервера базы данных
# 0 - MsSQL, 1 - posgresql
sqltype="1"
# Переменная задает имя сервера баз, если она здесь не задана, то считается, что
# сервер баз данных и сервер 1с это одно и тоже, задается без кавычек, просто имя
servbd=""
# Переменная указывает на использование конкретной версии 1с, задается в кавычках
# например "8.3.15.1830", если же версия не задана, то должны стоять кавычки ""
ispolzovatvers=""
# Переменная задает будет ли проводиться очистка базы данных от логов
# 0 - очистка не проводится, 1 - очистка проводится
clearbd="0"
# Переменная задает будет ли проводиться реиндексация базы
# 0 - реиндексация не проводится, 1 - реиндексация проводится
reindex="0"
#Переменная задает возможность полного доступа к созданным файлам для других пользователей
#  0 - не полный доступ, 1 - полный доступ
fullaccess="1"
#Сколько сделать попыток выгрузки из базы при создании выгрузки
popytki=5


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

# Проверим задана ли конкретная версия 1С и существует ли она, если нет то будем искать существующую
vers=""
if [ "$ispolzovatvers" != '' ];
then
              # Проверим наличие 1с такой версии
              if [ $(du -k "/opt/1cv8/x86_64/$ispolzovatvers/1cv8" | cut -f 1) -ge 0 ];
                              then
                              vers=$ispolzovatvers
              fi
fi

#Определяем максимально установленную версию 1С
if [ "$vers" = '' ];
then
for name in $(find /opt/1cv8/x86_64 -maxdepth 1 | sort );
do
vers="1"
vers=${name:17}
done
fi

if [ "$vers" != '' ];
then
versrel=${vers:4}
versrel=${versrel::-5}
else
versrel="15"
fi

#Определяем путь до 1С
if [ "$vers" = '' ];
then
path1c="/opt/1C/v8.3/x86_64"
else
path1c="/opt/1cv8/x86_64/$vers"
fi

#Определим параметры для автосервера 1С
if [[ $sqltype == "1" ]]
    then
        sqltypestr="PostgreSQL"
    else
        sqltypestr="MSSQLServer"
    fi

# Проверим можно ли использовать автономный сервер
if [ $(du -k "$path1c/ibcmd" | cut -f 1) -ge 0 ];
                              then
                              avtserver1c="1"
                              else
                              avtserver1c="0"
                              fi
# Переменная avtserver1c задает режим использования автономного сервера 1С
# 0 - не использовать, 1 - использовать


copysave=$((copysave+1))

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

apachestop="0"

label2(){
#Отключаем apache, что бы выкинуть пользователей 1С
if [[ $apachestop == "0" ]]
    then
        echo $sudopw | sudo -S service apache2 stop
        sudo systemctl stop apache2
        apachestop="1"
    fi
}

label3(){
#Убиваем все 1С, запущенные на сервере
echo $sudopw | sudo -S killall -SIGKILL 1cv8
echo $sudopw | sudo -S killall -SIGKILL 1cv8c
echo $sudopw | sudo -S killall -SIGKILL 1cv8s
echo $sudopw | sudo -S service srv1cv83 restart
}

# Устанавливаем дату
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
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)
                          # Устанавливаем дату
			  DATA=`date +"%Y-%m-%d_%H-%M-%S"`
                          IFS=';' read -ra my_array <<< "$patharcall"
                          # Печать разделенной строки
                          for i in "${my_array[@]}"
                          do
                              mkdir -p "$i$basename/День" "$i$basename/Неделя" "$i$basename/Месяц"
			      chmod -R 777 "$i$basename/День"
			      chmod -R 777 "$i$basename/Неделя"
			      chmod -R 777 "$i$basename/Месяц"
                          done
                          patharc=${my_array[0]}
                          if [ "$fbasetype" = '0' ];
                          then
                              label2;
                              label3;
                              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
                              label2;
                              label3;
                              echo "создаем выгрузку файловой базы"
                              rashirenie=.dt
                              filemane=$patharc$basename/День/$DATA-День-$basename$rashirenie
                              pathfilename=$patharc$basename/День
                              $path1c/1cv8 CONFIG /F"$pahtbase" /N"$username" /P"$userpw" /DumpIB"$filemane"
                          fi
                          # теперь копируем созданную выгрузку во все папки с архивами
                          if  [ "$fullaccess" = '1' ];
                                  then
                                      #Если выбран полный доступ для всех
				      chmod 777 "$filemane"
                          fi
                          for i in "${my_array[@]}"
                          do
                              # Разбираемся с дневными копиями
                              pathfilename=$i$basename/День
                              filemanen=$i$basename/День/$DATA-День-$basename$rashirenie
                              if [ "$patharc" != "$i" ];
                              then
                                  cp "$filemane" "$filemanen"
                                  if  [ "$fullaccess" = '1' ];
                                  then
                                      #Если выбран полный доступ для всех
				      chmod 777 "$filemane"
                                  fi
                              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"
                                  chmod 777 "$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"
                                  chmod 777 "$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)
                          # Устанавливаем дату
			  DATA=`date +"%Y-%m-%d_%H-%M-%S"`
                          IFS=';' read -ra my_array <<< "$patharcall"
                          # Печать разделенной строки
                          for i in "${my_array[@]}"
                          do
                              mkdir -p "$i$basename/День" "$i$basename/Неделя" "$i$basename/Месяц"
			      chmod -R 777 "$i$basename/День"
			      chmod -R 777 "$i$basename/Неделя"
			      chmod -R 777 "$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=$popytki
                              while [ $var1 -gt 0 ]
                              do
                              var1=$[ $var1 - 1 ]
                              if [ "$sqltype" = '1' ];
                              then
				  sudo -H -u $userpg pg_dump -F c -Z 9 -U $userpg --file="$filemane" $postgresbase
                                  #PGPASSWORD=$sudopw pg_dump -F c -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
                              #Проводим очистку и реиндексацию базы для PostgreSQL
                              if [ "$DOW" = "$weekday" ];
                              then
			         #Проводим очистку и реиндексацию базы для PostgreSQL
                                  if  [ "$clearbd" = '1' ] && [ "$sqltype" = '1' ];
                                  then
                                      #Проводим очистку базы
				      echo "Проводим очистку базы: "$postgresbase
				      sudo -H -u $userpg vacuumdb --full --analyze --username $userpg --dbname $postgresbase
                                  fi

			          if  [ "$reindex" = '1' ] && [ "$sqltype" = '1' ];
                                  then
				      #Проводим реиндексацию
				      echo "Проводим реиндексацию базы: "$postgresbase
				      sudo -H -u $userpg reindexdb --username $userpg --dbname $postgresbase
                                  fi
                               fi
                              
                          else
                              echo "создаем выгрузку базы с сервера 1С"
                              rashirenie=.dt
                              filemane=$patharc$basename/День/$DATA-День-$basename$rashirenie
                              pathfilename=$patharc$basename/День
                              var1=$popytki

                              # Разберемся с сервером баз данных, если он задан то он такой, если нет, то он как сервер 1с
                              if [[ $servbd == "" ]];
                              then
                              srvbd=${serverbase%':'*}
                              srvbd=${srvbd%'\'*}
                              else
                              srvbd=$servbd
                              fi
                              # Пробуем выгрузить через авто сервер
                              while [ $var1 -gt 0 ]
                              do
                              var1=$[ $var1 - 1 ]
                              if [ $avtserver1c = "1" ];
                                 then
                                     if (($versrel > 17)) ; then $path1c/ibcmd infobase dump --db-server=$srvbd --dbms=$sqltypestr --db-name=$postgresbase --db-user=$userpg --db-pwd=$passpg --user=$username --password=$userpw "$filemane";
                                                            else $path1c/ibcmd infobase dump --db-server=$srvbd --dbms=$sqltypestr --db-name=$postgresbase --db-user=$userpg --db-pwd=$passpg "$filemane";
                                     fi
                              fi

                              if [ $(du -k "$filemane" | cut -f 1) -ge 0 ];
                              then
                              var1=0
                              fi
                              done
   
                              # Если выгрузка через автономны сервер не удалась, то нужно попробовать выгрузить через конфигуратор
                              if [ $(du -k "$filemane" | cut -f 1) -ge 0 ];
                              then
                              var1=0
                              else
                              var1=$popytki
                              label2;
                              label3;
                              label1;
                              label1;
                              label1;
                              fi

                              while [ $var1 -gt 0 ]
                              do
                              var1=$[ $var1 - 1 ]
                              label1;
                              label1;
                              $path1c/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

                              #Проводим очистку и реиндексацию базы для PostgreSQL
                              if [ "$DOW" = "$weekday" ];
                              then
			         #Проводим очистку и реиндексацию базы для PostgreSQL
                                  if  [ "$clearbd" = '1' ] && [ "$sqltype" = '1' ];
                                  then
                                      #Проводим очистку базы
				      echo "Проводим очистку базы: "$postgresbase
				      sudo -H -u $userpg vacuumdb --full --analyze --username $userpg --dbname $postgresbase
                                  fi

			          if  [ "$reindex" = '1' ] && [ "$sqltype" = '1' ];
                                  then
				      #Проводим реиндексацию
				      echo "Проводим реиндексацию базы: "$postgresbase
				      sudo -H -u $userpg reindexdb --username $userpg --dbname $postgresbase
                                  fi
                               fi
                          fi
                          # теперь копируем созданную выгрузку во все папки с архивами
                          if  [ "$fullaccess" = '1' ];
                                  then
                                      #Если выбран полный доступ для всех
				      chmod 777 "$filemane"
                          fi
                          for i in "${my_array[@]}"
                          do
                              # Разбираемся с дневными копиями
                              pathfilename=$i$basename/День
                              filemanen=$i$basename/День/$DATA-День-$basename$rashirenie
                              if [ "$patharc" != "$i" ];
                              then
                                  cp "$filemane" "$filemanen"
                                  if  [ "$fullaccess" = '1' ];
                                  then
                                      #Если выбран полный доступ для всех
				      chmod 777 "$filemane"
                                  fi
                              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"
                                  chmod 777 "$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"
                                  chmod 777 "$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С
if [[ $apachestop == "1" ]]
    then
        echo "$sudopw" | sudo -S service apache2 start
        sudo systemctl restart apache2
        apachestop="0"
    fi

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

Хотелось бы так же обратить внимание на один момент, что бы данный скрипт автоматически выполнялся в cron, для него нужно будет создать виртуальный монитор, если Вы собираетесь делать именно выгрузку средствами 1С (через конфигуратор). Конфигуратору просто необходимо как то «отобразиться». Что бы решить данную проблему нужно будет установить программу виртуального дисплея (пишу для Ubuntu):

sudo apt-get install xvfb

после чего, нужно создать в каталоге /etc/systemd/system/ файл с именем Xvfb.service, с таким содержимым:

[Unit]
Description=X Virtual Frame Buffer Service
After=network.target
[Service]
ExecStart=/usr/bin/Xvfb :99 -screen 0 1680x1050x24 -shmem
[Install]
WantedBy=multi-user.target

После чего выполнить команды для запуска в последствии в автомате сервиса виртуального монитора (в нашем случае под номером 99):

chmod +x /etc/systemd/system/Xvfb.service
systemctl enable Xvfb.service
systemctl start Xvfb.service

После этого скрипт в cron должен будет запускаться как DISPLAY=:99.0 LANG=ru_RU.UTF-8 /наш скрипт.sh

Так же хочу отметить, что для автономного сервера, который появился с 14 версии, всего этого не нужно, он прекрасно работает без графических отображений. В данном скрипте, идет проверка на возможность использования автономного сервера, и если это возможно, то выгрузка производится используя его. Это же справедливо и для cmd файла под Windows.

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

Так же было замечено, что для платформ начиная с 18-ой, почему то при запуске скрипта через cron не с певого раза начинает срабатывать обращение к ras. Но на третий раз все начинает работать в обычном режиме. В связи с этим пришлось «выброс пользователей с сервера» делать несколько раз.

Для последних версий платформы 1С для Linux стал наблюдаться факт того, что родной сервис ras некорректно работает потом. По этой причине был найден следующий вариант решения этой проблемы — был создан свой вариант старта сервиса ras, который в последствии корректно работает. По пути /etc/systemd/system/ нужно создать файл ras.service со следующим содержимым (и это только для платформ не выше 17-ой включительно):

[Unit]
Description=RAS
After=syslog.target
After=network.target
[Service]
Type=forking
WorkingDirectory=/opt/1C/v8.3/x86_64
User=usr1cv8
Group=grp1cv8
OOMScoreAdjust=-100
ExecStart=/sbin/start-stop-daemon -Sbvx /opt/1C/v8.3/x86_64/ras -- cluster
ExecRelod=/sbin/start-stop-daemon -Kvx /opt/1C/v8.3/x86_64/ras && /sbin/start-stop-daemon -Sbvx /opt/1C/v8.3/x86_64/ras -- cluster
ExecStop=/sbin/start-stop-daemon -Kvx /opt/1C/v8.3/x86_64/ras
TimeoutSec=300
Restart=always
[Install]
WantedBy=multi-user.target

Начиная с 18-ой платформы содержимое этого файла:

[Unit]
Description=1C:Enterprise Remote Administration Service
After=network.target remote-fs.target nss-lookup.target
Requires=srv1cv83.service
[Service]
Type=simple
ExecStart=opt/1cv8/x86_64/8.3.18.1894/ras cluster --port=1545
KillSignal=SIGINT
PrivateTmp=true
Restart=on-failure
RestartSec=5
User=usr1cv8
Group=grp1cv8
[Install]
WantedBy=multi-user.target

Но нужно изменить (то что выделено красным) на версию устанавливаемой платформы.

После чего дать команды

sudo systemctl daemon-reload
sudo systemctl enable ras
sudo systemctl start ras

Это должно решить данную проблему.

Так же для удобства работы можно создать отдельно скрипты для завершения зависших сеансов пользователей на сервере 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
#Определяем максимально установленную версию 1С
vers=""
for name in $(find /opt/1cv8/x86_64 -maxdepth 1 | sort );
do
vers="1"
vers=${name:17}
done
#Определяем путь до 1С
if [ "$vers" == '' ];
then
path1c="/opt/1C/v8.3/x86_64"
else
path1c="/opt/1cv8/x86_64/$vers"
fi

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

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

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

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

#!/bin/bash
#Определяем максимально установленную версию 1С
vers=""
for name in $(find /opt/1cv8/x86_64 -maxdepth 1 | sort );
do
vers="1"
vers=${name:17}
done
#Определяем путь до 1С
if [ "$vers" == '' ];
then
path1c="/opt/1C/v8.3/x86_64"
else
path1c="/opt/1cv8/x86_64/$vers"
fi


sudo $path1c/ras --daemon cluster
for cluster in $(sudo $path1c/rac cluster list | grep 'cluster'); do
if [ "$cluster" != 'cluster' ] &&  [ "$cluster" != ':' ];
then
echo $cluster
fi
done

echo 'Вот список баз которые уже существуют на сервер:'
for name in $(sudo $path1c/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 $path1c/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 $path1c/rac infobase --cluster=$cluster  summary list | grep 'name'); do
if [ "$name" != 'name' ] &&  [ "$name" != ':' ];
then
echo $name
fi
done

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

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

#!/bin/bash
#Определяем максимально установленную версию 1С
vers=""
for name in $(find /opt/1cv8/x86_64 -maxdepth 1 | sort );
do
vers="1"
vers=${name:17}
done
#Определяем путь до 1С
if [ "$vers" == '' ];
then
path1c="/opt/1C/v8.3/x86_64"
else
path1c="/opt/1cv8/x86_64/$vers"
fi

sudo $path1c/ras --daemon cluster
for cluster in $(sudo $path1c/rac cluster list | grep 'cluster'); do
if [ "$cluster" != 'cluster' ] &&  [ "$cluster" != ':' ];
then
echo $cluster
fi
done

echo 'Вот список баз которые уже существуют на сервер:'
for name in $(sudo $path1c/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 $path1c/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 $path1c/rac infobase --cluster=$cluster drop --infobase=$infobase
#sudo $path1c/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 $path1c/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. Это сделано для корректной работы с кириллицей, но иногда возникает обратная ситуация, тогда эти строки нужно закомментировать.