Форум программистов, компьютерный форум, киберфорум
v_svitere
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Оценить эту запись

Как подружить powershell и 1С(клиент-сервер)

Запись от v_svitere размещена 15.04.2016 в 12:24
Обновил(-а) v_svitere 15.04.2016 в 12:32

Иногда в 1С базе требуется очистить какой-нибудь регистр сведений, или удалить какую-нибудь запись, или получить какие-нибудь данные. Конечно это все делается без проблем - открывается 1С и дальше по накатанной. Но что делать если баз много, и действия необходимо делать очень часто? Приходится открывать немеренное количество 1с вводить кучу паролей итд.
НО можно попробовать автоматизировать этот процесс.
Автоматизировать пробовал РИБ типовую УТ.
Наверное многие слышали про COM-объект V82.Comconnector его то я и буду использовать.

Для пониманию принципа работы покажу программную очистку регистра сведений

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$COMConnector=New-Object -ComObject V82.Comconnector
try
      {
         $connectTOhost=$COMConnector.connect("Srvr=$hostname;Ref=$basename;Usr=obmen;Pwd=pass")
       }
catch
       {
          write-host "Не удалось подключиться к базе"
        }
$registr="ОжиданиеОтветаОтУзлов"
$manZ=[System.__ComObject].InvokeMember("РегистрыСведений",[System.Reflection.BindingFlags]::GetProperty,$null,$connectTOhost,$null)
    $manZ=[System.__ComObject].InvokeMember($registr,[System.Reflection.BindingFlags]::GetProperty,$null,$manZ,$null)
    $manZ=[System.__ComObject].InvokeMember("СоздатьНаборЗаписей",[System.Reflection.BindingFlags]::InvokeMethod,$null,$manZ,$null)
 
try
      {
         $del_result=[System.__ComObject].InvokeMember("Записать",[System.Reflection.BindingFlags]::InvokeMethod,$null,$manZ,$null)
         write-host "Записи удалены из регистра" 
       }
catch
       {
          write-host "Не удалось удалить записи из регистра"
        }
Все хорошо, записи удаляются, однако COM-соединение остается висеть, что конечно некрасиво. Получается к базе подключился, дело сделал, а за собой не почистил - непорядок.
Для удаления своего com-сеанса можно использовать следующий механизм

PowerShell
1
2
3
4
5
6
7
$serv_agent=$COMConnector.ConnectAgent($hostname)
$cluster=($serv_agent.GetClusters())[0]
$serv_agent.Authenticate($cluster,"","")
$baseinfo=$serv_agent.GetInfoBases($cluster)
$bases=$baseinfo|where{$_.name -eq $basename}
$dropsesCOM=$serv_agent.GetInfoBaseSessions($cluster,$bases)|where{$_.AppID -eq "COMConnection"}
$serv_agent.TerminateSession($cluster,$dropsesCOM)
Второй механизм может оказаться полезным например для автоматизации процесса "Тестирования исправления баз"
потому как для тестирования обязательно отсутствие сеансов, но об этом в следующий раз.
Размещено в Без категории
Показов 5703 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru