gifts2017

Пример использования 1С-Automation и скриптов AutoIT

Опубликовал Сергей Маслов (LexSeIch) в раздел Администрирование - Сервисные утилиты

В данной статье приводится пример использования скрипта AutoIT в качестве клиента для 1С-Automation сервера.

Чтобы показать возможности такого решения, в приведенном примере выполняются смешанные операции: соединение с 1С-Automation сервером, вызов процедур глобального контекста (в том числе из общего пользовательского модуля), запуск 1С-предприятия в командной строке (выгрузка БД в режиме конфигуратора).

      Функциональность примера понятна из текста программы:  мы производим выгрузку  файловой базы данных (запуская 1С в пакетном режиме через RunWhite / RunAsWhite ), при этом, заносим информацию об этом событии в журнал регистрации  БД и, через функцию общего модуля, дополнительную информации помещаем в независимый регистр сведений.

Код скрипта приведен ниже:

#RequireAdmin

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****

#AutoIt3Wrapper_Compile_Both=y

#AutoIt3Wrapper_UseX64=y

#AutoIt3Wrapper_Res_Comment=Пример использования AutoIT

#AutoIt3Wrapper_Res_Description=Пример использования AutoIT

#AutoIt3Wrapper_Res_Fileversion=1.1.2

#AutoIt3Wrapper_Run_Obfuscator=y

#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

;--------------------------------------------------------------------------------------

;                       Пример использования 1С Automation Server

;--------------------------------------------------------------------------------------

; Используем 1С как Automation сервер. Присоединяемся к файловой БД. Блокируем сеансы.

; Выгружаем БД через запуск приложения в командной строке. Пишем лог в журнал БД.

; Для запуска скрипта с правами Администратора, нужно использовать RunAsWait().

; Так как код можно скомпилировать в исполняемое приложение (используя обфускатор),

; то явно имени и пароля видно не будет (защита от дураков).

;--------------------------------------------------------------------------------------

;                       Последние изменения:   26.06.2012

;                       Автор -- LexSeIch www.LexSeIch.ru

;--------------------------------------------------------------------------------------

#include

 

;--------------------------------------------------------------------------------------

;                       Задаем параметры скрипта

;--------------------------------------------------------------------------------------

$sDBaseFile                = "C:\TST\1C"                                    ; Место расположения БД

$sDBaseUser              = "User"                                                          ; Имя пользователя БД

$sDBasePass   = "userpass"                                                                ; Пароль пользователя БД

 

$sKeyCode                 = "123"                                                           ; Код блокировки ( /UC )

$sArchFile                   = "C:\TST\1C\Base.DT"                                 ; Архивный файл для выгрузки

 

$sAdminUser               = "Администратор"                                      ; Пользователь администратор

$sAdminPass               = "passadmin"                                                  ; Пароль пользователя администратора

$sDomen                     = "MyDomen"                                     ; Домен

 

;--------------------------------------------------------------------------------------

;                       Создаем объект V82.Application

;--------------------------------------------------------------------------------------

$o1CObject = ObjCreate("V82.Application")                        ; Создаем 1С объект

if @error then

                        Msgbox (0,"1С Application","Ошибка создания V82.Application. Код ошибки: " & @error)

                        exit

endif

;--------------------------------------------------------------------------------------

 

 

;--------------------------------------------------------------------------------------

;                       Устанавливаем соединение с БД

;--------------------------------------------------------------------------------------

$o1CObject.Connect("File="& $sDBaseFile &";Usr="& $sDBaseUser &";Pwd="& $sDBasePass ) ; коннектимся к базе

 

if @error then

                        Msgbox (0,"Соединение с 1С базой","Ошибка соединения. Код ошибки: " & @error, 5)

                        exit

else

                        $o1CObject.Visible = False    ; интерфейс не нужен - скрываем его

endif

;--------------------------------------------------------------------------------------

 

;--------------------------------------------------------------------------------------

;                       Формируем статистику для записи в журнал

;--------------------------------------------------------------------------------------

$tCurTime = _Date_Time_GetSystemTime()                          ; текущее системное время

 

$sUserObj = $o1CObject.UserName                                                ; Пользователь БД

$sUserSys = @UserName                                                                 ; Пользователь системы

 

$sCompObj = $o1CObject.ComputerName                                      ; Компьютер БД

$sCompSys = @ComputerName                                                       ; Компютер системы

 

$sBase = $o1CObject.InfoBaseConnectionString                               ; Путь к БД

;--------------------------------------------------------------------------------------

 

;--------------------------------------------------------------------------------------

;                       Устанавливаем блокировку сеансов

;--------------------------------------------------------------------------------------

 

$oSessionLock = $o1CObject.GetSessionsLock()                 ; получаем блокировку сеансов

 

If Not $oSessionLock.Use Then                                             ; блокировки еще нет

                        $oSessionLock.Message = "Техническое обслуживание БД" & @CRLF & $sBase

                        $oSessionLock.KeyCode = $sKeyCode        ; Код для /UC

                        $oSessionLock.Use = True                             ; ставим флаг блокировки сеансов

                        $o1CObject.SetSessionsLock($oSessionLock)                      ; блокируем сессии...

;Msgbox (0,"Блокировка","Установили блокировку: " & $oSessionLock.KeyCode, 5); --

Else

            Msgbox (0,"Блокировка","Блокировка уже установлена.", 5)

            exit

EndIf

 

;--------------------------------------------------------------------------------------

;           Выгружаем базу

;--------------------------------------------------------------------------------------

;----------------------- Для запуска с правами администратора --------------------------

; Необходимо задать дополнительные параметры: пользователь, домен, пароль

; $pid = RunAsWait($sAdminUser, $sDomen, $sAdminPasw, 0,"C:\Program Files\1cv82\common\1cestart.exe DESIGNER /F" & $sDBaseFile & "/DumpIB" & $sArchFile)

;---------------------------------------------------------------------------------------

 

$sCommandLine = "C:\Program Files\1cv82\common\1cestart.exe DESIGNER /F " & $sDBaseFile & " /DumpIB " & $sArchFile & " /N "& $sDBaseUser  &" /P " & $sDBasePass

;$sCommandLine = "C:\Program Files\1cv82\common\1cestart.exe DESIGNER /F C:\TST\1C /N User /P userpass"

 

$pid = RunWait($sCommandLine);

 

If @error Then

                        Msgbox (0,"Выгрузка базы","Ошибка выгрузки. Код ошибки: " & @error, 5)

Else

                        ProcessWaitClose($pid)

EndIf

 

;--------------------------------------------------------------------------------------

;                       Регистрируем событие выгрузки БД в журнале

;--------------------------------------------------------------------------------------

 

$o1CObject.WriteLogEvent("Выгрузка БД пользователем: " & $sUserSys)

 

$o1CObject.MyFunction.SetLog( @UserName, $sCompSys )          ; вызываем функцию SetLog из общего модуля MyFunction

 

;--------------------------------------------------------------------------------------

;                       Снимаем блокировку

;--------------------------------------------------------------------------------------

            $oSessionLock = $o1CObject.GetSessionsLock()                 ; получаем блокировку сеансов

 

If  $oSessionLock.Use Then                                                               ; блокировка установлена

                        $oSessionLock.Message = "Сняли блокировку"

                        $oSessionLock.Use = False                                        ; ставим флаг снятия блокировки сеансов

                        $o1CObject.SetSessionsLock($oSessionLock)          ; разблокируем сессии...

;Msgbox (0,"Блокировка","Сняли блокировку: ", 5); --

EndIf

 

;--------------------------------------------------------------------------------------

;                       Окончание работы

;--------------------------------------------------------------------------------------

 

$o1CObject=""                                                                                                                     ; Освобождаем память

exit

 

 

 В конфигурации 1С определен общий не глобальный модуль MyFunction, через который вызывается функция записи лога в журнал:

 

//--------------------------------------------------------------------------------------

// Экспортная процедура общего не глобального модуля MyFunction

//--------------------------------------------------------------------------------------

Процедура  SetLog( User, Comp )  Экспорт

   // фиксируем пользователя и компьютер в нашем журнале

   РегистрыСведений.ЖурналВыгрузки.ДобавитьНовыйЛог(User, Comp);

   

КонецПроцедуры

 

Кроме того, запись идет во внутренний «ЖурналВыгрузки» на базе непериодического независимого регистра сведений:

 

//------------------------------------------------------------------------------------------

// Непериодический независимый регистр сведений "ЖурналВыгрузки".

 

// Измерения:

//          Номер (Число)

// Ресурсы:

//          Пользователь (Строка)

//          Компьютер (Строка)

 

// Процедуры модуля менеджера:

//-----------------------------------------------------------------------------------------

Процедура ДобавитьНовыйЛог(Пользователь, Компьютер)  Экспорт

       НоваяЗапись =  РегистрыСведений.ЖурналВыгрузки.СоздатьМенеджерЗаписи();

               НоваяЗапись.Пользователь = Пользователь;

               НоваяЗапись.Компьютер = Компьютер;

       НоваяЗапись.Номер = ПолучитьНовыйНомер();

               НоваяЗапись.Записать();

 

КонецПроцедуры

  

Функция ПолучитьНовыйНомер()

 

            Запрос = Новый Запрос;

            Запрос.Текст =

                        "ВЫБРАТЬ ПЕРВЫЕ 1

                        |           МАКСИМУМ(ЖурналВыгрузки.Номер) + 1 КАК Номер

                        |ИЗ

                        |           РегистрСведений.ЖурналВыгрузки КАК ЖурналВыгрузки";

 

            Результат = Запрос.Выполнить();

 

            ВыборкаДетальныеЗаписи = Результат.Выбрать();

           

            Если  НЕ ВыборкаДетальныеЗаписи.Следующий() Тогда

                        Возврат 1;

            Иначе

                        Возврат ВыборкаДетальныеЗаписи.Номер;        

            КонецЕсли; 

 

КонецФункции //

 

//---------------------------------------------------------------------------------------------

 

 

            Сама процедура скрипта может быть скомпилирована в отдельный исполняемый модуль. В этом случае при использовании обфуркации мы, в некотором смысле защищаем информацию, так как в явном виде не просматривается имя пользователяя и его пароль (защита от дураков). Дополнительно, средствами AutoIT можно ограничить запуск скомпилированной процедуры например только с определенного места, или, например при наличии ключа-флешки.

 

По моему мнению, написание скриптов (особенно простых, связанных с запуском внешних приложений) на AutoIT   доступно любому, кто умеет работать с текстовым редактором.

 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Алексей Ситников (SiAl) 13.07.15 08:14
Для защиты не от дураков советую использовать Windows-авторизацию. А скрипт либо запускать через runas, либо в планировщике у задания указать необходимого пользователя. Тогда в самом скрипте не будет никаких паролей.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа