последнее редактирование 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 включительно). В конструкции указаны конкретные значения, но я думаю, что по записи соорентироваться не сложно, что и куда. Но если не понятно, то на просторах интернета всё можно найти, как вариант вот здесь, а точнее во второй части — здесь.
И так, допустим мы имеем:
- Пусть на сервере крутятся как файловые базы, так и серверные базы. Пусть так же используется веб-доступ к нашим базам. В качестве сервера баз данных может использоваться как MsSQL так и PstgreSQL.
- Допустим, что есть некий пользователь (user), под которым прописаны все нужные нам базы в стартере 1С. Самое главное, что бы там не было «не нужных» баз или еще страшнее — не существующих баз. Мы будем использовать этот список для автоматического формирования списка баз, для которых будет создаваться резервная выгрузка баз, но ничто не мешает создать файл ibases.v8i со списком нужных баз, затем сохранить его где-нибудь, и «натравить» скрипт на него.
- Создание резервных копий всех баз будет происходить в определенную папку/папки, внутри которых будет автоматически формироваться: папка с именем базы — в ней будут находиться папки — День, Неделя и Месяц — для сохранения дневных копий (за последние 4 дня), недельных копий (за последние 4 недели) и месячных копий (за последние 4 месяца) базы. Здесь нужно отметить, что сохраняться будут просто n заданных в скрипте копий в папке, т.е. если быть более правильным — не за последние, например, 4 дня, а последние 4 копии, т.е. если Вы за день запустите этот скрипт 4 раза, то там на самом деле останутся просто последние 4 копии, которые относятся к одному и тому же дню. Т.е. для случая, что Вы запускаете этот скрипт один раз в день, будет верно выражение — копии за последние 4 дня.
- Так же предположим, что в качестве Web сервера для Windows будет использоваться его родной iis, а для Linux — apach. Хотя этот момент просто изменить.
- Так же для 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С.
- И последнее — если создаются выгрузки из баз 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. Это сделано для корректной работы с кириллицей, но иногда возникает обратная ситуация, тогда эти строки нужно закомментировать.


1С: Бухгалтерия 8 для Казахстана. Учебная версия.