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