Пользовательский поиск по Drupal сайтам.
Loading

Сохранить и обновить 1С через BAT файл

ЗАДАЧА: Сохранить и обновить 1С через BAT файл

Причем архивы надо иметь только за последнюю неделю (месяц).

Решение:

Сначала маленькое пред- решение нашел интересный пример батника, формирующего переменные для года, месяца, дня недели и пр.:

 
@Echo Off

For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Day') ^
Do Set $Day=%%i&GoTo Day
:Day
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Month') ^
Do Set $Month=%%i&GoTo Month
:Month
For /F "Tokens=%$Month% Delims=," %%i ^
In ("Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь") ^
Do Set $MonthName=%%i
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Year') ^
Do Set $Year=%%i&GoTo Year
:Year
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get DayOfWeek') ^
Do Set /A $DayOfWeek=%%i+1&GoTo DayOfWeek
:DayOfWeek
For /F "Tokens=%$DayOfWeek% Delims=," %%i ^
In ("Воскресенье,Понедельник,Вторник,Среда,Четверг,Пятница,Суббота") ^
Do Set $DayOfWeekName=%%i
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get WeekInMonth') ^
Do Set $WeekInMonth=%%i&GoTo WeekInMonth
:WeekInMonth
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Hour') ^
Do Set $Hour=%%i&GoTo Hour
:Hour
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Minute') ^
Do Set $Minute=%%i&GoTo Minute
:Minute
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Second') ^
Do Set $Second=%%i&GoTo Second
:Second


Echo --------------------------------------
Echo День         : %$Day%
Echo Месяц        : %$MonthName% (%$Month%-й месяц года)
Echo Год          : %$Year%
Echo --------------------------------------
Echo День недели  : %$DayOfWeekName% (%$DayOfWeek%-й день недели)
Echo Неделя месяца: %$WeekInMonth%
Echo --------------------------------------
Echo Часов        : %$Hour%
Echo Минут        : %$Minute%
Echo Секунд       : %$Second%
Echo --------------------------------------
pause

Не забывайте что bat-файлы пишутся в DOS-кодировке.

Ну и далее BAT-файл делающий архив и обновляющий базу (если за день что-то сделали, а динамическое обновление не проходит):

@Echo Off
rem Формируем переменную дня недели $DayOfWeek
rem Нумерация не наша т.е. Воскресенье - 1, Понедельник - 2 .....
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get DayOfWeek') ^
Do Set /A $DayOfWeek=%%i+1&GoTo DayOfWeek
:DayOfWeek

rem меняем диск где записана 1С
C:
cd "C:\Program Files\1cv81\bin"
rem запускаем архивирование, обратите внимание на флаг WA+, теоретически его можно не ставить
rem он отвечает за WIN авторизацию в 1с и установлен по умолчанию. Чтобы не светить пароль 
rem пользователя, я завел нового пользователя 1С с полными правами и привязал его к авторизации
rem админа, от имени которого выполняем назначенное задание. 
rem G:\backup - заранее созданная папка для бакапов

1cv8.exe CONFIG /S СЕРВЕР_БАЗЫ_ДАННЫХ\БАЗА_ДАННЫХ /WA+ /DumpIB G:\backup\1c_%$DayOfWeek%.dt
rem проверяем на ошибки выполнения после архивирования и пишем лог в g:\BACKUP\1c_err.log rem если архивирование прошло с ошибками, то базу не обновляем if errorlevel 1 ( echo %DATE% BACKUP_ERROR_1 >>g:\BACKUP\1c_err.log
exit ) if errorlevel 101 ( echo %DATE% BACKUP_ERROR_101 >>g:\BACKUP\1c_err.log
exit ) if errorlevel 0 ( echo %DATE% BACKUP_OK >>g:\1cv81\BACKUP\1c_err.log
) rem если ошибок нет - то обновляем базу данных 1cv8.exe CONFIG /S СЕРВЕР_БАЗЫ_ДАННЫХ\БАЗА_ДАННЫХ /WA+ /UpdateDBCfg
rem проверяем на ошибки обновления if errorlevel 1 ( echo %DATE% Update_ERROR_1 >>g:\BACKUP\1c_err.log
exit ) if errorlevel 101 ( echo %DATE% Update_ERROR_101 >>g:\BACKUP\1c_err.log
exit ) if errorlevel 0 ( echo %DATE% Update_OK >>g:\BACKUP\1c_err.log
)

Далее остается только назначить задание на выполнение ночью, чтобы ни кому не мешать. И у нас всегда будут архивы за последние 7 дней. Переменную %$DayOfWeek% мы можем поменять на %$Day% из первого батника, тогда архивы всегда будут за последний месяц.

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

Тяжелый алгоритм. Автор: Darren (не проверено)