последнее редактирование 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. Это сделано для корректной работы с кириллицей, но иногда возникает обратная ситуация, тогда эти строки нужно закомментировать.