Иногда в 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) |
|
Второй механизм может оказаться полезным например для автоматизации процесса "Тестирования исправления баз"
потому как для тестирования обязательно отсутствие сеансов, но об этом в следующий раз. |