1C.Utils.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143

. $PSScriptRoot\cmdlets\Clear-Cache1C.ps1
. $PSScriptRoot\cmdlets\CommonUtils.ps1
. $PSScriptRoot\cmdlets\Set-DebugServer1C.ps1
. $PSScriptRoot\cmdlets\Start-1C.ps1
. $PSScriptRoot\cmdlets\Stop-1C.ps1
. $PSScriptRoot\cmdlets\Uninstall-1C.ps1
. $PSScriptRoot\cmdlets\Parse-iBases.ps1

#region Utis

#----------------------------------------------------------------------------------------
# получает файл списка объектов для захвата из отчета сравнения
function Get-ObjectsXML
{
<#
    .SYNOPSIS
        Формирует xml-файл объектов метаданных для захвата в хранилище 1С.
    .DESCRIPTION
        Преобразует текстовый отчет сравнения в xml-файл списка объектов как требует платформа 1С
        для захвата объектов в хранилище 1С (см. справку ключа запуска платформы /ConfigurationRepositoryLock или /ConfigurationRepositoryUnLock).
    .PARAMETER ReportOfCompare
        Полный путь к тектовому отчету сравнения.
    .EXAMPLE
        #Получить список объектов метаданных для захвата в хранилище 1С:
         Get-ObjectsXML C:\ReportOfCompare.txt | Out-File C:\Objects.xml
#>

[CmdletBinding()]
param(
    [string]$ReportOfCompare # отчет о сравнении полный в текстовом виде
)
    $Name = ""
    $NameFactor = @{}
    Write-Verbose "<--Прочитанные строки-->"
    $Text = Get-Content $ReportOfCompare | where {$_ -match "^\t{2,4}\- (\*{3})?(\w+\.\w+|\w|<--|-->)"} | 
        foreach {
            if ($_ -match "^\t{2,3}\- \*{3}\w+\.\w+" -and $_ -notmatch "ТабличнаяЧасть")
            {
                $Name = $_.Trim().TrimStart("- ***")
                $NameFactor[$Name] = 0
                Write-Verbose $Name
            }
            elseif ($_ -match "\- (\*{3})?(\w+|<--|-->)" -and $_ -notmatch "Справочная")
            {                    
                $NameFactor[$Name] += 1
                Write-Verbose $_
            }
        }
        
    $XML = "<Objects xmlns=`"http://v8.1c.ru/8.3/config/objects`" version=`"1.0`">`n"
    $NameFactor.GetEnumerator() | Sort-Object -Property Key |
        foreach {if ($_.Value -gt 0) {$XML += "`t<Object fullName = {0} includeChildObjects= `"false`" />`n" -f $_.Key}}
    $XML += "</Objects>"

    if ($VerbosePreference -eq 'Continue')
    {
        Write-Host ""
        Write-Verbose "<--Количество измененных подчиненных элементов-->"
        $NameFactor.GetEnumerator() | Sort-Object -Property Key | foreach{Write-Verbose ("{0} {1}" -f $_.Value, $_.Key)}
        Write-Host ""
        Write-Verbose "<--Результирующий XML-->"
        $XML | foreach{Write-Verbose $_}
    }

    Return $XML
}# end of Get-ObjectsXML

#----------------------------------------------------------------------------------------
# получает файл списка ролей для захвата из текста сообщений конфигуратора
function Get-RolesXML
{
<#
    .SYNOPSIS
        Формирует xml-файл объектов метаданных для захвата в хранилище 1С.
    .DESCRIPTION
        Преобразует список сообщений конфигуратора в xml-файл списка объектов как требует платформа 1С
        для захвата объектов в хранилище 1С. Список сообщений выдается в окне сообщений конфигуратора
        при не удачной попытке удаления объектов метаданных в хранилище конфигурации 1С.
    .PARAMETER File
        Путь к файлу содержащий список сообщений конфигуратора при не удачном удалении метаданных.
    .PARAMETER Clipboard
        Сообщения конфигуратора взять из буфера обмена.
    .EXAMPLE
        #Получить список объектов метаданных для захвата в хранилище 1С:
        Get-ObjectsXML C:\ReportOfCompare.txt | Out-File C:\Objects.xml
#>

[CmdletBinding()]
param(
    [string]$File, # файл содержащий список ролей которые требуется захватить (выдается в окне сообщений конфигуратора при не удачном удалении)
    [switch]$Clipboard # Если истина значит в буфер скопирован текст содержащий роли (из окна сообщений конфигуратора при не удачном удалении)
)

    if($Clipboard)
    {
        $TextClipboard = Get-Clipboard
        $tmp = New-TemporaryFile
        $TextClipboard | Out-File $tmp.FullName
        $File = $tmp.FullName
    }
    
    $ListRole = @{}
    $Text = Get-Content $File | where {$_ -match "(Роль\.|Role\.)"} | 
        foreach {
            $Role = $_.Trim()
            # обрежем все перед Роль.
            $IndexRole = $Role.IndexOf("Роль.")
            $Role = $Role.Substring($IndexRole, $Role.Length-$IndexRole)
            # Вырежем от начала строки до первого TAB если есть
            $IndexTab = $Role.IndexOf("`t")
            if ($IndexTab -gt 0) {$Role = $Role.Substring(0, $IndexTab)}
            # Вырежем от начала строки до первого Пробела если есть
            $IndexSpace = $Role.IndexOf(" ")
            if ($IndexSpace -gt 0) {$Role = $Role.Substring(0, $Role.Length-$IndexSpace)}
            #Write-Verbose ("{0} {1} {2} {3} {4}" -f $Role, $IndexRole, $IndexSpace, $IndexTab, $Role.Length)

            $ListRole[$Role] = 0
        }
        
    $XML = "<Objects xmlns=`"http://v8.1c.ru/8.3/config/objects`" version=`"1.0`">`n"
    $ListRole.GetEnumerator() | Sort-Object -Property Key |
        foreach {$XML += "`t<Object fullName = {0} includeChildObjects= `"false`" />`n" -f $_.Key}
    $XML += "</Objects>"

    if ($VerbosePreference -eq 'Continue')
    {
        Write-Host ""
        Write-Verbose "<--Прочитанные роли-->"
        $ListRole.GetEnumerator() | Sort-Object -Property Key | foreach{Write-Verbose ("{0}" -f $_.Key)}
        Write-Host ""
        Write-Verbose "<--Результирующий XML-->"
        $XML | foreach{Write-Verbose $_}
    }

    if($Clipboard)
    {
        Remove-Item $File
    }

    Return $XML
}# end of Get-RolesXML

#endregion Utils