Чтобы показать возможности такого решения, в приведенном примере выполняются смешанные операции: соединение с 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 доступно любому, кто умеет работать с текстовым редактором.
Для защиты не от дураков советую использовать Windows-авторизацию. А скрипт либо запускать через runas, либо в планировщике у задания указать необходимого пользователя. Тогда в самом скрипте не будет никаких паролей.