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


Автоматизация выполнения регламентных заданий в файловом варианте работы при помощи 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)1cv828.2.18.102in1cv8.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!

11 Comments

  1. LexSeIch

    Мир этому дому!

    Плюсанул за статью. Я так же считаю что AutoIT — удобная обертка для запуска приложений. Всегда можно дополнить этот процесс какими-то своими условиями и проверками.

    Reply
  2. LexSeIch

    Код немного поправить надо. Что-то вроде:



    $encrypted_password = FileRead($passwordfile) ;read in encrypted password from file

    $password = _StringEncrypt(0,$encrypted_password,»f2f5f1f7ba»,8) ;decrypt password



    и далее подставлять в командную строку на выполнение уже расшифрованный пароль $password …

    Reply
  3. capitan

    (2) LexSeIch,

    Тело хозяйское 🙂

    За плюс — мерси.

    Reply
  4. identificator

    За что отвечает параметр Swith в файле setting.auto ?

    Reply
  5. capitan

    В этой версии ни за что не отвечает.

    Не обращайте внимания.

    Reply
  6. identificator

    Какие параметры нужно указать, чтобы скрипт не закрывался через определенное время, а работал бесконечно долго?

    Reply
  7. identificator

    И регламентные задания — в частности — автоматическая синхронизация — не отрабатывает. Скрипт при этом запущен. Информационное окно о состоянии работы скрипта есть. Запуск регламентного задания через 1С в ручную отрабатывает корректно. Автоматически через скрипт — не получается.

    Reply
  8. identificator

    Переписал скрипт.

    Изменил алгоритм работы:

    1) скрипт запускает 1С

    2) после авторизации в 1С запускается обработчик регламентных заданий

    3) скрипт убивает сам себя, не закрывая 1С.

    Таким образом регламентные задания будут выполняться по расписанию и бесконечно долго без привязки к параметру Time.

    Reply
  9. Umix

    Дай бог памяти… много лет назад пользовался кажется «startx» не пинайте название точно не помню, висела она в трее, можно было много скриптов отработать и последовательность выдержать и по времени, однозначно выручала она и проще гораздо. Тогда еще AutoIt был совсем детский. Думаю пора вспомнить о ней.

    Reply
  10. LSM

    (8) identificator,

    Если не сложно, поделитесь скриптом.

    И еще вопрос. Почему-то автоматом не отрабатывает запуск 1С, т.е. приходится нажимать ок для авторизации пользователя. Версия платформы 8.2.19.83

    Reply
  11. capitan

    (10) LSM, Пустой пароль ?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *