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

В данной статье приводится пример использования скрипта 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:TST1C»                                    ; Место расположения БД

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

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

 

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

$sArchFile                   = «C:TST1CBase.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 Files1cv82common1cestart.exe DESIGNER /F» & $sDBaseFile & «/DumpIB» & $sArchFile)

;—————————————————————————————

 

$sCommandLine = «C:Program Files1cv82common1cestart.exe DESIGNER /F » & $sDBaseFile & » /DumpIB » & $sArchFile & » /N «& $sDBaseUser  &» /P » & $sDBasePass

;$sCommandLine = «C:Program Files1cv82common1cestart.exe DESIGNER /F C:TST1C /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 Comment

  1. SiAl

    Для защиты не от дураков советую использовать Windows-авторизацию. А скрипт либо запускать через runas, либо в планировщике у задания указать необходимого пользователя. Тогда в самом скрипте не будет никаких паролей.

    Reply

Leave a Comment

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