1C.Utils.psm1


. $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