Не ставится под сомнение, что регламентные задания лучше выполнять.
А как их выполнять если база – файловая?
Тут напрашивается ответ – А пусть пользователь нажмет кнопку Регламентные и фоновые задания – Выполнить сейчас. Так считают разработчики 1С.
Ответ неверный. Во первых не хочется давать административные права, во вторых пользователям неохота нажимать на кнопки.
Хорошо, тут же нагуглим вариант – стартовать 1С с ключом /C"DoScheduledJobs SkipMessageBox AloneIBSession".
Куда девать пароль ? Авторизация по имени пользователя ОС.
Как запускать – в планировщик от имени другого пользователя.
А как останавливать? У планировщика Windows дискретность – полчаса.
В общем грабли на грабельках и костыликами погоняют.
И хотя каждый программист 1С тянется к Delphi, есть выход проще.
AutoIt + русская справка. Через час все готово. Причем в виде исполняемых файлов.
Программа поднимает 1С, выполняет в течении заданного времени регламентные задания и закрывает 1С. Все параметры в ini файле. Кроме пароля.
Пароль генерирует скрипт password.au3.
Сами скрипты несложные, разберетесь:
Не советую только злоупотреблять кириллицей, это не 1С.
reglament1c.au3
;
; AutoIt Version: 3.0
; Language: English
; Platform: Win9x/NT
;
; Script Function:
;
#include
$inifile = @WorkingDir & "\setting.auto"
$passwordfile = @WorkingDir & "\password.auto"
Break(0) ;Disable break
If not FileExists($passwordfile) Then
MsgBox(4096,"", "Password file does not exist.")
Exit
EndIf
If not FileExists($inifile) Then
MsgBox(4096,"", "Ini file does not exist.")
Exit
EndIf
$strCommand = IniRead($inifile, "1C", "Command", "NotFound")
$strUser = IniRead($inifile, "1C", "User", "NotFound")
$strPath = IniRead($inifile, "1C", "Path", "NotFound")
$iTime = IniRead($inifile, "1C", "Time", "300")
$encrypted_password = FileRead($passwordfile) ;read in encrypted password from file
FileClose($passwordfile) ;close password file
if StringLen($encrypted_password) = 0 Then
$strPassword = ""
Else
$strPassword = _StringEncrypt(0,$encrypted_password,"f2f5f1f7ba",8)
EndIf
;$strCommand = 'C:\Program Files (x86)\1cv82\8.2.18.102\bin\1cv8.exe ENTERPRISE /N"Федоров (администратор)" /P"" /IBConnectionString"File=""...\Управление торговлей 11"";" /C"DoScheduledJobs SkipMessageBox AloneIBSession"'
$strCommand = $strCommand&' ENTERPRISE /N"'&$strUser&'" /P"'&$encrypted_password&'" /IBConnectionString"File=""'&$strPath&'"";" /C"DoScheduledJobs SkipMessageBox AloneIBSession"'
; Run
$PID = Run($strCommand)
If not $PID Then
MsgBox(4096,"", "Can't start 1C.")
Exit
EndIf
SplashTextOn("Start 1C", "1C started",-1,50)
Sleep(3000)
SplashOff()
Opt("WinTitleMatchMode", 1)
WinWait("Выполнение регламентных заданий:")
WinSetState("Выполнение регламентных заданий:", "", @SW_HIDE)
ProgressOn("Progress", "Please wait while 1C running", "0 percent",10,10,2)
For $i = 10 to 100 step 10
sleep(Int($iTime)*100)
If WinExists("Выполнение регламентных заданий:") Then
WinSetState("Выполнение регламентных заданий:", "", @SW_HIDE)
Else
Exit
EndIf
ProgressSet( $i, $i & " percent, left: "& (Int($iTime) - Int($iTime)/100*$i)& " second")
Next
ProgressSet(100 , "Done", "Complete")
sleep(500)
ProgressOff()
; Now quit by sending a "close" request
If $PID Then
If ProcessExists($PID) Then
ProcessClose($PID)
EndIf
EndIf
sleep(500)
; Finished!
password.au3
#include
Func _Manage_Password()
Local $reset, $encrypted_password, $handle, $pwfile
$pwfile = @WorkingDir & "\password.auto"
$reset = msgbox(260,"PASSWORD RESET","Would you like to set your password?",10) ;does user want to rest password
if $reset = 6 OR FileExists($pwfile) = 0 Then ;if resetting pword or pword file doesn't exist
$encrypted_password = _StringEncrypt(1,InputBox("Title","Prompt","","*"),"f2f5f1f7ba",8) ;get pword and encrypt into a string
$handle = FileOpen($pwfile,2) ;open file in overwrite write mode
FileWrite($handle,$encrypted_password) ;write encrypted string into file
FileClose($handle) ;close password file
Else
$encrypted_password = FileRead($pwfile) ;read in encrypted password from file
FileClose($pwfile) ;close password file
EndIf
return $encrypted_password ;return the encrypted password
EndFunc
$encrypted_password = _Manage_Password() ;retrieve ecrypted pw or set a new one
$password = _StringEncrypt(0,$encrypted_password,"f2f5f1f7ba",8) ;decrypt password
MsgBox(1,"password",$password,10)
; Finished!