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

Публикация № 141483

Администрирование - Администрирование данных 1С - Сервисные утилиты

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

См. также

Использование утилиты RING для проверки информации о программных лицензиях

Сервисные утилиты Защита ПО v8 Бесплатно (free)

В 1С есть утилита для проверки файлов с лицензиями 1С. Утилита существует довольно давно, но информация по ней разбросана, малопонятна и много где устарела, поэтому опишу свой опыт установки утилиты и работы с ней. Работаем под Windows.

16.12.2020    4062    budidich    9    

Настройка KDiff3 для исключения номеров строк в отчетах о сравнении конфигураций

Сервисные утилиты Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

Те, кто часто обновляют доработанные типовые конфигурации, а потом проверяют корректность обновления, сравнивая отчеты о сравнении конфигураций, знают, как мешают при этом строки вида "Объект присутствует только в первой|второй конфигурации: 99 - 99", "Изменено: 99 - 99".<br /> Но если вы, как и я, пользуетесь для этого утилитой KDiff3, то есть простой способ избавиться от таких строк.

21.09.2020    1294    fillin    2    

Удаленный рестарт сервиса 1С на Windows Server 2012 R2 (перезапуск агента 1С на кластере не под администратором)

Сервисные утилиты v8 Бесплатно (free)

Предоставление возможности определенным доменным пользователям производить перезапуск службы (агента 1С), не заходя на сам сервер и не имея административных прав (это освобождает администратора от необходимости заходить на сервер и делать перезапуск).

24.03.2019    3108    ellavs    2    

Сервер администрирования кластера серверов 1C:Предприятия и deployka

Сервисные утилиты Администрирование данных 1С v8 Бесплатно (free)

В данной статье познакомимся с сервером администрирования кластера серверов 1С:Предприятия, а конкретно с утилитами rac.exe и ras.exe, а также программой deployka, с помощью которых становится возможным администрирование кластера серверов 1С:Предприятие из командной строки.

04.04.2018    71962    Tavalik    37    

Удаление "snccntx". Батник

Сервисные утилиты v8 1cv8.cf Бесплатно (free)

Дополнение к известному скрипту по рестарту "СлужбаАгентаСервера1С" (САС1С)

20.03.2015    18668    Tommy82    6    

Публикация конфигурации 1С на GitHub

Сервисные утилиты Практика программирования Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

Статья показывает, как можно подготовить конфигурацию 1С к публикации в системах версионирования, отличных от хранилища конфигурации 1C. В операции задействован .Net framework и C#, позволяющий аккуратно распределить проект 1С по папкам. Пример публикации конфигурации на основе старых обновлений БСП четырехлетней давности (с 1.0.7.5 по 1.1.3.1) можно посмотреть по адресу https://github.com/elisy/ssl . Таким же образом теоретически можно публиковать конфигурации в другие системы версионирования.

23.02.2015    20708    Elisy    20    

Файловые базы *.1CD. Физическая структура. Восстановление.

Сервисные утилиты Администрирование данных 1С Тестирование и исправление v8 1cv8.cf Бесплатно (free)

Как устроены файловые базы? Что делать, если база упала? В статье приведены обзорные сведения об устройстве баз и возможностях восстановления. Приведено описание новых возможностей Tool_1CD.

06.06.2013    190920    awa    125    

Восстановление файловой версии базы данных *.1CD после ошибки динамического обновления.

Сервисные утилиты Архивирование (backup) Администрирование данных 1С Тестирование и исправление v8 1cv8.cf Бесплатно (free)

Восстановление работоспособности файл-серверной базы данных (файл *.1CD) после критической ошибки, возникшей в результате динамического обновления с последующим предупреждением "Внимание!!! При обновлении данных, после последней реструктуризации, произошла ошибка. Повторить обновление?".

02.10.2012    52180    djserega    78    

Ночная обработка

Сервисные утилиты v8 Бесплатно (free)

Ночной запуск обработки в 1С - 8

14.01.2010    12970    kitminsk    7    

К вопросу о зависающих фоновых заданиях в 8.1

Производительность и оптимизация (HighLoad) Сервисные утилиты Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

Фоновые задания в клиент-серверном варианте иногда зависают так, что снять их можно только путем перезапуска службы. Насколько я понял, никто не знает, что с этим делать. И я не знаю. Но могу поделиться опытом, как научиться с этим жить :)

03.09.2009    26131    bulpi    27    

К вопросу о регламентном задании – восстановлении последовательности

Практика программирования Сервисные утилиты v8 1cv8.cf Бесплатно (free)

В связи с тем, что, когда передо мной стояла подобная задача, материала в интернете я нашел очень мало. Попытаюсь немного компенсировать этот пробел. Заранее предупреждаю – информация для начинающих разработчиков :)

22.06.2009    20645    Dimasik2007    9