cmdlets/Designer1C.ps1

. $PSScriptRoot\CommonUtils\classLog.ps1
. $PSScriptRoot\CommonUtils\CommonUtils.ps1

function New-Designer1C {
    <#
    .SYNOPSIS
        Возвращает экземпляр класса Designer1c.
    .DESCRIPTION
        Создает объект класса Designer1C позволяющий работать с командной строкой 1С в объектной технике.
    .NOTES
        В методе класса CreateInfoBaseSrvr для задания типа СУБД используется перечисление:
        enum TypeDBMS {
            MSSQLServer,
            PostgreSQL,
            IBMDB2,
            OracleDatabase
        }
        Перечисление добавляется в текущую сессию методом AddType при первом вызове New-Designer1C.
        После после чего оно будет доступно как обычный тип.
        Например: [TypeDBMS]::MSSQLServer
         
    .PARAMETER PathBase
        Задается адрес расположения базы (можно установить методом SetBase):
            - для файловой базы c:\CatalogBases1C\NameBase
            - для клиент-серверной базы NameServer[:NumberPort]\NameBase
            - для базы на веб-сервере http://NameWebServer/NameBase
        Псевдонимы: b
    .PARAMETER UserName
        Имя пользователя базы (можно установить методом SetUserBase).
        Псевдонимы: u
    .PARAMETER PasswordUser
        Пароль пользователя базы (можно установить методом SetUserBase).
        Псевдонимы: p
    .PARAMETER IBName
        Имя базы как оно задано в окне запуске 1С.
        Псевдонимы: ib
    .PARAMETER Platform
        Номер версии платформы 8.3.XX.XXXX.
        Если не задан, то будет произведен поиск в стандартном каталоге установки
        последней установленной версии платформы.
        Игнорируется если задан параметр IBName.
    .PARAMETER LogFile
        Полный путь к лог-файлу.
        Псевдонимы: l, log
    .PARAMETER Settings
        Путь к файлу значений полей класса выгруженных методом ExportToYAML или ExportToJSON
        (можно загрузить методом ImportFrom)
        Псевдонимы: set, import
    .EXAMPLE
        #Создать объект для работы с командной строкой платформы
        $Designer = New-Designer1C 'c:\Namebase' 'Администратор'
    .EXAMPLE
        #Создать базу на сервере 1С при этом сервер СУБД имеет такое же имя как и имя сервера 1С.
        #По умолчанию тип СУБД имеет значение перечисления [TypeDBMS]::MSSQLServer
        #Тип перечисления добавляется в текущую сессию методом AddType при первом вызове New-Designer1C.
 
        $Designer = New-Designer1C 'ИмяСервера1С\ИмяБазы' 'Администратор'
        $Designer.CreateInfoBaseSrvr('ИмяАдминистратораСУБД', 'ПарольАдминистратораСУБД')
    .EXAMPLE
        #Создать базу на сервере 1С при этом имя сервера СУБД отличается от имени сервера 1С.
        #Для задания типа СУБД используется явное указание значения перечисления.
        #Тип перечисления добавляется в текущую сессию методом AddType при первом вызове New-Designer1C.
 
        $Designer = New-Designer1C 'ИмяСервера1С\ИмяБазы' 'Администратор'
        $Designer.CreateInfoBaseSrvr([TypeDBMS]::PostgreSQL, 'ИмяСервераСУБД', 'ИмяАдминистратораСУБД', 'ПарольАдминистратораСУБД')
    .EXAMPLE
        #Посмотреть все свойства и методы класса (со всеми перегрузками методов)
        New-Designer1C | Get-Member | Format-List
#>

    [CmdletBinding()]
    param(
        [Alias("b")][string]$PathBase='',
        [Alias("u")][string]$UserName='',
        [Alias("p")][string]$PasswordUser='',
        [Alias("ib")][string]$IBName='',
        [string]$Platform='',
        [Alias("l", "log")][string]$LogFile='',
        [Alias("set", "import")][string]$Settings=''
    )
    
    Add-Type -TypeDefinition  "
        public enum TypeDBMS {
            MSSQLServer,
            PostgreSQL,
            IBMDB2,
            OracleDatabase
        }"

    
    $Designer = New-Object Designer1C($PathBase, $UserName, $PasswordUser, $IBName, $Platform, $LogFile)
    if ('' -ne $Settings) {
        $Designer.ImportFrom($Settings)
    }
    $Designer
}# end New-Designer1C

# Перечисление типы серверов баз данных для создания базы данных на сервере
enum TypeDBMS {
    MSSQLServer
    PostgreSQL
    IBMDB2
    OracleDatabase
}

# описание класса
class Designer1C {
    #region Properties
    hidden [String]$PathBase=''
    hidden [String]$ConnectionString=''
    hidden [hashtable]$UserBase=$null
    [String]$Storage=''
    hidden [hashtable]$UserStorage=$null
    hidden [string]$IBName=''
    hidden [string]$Platform=''
    hidden [String]$Exe1cv8=''
    $Log = $null
    hidden [String]$NameBase=''

    [bool]$Debug=$false
    hidden [bool]$Done=$false
    #endregion Properties

    #region Constructor
    Designer1C() { $this.SetBase('', '', '', '', '','') }
    Designer1C([String]$PathBase, [String]$UserName, [String]$PasswordUser, [String]$IBName, [String]$Platform, [string]$LogFile) {
        $this.SetBase($PathBase, $UserName, $PasswordUser, $IBName, $Platform, $LogFile)
    }
    #endregion Constructor

    #region Methods
    [bool] CommandIsDone() { return $this.Done }

    #region SetBase
    [void] SetBase() { $this.SetBase('', '', '', '', '','') }
    [void] SetBase([String]$PathBase) { $this.SetBase($PathBase, '', '', '', '','') }
    [void] SetBase([String]$PathBase, [String]$UserName, [String]$PasswordUser) {
        $this.SetBase($PathBase, $UserName, $PasswordUser, '', '','')
    }
    [void] SetBase([String]$PathBase, [String]$UserName, [String]$PasswordUser, [String]$LogFile) {
        $this.SetBase($PathBase, $UserName, $PasswordUser, '', '', $LogFile)
    }
    [void] SetBase([String]$PathBase, [String]$UserName, [String]$PasswordUser,`
                    [String]$IBName, [String]$Platform, [string]$LogFile) {
        
        $this.PathBase = $PathBase
        $this.SetLog($LogFile)
        $this.IBName = $IBName
        $this.Platform = $Platform
        $this.SetNameBase()
        $this.SetConnectionString()
        if ('' -ne $UserName){
            $this.SetUserBase($UserName, $PasswordUser)
        }
        $this.SetExe1cv8()

    }# end SetBase
    #endregion SetBase

    [void] SetLog() { $this.SetLog('', $false)}
    [void] SetLog([string]$FullName) { $this.SetLog($FullName, $true)}
    [void] SetLog([string]$FullName, [bool]$Append) {
        if ($null -eq $this.Log) {
            $this.Log = New-Log $FullName -Append:$Append
        } elseif ('' -ne $FullName) {
            $this.Log.SetFullName($FullName, $Append)
        }
    }# end SetLog

    [string] GetNameBase() {
        if ('' -eq $this.NameBase) { $this.SetNameBase() }
        return $this.NameBase
    }

    hidden [void] SetNameBase() {
        $this.NameBase = $this.IBName
        if ('' -ne $this.PathBase) {
            if ($this.PathBase.ToLower().IndexOf('http://') -ge 0 `
                -or $this.PathBase.ToLower().IndexOf('https://') -ge 0 `
                -or (Test-Path $this.PathBase) `
                -or $this.PathBase.split('\').Length -eq 2) {

                $Path = $this.PathBase.TrimEnd('\').TrimEnd('/')
                $Index = $Path.LastIndexOf('\')
                if($Index -lt 0) {$Index = $Path.LastIndexOf('/')}
                $this.NameBase = $Path.Substring($Index+1)
            }
        }
    }# end SetNameBase

    hidden SetConnectionString() {
        if ('' -ne $this.IBName) {
            $this.ConnectionString = '/IBName "{0}"' -f $this.IBName.Replace('"','""')
        } 
        elseif ('' -ne $this.PathBase) {
            if ($this.PathBase.ToLower().IndexOf('http://') -ge 0 `
                -or $this.PathBase.ToLower().IndexOf('https://') -ge 0) {

                $this.ConnectionString = '/WS"{0}"' -f $this.PathBase

            } elseif (Test-Path $this.PathBase) {
                $this.ConnectionString = '/F"{0}"' -f $this.PathBase

            } elseif ($this.PathBase.split('\').Length -eq 2) {
                $this.ConnectionString = '/S"{0}"' -f $this.PathBase
            }
        }
    }# end SetConnectionString

    hidden [string] GetConnectionString() { return $this.ConnectionString }

    [string] GetIBName(){ return $this.IBName }

    [void] SetIBName([string]$IBName){  $this.SetIBName($IBName, '', '', '') }
    [void] SetIBName([string]$IBName, [String]$UserName, [String]$PasswordUser, [string]$LogFile){ 
        $this.IBName = $IBName
        $this.SetLog($LogFile)
        $this.PathBase = ''
        $this.Platform = ''
        if ('' -ne $UserName){
            $this.SetUserBase($UserName, $PasswordUser)
        }
        $this.SetNameBase()
        $this.SetConnectionString()
        $this.SetExe1cv8()
    }

    [string] GetExe1cv8() { return $this.Exe1cv8 }

    #region SetExe1cv8
    <# В SetExe1cv8 можно передать:
        - пустую строку - будет произведен поиск в стандартном каталоге последней установленной версии платформы
        - каталог установки 1С - будет произведен поиск последней установленной версии
        - номер версии платформы в формате 8.3.XX.XXXX - в стандартном каталоге установки, в подкаталоге с заданным номером версии
                                                         будет произведен поиск 1cv8.exe
        - непосредственно сам exe файл платформы - если не задан IBName, то установит его,
                                                    если задан IBName устанавливает '\common\1cestart.exe' из стандартного каталога
    #>

    [void] SetExe1cv8() { $this.SetExe1cv8('') }

    [void] SetExe1cv8([string]$InstalledLocation1C_VersionPlatform1C_Exe1cv8) {
        $exe = ''
        $VersionPlatform1C = ''
        $InstalledLocation1C = Get-InstalledLocation1C

        #region parsing InstalledLocation1C_VersionPlatform1C_Exe1cv8
        if ($InstalledLocation1C_VersionPlatform1C_Exe1cv8 -match '^\d+\.\d+\.\d+\.\d+$')
        {
            $VersionPlatform1C = $InstalledLocation1C_VersionPlatform1C_Exe1cv8
        } 
        elseif ('' -ne $InstalledLocation1C_VersionPlatform1C_Exe1cv8`
                    -and (Test-Path $InstalledLocation1C_VersionPlatform1C_Exe1cv8)) 
        {
            $DirFile = Get-Item $InstalledLocation1C_VersionPlatform1C_Exe1cv8
            if ($DirFile.PSIsContainer)
            {
                $InstalledLocation1C = $DirFile.FullName
                if ($InstalledLocation1C[-1] -ne '\' -or $InstalledLocation1C[-1] -ne '/') {
                    $InstalledLocation1C += '\'
                }
            } 
            elseif ($DirFile.Extension -eq '.exe')
            {
                $exe = $InstalledLocation1C_VersionPlatform1C_Exe1cv8
            }
        }
        Write-Verbose ('exe1cv8 = {0}' -f $exe)
        Write-Verbose ('VersionPlatform1C = {0}' -f $VersionPlatform1C)
        Write-Verbose ('InstalledLocation1C = {0}' -f $InstalledLocation1C)
        #endregion parsing InstalledLocation1C_VersionPlatform1C_Exe1cv8

        #region GetExe
        if ('' -ne $this.IBName)
        {
            $this.Platform = ''
            $this.Exe1cv8 = $InstalledLocation1C + 'common\1cestart.exe'
        }
        elseif ('' -ne $exe -and (Test-Path $exe))
        {
            $this.Exe1cv8 = $exe
            $this.Platform = ''
            if ($exe -match '\\\d+\.\d+\.\d+\.\d+\\' -or $exe -match '\/\d+\.\d+\.\d+\.\d+\/'){
                $this.Platform = $Matches[0].Trim('\').Trim('/')
            }
        } 
        elseif ('' -ne $VersionPlatform1C)
        {
            $this.Platform = $VersionPlatform1C
            $InstalledLocation1C += $this.Platform
            if (Test-Path $InstalledLocation1C) {
                $ExePlatform = Get-ChildItem $InstalledLocation1C -Name '1cv8.exe' -Recurse | Sort-Object -Descending
                if ($ExePlatform -is 'System.Array' -and 0 -ne $ExePlatform.Length) {
                    $ExePlatform  = $ExePlatform[0]
                }
                if ($InstalledLocation1C[-1] -ne '\' -or $InstalledLocation1C[-1] -ne '/') {
                    $InstalledLocation1C += '\'
                }
                $this.Exe1cv8 = $InstalledLocation1C + $ExePlatform
            }
        }
        #endregion GetExe

        if ('' -eq $this.Exe1cv8)
        {
            # Найдем последнюю установленную версию в стандартном каталоге установки
            $ExePlatform = Get-ChildItem $InstalledLocation1C -Name '1cv8.exe' -Recurse | Sort-Object -Descending
            if ($ExePlatform -is 'System.Array' -and 0 -ne $ExePlatform.Length) {
                $ExePlatform  = $ExePlatform[0]
            }
            $this.Platform = ($ExePlatform.Split('\'))[0]
            $this.Exe1cv8  = $InstalledLocation1C + $ExePlatform
        }
        if ('' -eq $this.Platform`
            -and $this.Exe1cv8 -match '\\\d+\.\d+\.\d+\.\d+\\' -or $exe -match '\/\d+\.\d+\.\d+\.\d+\/') 
        {
            $this.Platform = $Matches[0].Trim('\').Trim('/')
        }
    }# end SetExe1cv8
    #endregion SetExe1cv8
    
    [string] GetPlatform(){ return $this.Platform }

    [hashtable] GetUserBase() {
        if ($null -eq $this.UserBase){ $this.UserBase = @{Name=''; Password=''} }
        return $this.UserBase
    }# end GetUserBase

    [void] SetUserBase([string]$UserName) {
        $this.SetUserBase($UserName, '')
    }# end SetUserBase
    [void] SetUserBase([string]$UserName, [string]$UserPassword) {
        $this.UserBase = @{Name=$UserName; Password=$UserPassword}
    }# end SetUserBase

    hidden [string] GetLoginBase() {
        $Login = @()
        if ($null -ne $this.UserBase){
            if ('' -ne $this.UserBase.Name){
                $Login += '/N"{0}"' -f $this.UserBase.Name.Trim('"')
                if ('' -ne $this.UserBase.Password){
                    $Login += '/P"{0}"' -f $this.UserBase.Password
                }
            }
        }
        return ([string]$Login).Trim()
    }# end GetLoginBase

    [void] SetStorage([string]$Storage, [string]$UserName) { $this.SetStorage($Storage, $UserName, '') }
    [void] SetStorage([string]$Storage, [string]$UserName, [string]$UserPassword) {
        $this.Storage = $Storage
        $this.UserStorage = @{Name=$UserName; Password=$UserPassword}
    }# end SetStorage

    [hashtable] GetUserStorage() {
        if ($null -eq $this.UserStorage){ $this.UserStorage = @{Name=''; Password=''} }
        return $this.UserStorage
    }# end GetUserStorage

    hidden [string] GetLoginStorage() {
        $Login = @()
        if ('' -ne $this.Storage) {
            $Login += '/ConfigurationRepositoryF"{0}"' -f $this.Storage.Trim('"')
            if ($null -ne $this.UserStorage){
                if ('' -ne $this.UserStorage.Name){
                    $Login += '/ConfigurationRepositoryN"{0}"' -f $this.UserStorage.Name.Trim('"')
                    if ('' -ne $this.UserStorage.Password) {
                        $Login += '/ConfigurationRepositoryP"{0}"' -f $this.UserStorage.Password
                    }
                }
            }
        }
        return ([string]$Login).Trim()
    }# end GetLoginStorage
    
    #region ExportTo
    [string] ExportToYAML(){
        return $this.ExportTo('', 'YAML')
    }
    [string] ExportToYAML([string]$PathFile){
        return $this.ExportTo($PathFile, 'YAML')
    }
    [string] ExportToJSON(){
        return $this.ExportTo('', 'JSON')
    }
    [string] ExportToJSON([string]$PathFile){
        return $this.ExportTo($PathFile, 'JSON')
    }
    hidden [string] ExportTo([string]$PathFile, [string]$Format){

        $Result = ''
        if ('' -eq $PathFile) {
            if ('JSON' -eq $Format) {
                $Result = ConvertTo-Json $this
            } 
            elseif ('YAML' -eq $Format){
                $Result = ConvertTo-Yaml -Data $this
            }
        } else {
            if ('JSON' -eq $Format) {
                ConvertTo-Json $this | Out-File $PathFile
            }
            elseif ('YAML' -eq $Format) {
                ConvertTo-Yaml -Data $this | Out-File $PathFile
            }
        }
        return $Result

    }
    #endregion ExportTo

    #region ImportFrom
    [void] ImportFrom([string]$PathFile){

        if ($null -eq $PathFile -or '' -eq $PathFile -or !(Test-Path $PathFile)){
            return
        }

        $string_cfg = Get-Content $PathFile -Raw

        $FormatConfig = "YAML"
        if ($string_cfg.Trim()[0] -eq "{") { $FormatConfig = "JSON" }

        $DataClass = $null
        if("YAML" -eq $FormatConfig) {
            $DataClass = ConvertFrom-Yaml -Yaml $string_cfg
        } elseif("JSON" -eq $FormatConfig) {
            $DataClass = ConvertFrom-Json $string_cfg | Convert-PSObjectToHashtable
        }

        if ($null -eq $DataClass) { 
            Write-Warning 'Не удалось распознать формат данных. На текущий момент поддерживаются форматы YAML и JSON.'
            return 
        }

        $this.PathBase = $DataClass.PathBase
        $this.SetLog($DataClass.Log.FullName)
            $this.Log.Silent = $DataClass.Log.Silent
            $this.Log.TemplateMessage = $DataClass.Log.TemplateMessage
            $this.Log.Symbol = $DataClass.Log.Symbol
            $this.Log.AmountSymbol = $DataClass.Log.AmountSymbol
        $this.IBName = $DataClass.IBName
        $this.Platform = $DataClass.Platform
        $this.NameBase = $DataClass.NameBase
        $this.SetConnectionString()
                
        $this.UserBase = $DataClass.UserBase
        $this.Storage = $DataClass.Storage
        $this.UserStorage = $DataClass.UserStorage

        if ('' -eq $this.IBName) { 
            $this.Platform = $DataClass.Platform
            $this.Exe1cv8 = $DataClass.Exe1cv8
        }
        else { 
            $this.SetExe1cv8() 
        }

        if ($null -ne $DataClass.Debug) { $this.Debug = $DataClass.Debug }
        if ($null -ne $DataClass.Done) { $this.Done = $DataClass.Done }
    }
    #endregion ImportFrom


    #region RunEnterprise
    [void] RunEnterprise(){
        $Wait = $false
        $Enterprise = $true
        $this.Run('', @(), $Wait, $Enterprise)
    }
    [void] RunEnterprise([string]$Command){
        $Wait = $false
        $Enterprise = $true
        $this.Run($Command, @(), $Wait, $Enterprise)
    }

    [void] RunEnterprise([string]$Command, [bool]$Wait){
        $Enterprise = $true
        $this.Run($Command, @(), $Wait, $Enterprise)
    }

    [void] RunEnterprise([string]$Command, [System.Array]$Parametrs){
        $Wait = $false
        $Enterprise = $true
        $this.Run($Command, $Parametrs, $Wait, $Enterprise)
    }

    [void] RunEnterprise([string]$Command, [System.Array]$Parametrs, [bool]$Wait){
        $Enterprise = $true
        $this.Run($Command, $Parametrs, $Wait, $Enterprise)
    }
    #endregion RunEnterprise

    
    [void] Open(){
        $Wait = $false
        $Enterprise = $false
        $this.Run('', @(), $Wait, $Enterprise)
    }

    #region Run
    [void] Run([string]$Command){
        $Wait = $true
        $Enterprise = $false
        $this.Run($Command, @(), $Wait, $Enterprise)
    }

    [void] Run([string]$Command, [bool]$Wait){
        $Enterprise = $false
        $this.Run($Command, @(), $Wait, $Enterprise)
    }

    [void] Run([string]$Command, [System.Array]$Parametrs){
        $Wait = $true
        $Enterprise = $false
        $this.Run($Command, $Parametrs, $Wait, $Enterprise)
    }

    [void] Run([string]$Command, [System.Array]$Parametrs, [bool]$Wait){
        $Enterprise = $false
        $this.Run($Command, $Parametrs, $Wait, $Enterprise)
    }

    [void] Run([string]$Command, [System.Array]$Parametrs, [bool]$Wait, [bool]$Enterprise){
        $WatchKey = [System.Diagnostics.Stopwatch]::StartNew() # секундомер команды
        $WatchKey.Start()

        $Command = $Command.Replace("<NameBase>", $this.GetNameBase())
        $Command = $Command.Replace("<Date>", (Get-Date -Format yyyyMMdd))
        $Command = $Command.Replace("<Time>", (Get-Date -Format hhmm))

        $Arguments = $this.GetArguments($Command, $Parametrs)
        if ($Enterprise){
            $Arguments[0] = 'ENTERPRISE'
        }
        if ($Wait -and '' -ne $this.log.GetFullName()){
            $Arguments += ("/Out {0} -NoTruncate" -f $this.log.GetFullName())
        }
        
        #/DumpResult <имя файла>
        #Записать результат работы конфигуратора в файл. Результат ‑ число (0 ‑ в случае успеха).
        $tmpFile = New-TemporaryFile
        $Arguments += ("/DumpResult {0}" -f $tmpFile)
        
        $Indent = 12
        if ('' -eq $Command){
            $this.Log.Write("Запуск".PadRight($Indent) + $Arguments[0])
        } else {
            $this.Log.Write("Выполняется".PadRight($Indent) + $Command)
        }
        #$Silent = ('' -ne $this.Log.FullName)
        $Silent = $true
        $RealCommand = '"{0}" {1}' -f $this.exe1cv8, [string]$Arguments
        $this.Log.Write(("Команда".PadRight($Indent) + $RealCommand), $Silent)
        $this.Done = $false
        if(!$this.Debug) {
            $process1cv8 = Start-Process -FilePath $this.exe1cv8 -ArgumentList $Arguments -Wait:$Wait -PassThru
            $buffer = (Get-Content $tmpFile)
            if ($buffer.Length -gt 0) {
                Write-Verbose ('process1cv8.ExitCode = {0}' -f $process1cv8.ExitCode)
                Write-Verbose ('DumpResult = {0} (0 = успех, 1 = ошибка)' -f $buffer[0])
                $this.Done = ($buffer[0] -eq '0')
            }
        }
        $WatchKey.Stop()
        #Запись в лог замера времени для ключа
        if ($Wait){
            $this.Log.Write("Затрачено".PadRight($Indent) + ("{0:hh}:{0:mm}:{0:ss}" -f $WatchKey.Elapsed))
        }
        Remove-Item -Path $tmpFile
    }# end Run

    [System.Array] GetArguments(){
        return GetArguments('', @())
    }
    [System.Array] GetArguments([String]$Command){
        return GetArguments($Command, @())
    }
    hidden [System.Array] GetArguments([string]$Command, [System.Array]$Parametrs){
        
        $Arguments = @('DESIGNER')
        if ($Command.ToUpper().Contains("CREATEINFOBASE")){
            $Arguments = @('CREATEINFOBASE')
        } else {
            $Arguments += $this.GetConnectionString()
            $Arguments += $this.GetLoginBase()
            $Arguments += $this.GetLoginStorage()
            $Arguments += $Command
        }
        $Arguments += [string]$Parametrs

        $Arguments = $Arguments | Where-Object{$_ -ne ''}

        return $Arguments
    }
    #endregion Run

    #endregion Methods
    

    #region CreateInfoBase
    #region File
    [void] CreateInfoBaseFile() { $this.CreateInfoBaseFile('') }
    [void] CreateInfoBaseFile([string]$NameToList) {
        $Param = @(("File={0};" -f $this.PathBase))
        if ('' -ne $NameToList){ $Param += "/AddList $NameToList" }
        $this.Run("CREATEINFOBASE", $Param)
    }
    #endregion File

    #region Srvr
    <#
    Параметры подключения:
        Srvr - ИмяСервера[:НомерПорта] <- $this.PathBase <- NameServer:Port\NameBase
        Ref - Имя базы на сервере 1С <- $this.PathBase <- NameServer:Port\NameBase
        DBMS - Тип сервера СУБД может быть:
            - MSSQLServer
            - PostgreSQL
            - IBMDB2
            - OracleDatabase
        DBSrvr - Имя сервера СУБД
        DB - имя базы на сервере СУБД = Ref
        DBUID - логин пользователя СУБД с правами на создание баз
        DBPwd - пароль пользователя СУБД
        SQLYOffs - смещение дат = 2000
        Locale - Если параметр не задан, то будут использованы региональные установки текущей информационной базы.
                Допустимые значения такие же, как у параметра <Форматная строка> метода Формат().
                Необязательный.
        CrSQLDB - создать базу в случае ее отсутствия. Может быть Y или N без учета регистра. Если не задан, то N.
        SchJobDn - В созданной базе запретить выполнение регламентных созданий. Может быть Y или N без учета регистра.
                    Если не задан, то N.
        SUsr - Имя администратора кластера, в котором должен быть создан начальный образ.
                Параметр необходимо задавать, если в кластере определены администраторы
                и для них аутентификация операционной системы не установлена или не подходит.
        SPwd - Пароль администратора кластера.
    #>

    hidden [void] TestTypeDBMS([TypeDBMS]$DBMS){
       $this.Log.OutValue("$DBMS = [TypeDBMS]::MSSQLServer", $DBMS -eq [TypeDBMS]::MSSQLServer)
       $this.Log.OutValue("$DBMS = [TypeDBMS]::PostgreSQL", $DBMS -eq [TypeDBMS]::PostgreSQL)
       $this.Log.OutValue("$DBMS = [TypeDBMS]::IBMDB2", $DBMS -eq [TypeDBMS]::IBMDB2)
       $this.Log.OutValue("$DBMS = [TypeDBMS]::OracleDatabase", $DBMS -eq [TypeDBMS]::OracleDatabase)
    }
    [void] CreateInfoBaseSrvr([string]$UserDBSrvr, [string]$PwdUserDBSrvr) {

        $this.CreateInfoBaseSrvr([TypeDBMS]::MSSQLServer,'', '', $UserDBSrvr, $PwdUserDBSrvr, 'Y', 'N', '', '', '')
    }
    [void] CreateInfoBaseSrvr([string]$UserDBSrvr, [string]$PwdUserDBSrvr, [string]$NameToList) {
        $this.CreateInfoBaseSrvr([TypeDBMS]::MSSQLServer,'', '', $UserDBSrvr, $PwdUserDBSrvr, 'Y', 'N', $NameToList, '', '')
    }
    [void] CreateInfoBaseSrvr([TypeDBMS]$DataBaseManagmentSystem, [string]$NameDBSrvr,`
                             [string]$UserDBSrvr, [string]$PwdUserDBSrvr) {
        $this.CreateInfoBaseSrvr($DataBaseManagmentSystem, $NameDBSrvr, '', $UserDBSrvr, $PwdUserDBSrvr,`
                                'Y', 'N', '', '', '')
    }
    [void] CreateInfoBaseSrvr([TypeDBMS]$DataBaseManagmentSystem, [string]$NameDBSrvr,`
                             [string]$UserDBSrvr, [string]$PwdUserDBSrvr, [string]$NameToList) {
        $this.CreateInfoBaseSrvr($DataBaseManagmentSystem, $NameDBSrvr, '', $UserDBSrvr, $PwdUserDBSrvr,`
                                'Y', 'N', $NameToList, '', '')
    } 
    [void] CreateInfoBaseSrvr([TypeDBMS]$DataBaseManagmentSystem, [string]$NameDBSrvr, [string]$NameDB,`
                                [string]$UserDBSrvr, [string]$PwdUserDBSrvr,`
                                [string]$CreateDBifNull, [string]$ScheduleJobOff, [string]$NameToList,`
                                [string]$AdminCluster, [string]$PwdAdminCluster) 
    {
        $Names = $this.PathBase.Split('\')
        $Srvr = $Names[0]
        $Ref = $Names[1]

        $Srvr1C = "Srvr=$Srvr;Ref=$Ref;"
        
        if ('' -eq $NameDBSrvr){ $NameDBSrvr =  $Srvr}
        if ('' -eq $NameDB){ $NameDB =  $Ref}
        if ($null -eq $DataBaseManagmentSystem){ $DataBaseManagmentSystem = [TypeDBMS]::MSSQLServer }
        
        $DBMS = "DBMS=$DataBaseManagmentSystem;DBSrvr=$NameDBSrvr;DB=$NameDB;DBUID=$UserDBSrvr;"
        if ('' -ne $PwdUserDBSrvr){ $DBMS += "DBPwd=$PwdUserDBSrvr;" }
        
        $AddSettings = "SQLYOffs=2000;"
        if ('' -ne $CreateDBifNull){ $AddSettings += "CrSQLDB=$CreateDBifNull;" }
        if ('' -ne $ScheduleJobOff){ $AddSettings += "SchJobDn=$ScheduleJobOff;" }
        if ('' -ne $AdminCluster){ $AddSettings += "SUsr=$AdminCluster;" }
        if ('' -ne $PwdAdminCluster){ $AddSettings += "SPwd=$PwdAdminCluster;" }
        # $LocaleSettings = "Locale=$Locale;"

        $Param = @("$Srvr1C$DBMS$AddSettings")
        if ('' -ne $NameToList){ $Param += "/AddList $NameToList" }
        $this.Run("CREATEINFOBASE", $Param)
    }
    #endregion Srvr
    #endregion CreateInfoBase


    #region Unloading_and_loading_of_information_base
    [void] DumpIB([string]$FileDT){
        $this.Run(('/DumpIB "{0}"' -f $FileDT))
    }# end DumpIB

    [void] RestoreIB([string]$FileDT){
        $this.Run(('/RestoreIB "{0}"' -f $FileDT))
    }# end RestoreIB
    #endregion Unloading_and_loading_of_information_base


    #region Configuration_and_extensions
    #region DumpCfg
    [void] DumpCfg([string]$FileCF){
        $this.Run(('/DumpCfg "{0}"' -f $FileCF))
    }

    [void] DumpCfg([string]$FileCF, [string]$NameExtension){
        $this.Run(('/DumpCfg "{0}" -Extension "{1}"' -f $FileCF, $NameExtension))
    }
    #endregion DumpCfg


    #region LoadCfg
    [void] LoadCfg([string]$FileCF){
        $this.LoadCfg($FileCF, $false)
    }

    [void] LoadCfg([string]$FileCF, [bool]$UpdDBCfg){
        $Param = @()
        if ($UpdDBCfg){ $Param += $this.GetCommandUpdateDBCfg() }
        $this.Run(('/LoadCfg "{0}"' -f $FileCF), $Param)
    }

    [void] LoadCfg([string]$FileCF, [string]$NameExtension){
        $this.LoadCfg($FileCF, $NameExtension, $false)
    }

    [void] LoadCfg([string]$FileCF, [string]$NameExtension, [bool]$UpdDBCfg){
        $Param = @()
        if ($UpdDBCfg){ $Param += $this.GetCommandUpdateDBCfg() }
        $this.Run(('/LoadCfg "{0}" -Extension "{1}"' -f $FileCF, $NameExtension), $Param)
    }
    #endregion LoadCfg


    #region UpdateDBCfg
    [void] UpdateDBCfg(){ $this.UpdateDBCfg($false) }
    [void] UpdateDBCfg([bool]$Dynamic){
        $this.Run($this.GetCommandUpdateDBCfg($Dynamic))
    }# end UpdateDBCfg

    hidden [string] GetCommandUpdateDBCfg(){ return $this.GetCommandUpdateDBCfg($false) }
    hidden [string] GetCommandUpdateDBCfg([bool]$Dynamic){
        $ModeDynamic = '-Dynamic–'
        if ($Dynamic){ $ModeDynamic = '-Dynamic+' }
        return "/UpdateDBCfg $ModeDynamic"
    }# end GetCommandUpdateDBCfg
    #endregion UpdateDBCfg


    #region DumpConfigToFiles
    [void] DumpConfigToFiles([string]$UploadDirectory){
        $this.DumpConfigToFiles($UploadDirectory, '')
    }
    [void] DumpConfigToFiles([string]$UploadDirectory, [string]$ListFiles){
        $Param = @()
        if ('' -ne $ListFiles){ $Param += $this.GetListFiles($ListFiles) }
        $this.Run(('/DumpConfigToFiles "{0}"' -f $UploadDirectory), $Param)
    }
    #endregion DumpConfigToFiles
    
    hidden [string] GetListFiles($ListFiles){
        
        $i = 0
        $Key = '-listFiles'
        foreach($line in [System.IO.File]::ReadLines($ListFiles)){
            if($line -match ','){
                $Key = '-Files'
                break
            }
            if ($i -eq 3) { break }
            $i += 1
        }
        return ('{0} "{1}"' -f $Key, $ListFiles)
    }

    #region LoadConfigFromFiles
    [void] LoadConfigFromFiles([string]$LoadDirectory){
        $this.LoadConfigFromFiles($LoadDirectory, '', $false)
    }
    [void] LoadConfigFromFiles([string]$LoadDirectory, [bool]$UpdDBCfg){
        $this.LoadConfigFromFiles($LoadDirectory, '', $UpdDBCfg)
    }
    [void] LoadConfigFromFiles([string]$LoadDirectory, [string]$ListFiles, [bool]$UpdDBCfg){
        $Param = @()
        if ('' -ne $ListFiles){ $Param += $this.GetListFiles($ListFiles) }
        if ($UpdDBCfg){ $Param = @($this.GetCommandUpdateDBCfg()) }
        $this.Run(('/LoadConfigFromFiles "{0}"' -f $LoadDirectory), $Param)
    }
    #endregion LoadConfigFromFiles
    #endregion Configuration_and_extensions


    #region Configuration_storage_commands
    
    #region RepositoryBindCfg
    [void] RepositoryBindCfg(){
        $this.RepositoryBindCfg($true, $true, '')
    }
    [void] RepositoryBindCfg([bool]$forceBindAlreadyBindedUser){
        $this.RepositoryBindCfg($forceBindAlreadyBindedUser, $true, '')
    }
    [void] RepositoryBindCfg([bool]$forceBindAlreadyBindedUser, [bool]$forceReplaceCfg, [string]$Extension){
        $Param = @()
        if ($forceBindAlreadyBindedUser){ $Param += '-forceBindAlreadyBindedUser' }
        if ($forceReplaceCfg){ $Param += '-forceReplaceCfg' }
        if ('' -ne $Extension){ $Param += ('-Extension "{0}"' -f $Extension) }
        $this.Run('/ConfigurationRepositoryBindCfg', $Param)
    }
    #endregion RepositoryBindCfg
    
    #region RepositoryDumpCfg
    [void] RepositoryDumpCfg([string]$FileCF){
        $this.RepositoryDumpCfg($FileCF, '', '')
    }
    [void] RepositoryDumpCfg([string]$FileCF, [string]$Version, [string]$Extension) {
        $Param = @($FileCF)
        if ('' -ne $Version){ $Param += ('-v {0}' -f $Version) }
        if ('' -ne $Extension){ $Param += ('-Extension "{0}"' -f $Extension) }
        $this.Run('/ConfigurationRepositoryDumpCfg', $Param)
    }
    #endregion RepositoryDumpCfg

    #region RepositoryLock
    [void] RepositoryLock([string]$Objects){
        $this.RepositoryLock($Objects, $true, '')
    }
    [void] RepositoryLock([string]$Objects, [bool]$Revised){
        $this.RepositoryLock($Objects, $Revised, '')
    }
    [void] RepositoryLock([string]$Objects, [bool]$Revised, [string]$Extension){
        $Param = @()
        if ('' -ne $Objects){ $Param += ('-Objects "{0}"' -f $Objects) }
        if ($Revised){ $Param += '-revised' }
        if ('' -ne $Extension){ $Param += ('-Extension "{0}"' -f $Extension) }
        $this.Run('/ConfigurationRepositoryLock', $Param)
    }
    #endregion RepositoryLock
    
    #region RepositoryCommit
    [void] RepositoryCommit([string]$Objects){
        $this.RepositoryCommit($Objects, '', $false, $false, '')
    }
    [void] RepositoryCommit([string]$Objects, [string]$Comment){
        $this.RepositoryCommit($Objects, $Comment, $false, $false, '')
    }
    [void] RepositoryCommit([string]$Objects, [string]$Comment, [bool]$keepLocked){
        $this.RepositoryCommit($Objects, $Comment, $keepLocked, $false, '')
    }
    [void] RepositoryCommit([string]$Objects, [string]$Comment, [bool]$keepLocked, [bool]$Force){
        $this.RepositoryCommit($Objects, $Comment, $keepLocked, $Force, '')
    }
    [void] RepositoryCommit([string]$Objects, [string]$Comment, [bool]$keepLocked, [bool]$Force, [string]$Extension){
        $Param = @()
        if ('' -ne $Objects){ $Param += ('-Objects "{0}"' -f $Objects) }
        if ('' -ne $Comment){ $Comment -split "`n" | foreach{$Param += ('-Comment "{0}"' -f $_)} }
        if ($keepLocked){ $Param += '-keepLocked' }
        if ($Force){ $Param += '-force' }
        if ('' -ne $Extension){ $Param += ('-Extension "{0}"' -f $Extension) }
        $this.Run('/ConfigurationRepositoryCommit', $Param)
    }
    #endregion RepositoryCommit
    
    #region RepositoryUnLock
    [void] RepositoryUnLock([string]$Objects){
        $this.RepositoryUnLock($Objects, $false, '')
    }
    [void] RepositoryUnLock([string]$Objects, [bool]$Force){
        $this.RepositoryUnLock($Objects, $Force, '')
    }
    [void] RepositoryUnLock([string]$Objects, [bool]$Force, [string]$Extension){
        $Param = @()
        if ('' -ne $Objects){ $Param += ('-Objects "{0}"' -f $Objects) }
        if ($Force){ $Param += '-force' }
        if ('' -ne $Extension){ $Param += ('-Extension "{0}"' -f $Extension) }
        $this.Run('/ConfigurationRepositoryUnLock', $Param)
    }
    #endregion RepositoryUnLock

    #region RepositoryUpdateCfg
    [void] RepositoryUpdateCfg([string]$Version){
        $this.RepositoryUpdateCfg($Version, $false, $true, '', '')
    }
    [void] RepositoryUpdateCfg([bool]$Revised){
        $this.RepositoryUpdateCfg('', $Revised, $true, '', '')
    }
    [void] RepositoryUpdateCfg([string]$Version, [bool]$Revised, [bool]$Force, [string]$Objects, [string]$Extension){
        $Param = @()
        if ('' -ne $Version){ $Param += ('-v {0}' -f $Version) }
        if ($Revised){ $Param += '-revised' }
        if ($Force){ $Param += '-force' }
        if ('' -ne $Objects){ $Param += ('-Objects "{0}"' -f $Objects) }
        if ('' -ne $Extension){ $Param += ('-Extension "{0}"' -f $Extension) }
        $this.Run('/ConfigurationRepositoryUpdateCfg', $Param)
    }
    #endregion RepositoryUpdateCfg
    #endregion Configuration_storage_commands

    #region The command to create a file delivery and update
    #region CreateDistributionFiles
    [void] CreateDistributionFiles([string]$cffile){
        $this.CreateDistributionFiles($cffile, '', '', '', $false)
    }
    [void] CreateDistributionFiles([string]$cfufile, [string]$NameCF_VersionCF){
        $this.CreateDistributionFiles('', $cfufile, $NameCF_VersionCF, $false)
    }
    [void] CreateDistributionFiles([string]$cffile, [string]$cfufile, [string]$NameCF_VersionCF,`
                                    [string]$digisign, [bool]$WarningAsError){
        $Param = @()
        if ('' -ne $cfufile){ $Param += ('-cfufile "{0}"' -f $cfufile) }
        if ('' -ne $NameCF_VersionCF){ 
            $template = '-v "{0}"'
            if (Test-Path $NameCF_VersionCF) {  $template = '-f "{0}"' }
            $Param += ($template -f $NameCF_VersionCF) 
        }
        if ('' -ne $digisign){ $Param += ('-digisign "{0}"' -f $digisign) }
        if ($WarningAsError){ $Param += '-WarningAsError' }
        $this.Run(('/CreateDistributionFiles -cffile "{0}"' -f $cffile), $Param)
    }
    #endregion CreateDistributionFiles
    #endregion The command to create a file delivery and update

}# end class Designer1C

#Export-ModuleMember -Function New-Designer1C