Автоматизация выполнения регламентных заданий в файловом варианте работы при помощи AutoIt.

Опубликовал Капитан Немо (capitan) в раздел Администрирование - Сервисные утилиты

Автоматизация выполнения регламентных заданий в файловом варианте работы при помощи AutoIt.

Не ставится под сомнение, что регламентные задания лучше выполнять.
А как их выполнять если база – файловая?
Тут напрашивается  ответ – А пусть пользователь нажмет кнопку Регламентные и фоновые задания – Выполнить сейчас. Так считают разработчики  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!

Скачать файлы

Наименование Файл Версия Размер
Скрипты, файлы настройки, скомпилированные приложения
.zip 571,48Kb
27.06.13
48
.zip 571,48Kb 48 Скачать

См. также

Комментарии
1. Сергей Маслов (LexSeIch) 182 01.08.13 06:53 Сейчас в теме
Мир этому дому!
Плюсанул за статью. Я так же считаю что AutoIT - удобная обертка для запуска приложений. Всегда можно дополнить этот процесс какими-то своими условиями и проверками.
2. Сергей Маслов (LexSeIch) 182 01.08.13 09:46 Сейчас в теме
Код немного поправить надо. Что-то вроде:
...
$encrypted_password = FileRead($passwordfile) ;read in encrypted password from file
$password = _StringEncrypt(0,$encrypted_password,"f2f5f1f7ba",8) ;decrypt password
...
и далее подставлять в командную строку на выполнение уже расшифрованный пароль $password ...
3. Капитан Немо (capitan) 550 01.08.13 11:46 Сейчас в теме
(2) LexSeIch,
Тело хозяйское :)
За плюс - мерси.
4. Alexander Khudoev (identificator) 12 13.11.13 09:42 Сейчас в теме
За что отвечает параметр Swith в файле setting.auto ?
5. Капитан Немо (capitan) 550 13.11.13 14:28 Сейчас в теме
В этой версии ни за что не отвечает.
Не обращайте внимания.
6. Alexander Khudoev (identificator) 12 20.11.13 08:57 Сейчас в теме
Какие параметры нужно указать, чтобы скрипт не закрывался через определенное время, а работал бесконечно долго?
7. Alexander Khudoev (identificator) 12 20.11.13 09:04 Сейчас в теме
И регламентные задания - в частности - автоматическая синхронизация - не отрабатывает. Скрипт при этом запущен. Информационное окно о состоянии работы скрипта есть. Запуск регламентного задания через 1С в ручную отрабатывает корректно. Автоматически через скрипт - не получается.
8. Alexander Khudoev (identificator) 12 25.11.13 10:42 Сейчас в теме
Переписал скрипт.
Изменил алгоритм работы:
1) скрипт запускает 1С
2) после авторизации в 1С запускается обработчик регламентных заданий
3) скрипт убивает сам себя, не закрывая 1С.
Таким образом регламентные задания будут выполняться по расписанию и бесконечно долго без привязки к параметру Time.
9. UMix У (Umix) 89 26.02.14 09:14 Сейчас в теме
Дай бог памяти... много лет назад пользовался кажется "startx" не пинайте название точно не помню, висела она в трее, можно было много скриптов отработать и последовательность выдержать и по времени, однозначно выручала она и проще гораздо. Тогда еще AutoIt был совсем детский. Думаю пора вспомнить о ней.
10. Сергей Лех (LSM) 07.05.14 01:57 Сейчас в теме
(8) identificator,
Если не сложно, поделитесь скриптом.
И еще вопрос. Почему-то автоматом не отрабатывает запуск 1С, т.е. приходится нажимать ок для авторизации пользователя. Версия платформы 8.2.19.83
11. Капитан Немо (capitan) 550 07.05.14 17:19 Сейчас в теме
Оставьте свое сообщение