├── .gitignore ├── dump_objects_example.txt ├── LICENSE ├── scripts ├── update-dump-info.ps1 ├── process-config-files.ps1 ├── dump-full-config.ps1 ├── dump-changes-config.ps1 ├── dump-partial-config.ps1 ├── dump-config.ps1 ├── partial-load-config.cmd └── partial-load-config.ps1 ├── loadcfg.cmd ├── .env.example ├── dumpcfg.cmd └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.pdf 2 | 3 | # Файл с локальными настройками (создается из .env.example) 4 | .env 5 | 6 | # Служебные каталоги и файлы 7 | # Временный файл со списком файлов для частичной загрузки 8 | *_load_list.txt 9 | # Файл со списком измененных файлов конфигурации (создается при выгрузке) 10 | config_changes.txt 11 | # Файл со списком объектов для частичной выгрузки 12 | dump_objects.txt 13 | 14 | # Временный файл для частичной выгрузки 15 | partial_dump_list.txt -------------------------------------------------------------------------------- /dump_objects_example.txt: -------------------------------------------------------------------------------- 1 | # Пример файла со списком объектов для частичной выгрузки конфигурации 2 | # 3 | # Формат: по одному объекту на строку 4 | # Имена объектов указываются в формате 1С: Тип.Имя 5 | # 6 | # Поддерживаемые форматы: 7 | # - Объекты метаданных: Справочник.Номенклатура 8 | # - Документы: Документ.РеализацияТоваров 9 | # - Отчеты: Отчет.АнализПродаж 10 | # - Обработки: Обработка.ЗагрузкаДанных 11 | # - Свойства конфигурации: Configuration.Help 12 | # 13 | # Строки, начинающиеся с #, игнорируются 14 | # Пустые строки игнорируются 15 | 16 | # Справочники 17 | Справочник.Номенклатура 18 | Справочник.Контрагенты 19 | 20 | # Документы 21 | Документ.РеализацияТоваров 22 | Документ.ПоступлениеТоваров 23 | 24 | # Отчеты 25 | Отчет.АнализПродаж 26 | 27 | # Обработки 28 | Обработка.ЗагрузкаДанных 29 | 30 | # Справка конфигурации 31 | Configuration.Help 32 | 33 | # Заставка конфигурации 34 | Configuration.Splash -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Nikolay-Shirokov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /scripts/update-dump-info.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Обновляет файл состояния выгрузки (ConfigDumpInfo.xml) до текущей конфигурации ИБ. 4 | 5 | .DESCRIPTION 6 | Обертка над dump-config.ps1 для вызова с ключом -configDumpInfoOnly. 7 | Это необходимо для "фиксации" состояния после инкрементальной выгрузки. 8 | 9 | .PARAMETER ConfigDir 10 | Каталог, в котором находится ConfigDumpInfo.xml. Переопределяет CONFIG_DIR из .env. 11 | 12 | .PARAMETER InfoBasePath 13 | Путь к файловой информационной базе. 14 | 15 | .PARAMETER InfoBaseName 16 | Имя информационной базы из списка. 17 | 18 | .EXAMPLE 19 | .\update-dump-info.ps1 -ConfigDir "src" -InfoBasePath "C:\Bases\MyBase" 20 | #> 21 | 22 | [CmdletBinding()] 23 | param( 24 | [Parameter(Mandatory=$false)] 25 | [string]$ConfigDir, 26 | 27 | [Parameter(Mandatory=$false)] 28 | [string]$InfoBasePath, 29 | 30 | [Parameter(Mandatory=$false)] 31 | [string]$InfoBaseName, 32 | 33 | [Parameter(Mandatory=$false)] 34 | [string]$UserName, 35 | 36 | [Parameter(Mandatory=$false)] 37 | [string]$Password, 38 | 39 | [Parameter(Mandatory=$false)] 40 | [string]$V8Path, 41 | 42 | [Parameter(Mandatory=$false)] 43 | [string]$OutFile, 44 | 45 | [Parameter(Mandatory=$false)] 46 | [switch]$DebugMode 47 | ) 48 | 49 | # Формируем параметры для вызова dump-config.ps1 50 | $dumpConfigParams = @{ 51 | Mode = "UpdateInfo" 52 | } 53 | 54 | # Передаем все остальные параметры, если они указаны 55 | if ($PSBoundParameters.ContainsKey('ConfigDir')) { $dumpConfigParams['OutputDir'] = $ConfigDir } 56 | if ($PSBoundParameters.ContainsKey('InfoBasePath')) { $dumpConfigParams['InfoBasePath'] = $InfoBasePath } 57 | if ($PSBoundParameters.ContainsKey('InfoBaseName')) { $dumpConfigParams['InfoBaseName'] = $InfoBaseName } 58 | if ($PSBoundParameters.ContainsKey('UserName')) { $dumpConfigParams['UserName'] = $UserName } 59 | if ($PSBoundParameters.ContainsKey('Password')) { $dumpConfigParams['Password'] = $Password } 60 | if ($PSBoundParameters.ContainsKey('V8Path')) { $dumpConfigParams['V8Path'] = $V8Path } 61 | if ($PSBoundParameters.ContainsKey('OutFile')) { $dumpConfigParams['OutFile'] = $OutFile } 62 | if ($PSBoundParameters.ContainsKey('DebugMode')) { $dumpConfigParams['DebugMode'] = $true } 63 | 64 | # Вызываем основной скрипт 65 | $scriptPath = Join-Path $PSScriptRoot "dump-config.ps1" 66 | & $scriptPath @dumpConfigParams 67 | 68 | exit $LASTEXITCODE -------------------------------------------------------------------------------- /scripts/process-config-files.ps1: -------------------------------------------------------------------------------- 1 | param( 2 | [string]$ChangedFilesPath, 3 | [string]$ConfigDir, 4 | [string]$TempList, 5 | [string]$DebugMode 6 | ) 7 | 8 | # Получаем абсолютный путь к каталогу конфигурации 9 | $configDirAbs = (Resolve-Path $ConfigDir).Path 10 | $changedFiles = Get-Content -Path $ChangedFilesPath -Encoding UTF8 -ErrorAction SilentlyContinue 11 | 12 | # Создаем файл без BOM 13 | $utf8NoBom = New-Object System.Text.UTF8Encoding $false 14 | 15 | foreach ($filePath in $changedFiles) { 16 | $filePath = $filePath.Trim() 17 | if ([string]::IsNullOrWhiteSpace($filePath)) { continue } 18 | 19 | $filePathNorm = $filePath.Replace('/', '\') 20 | 21 | if (-not $filePathNorm.StartsWith("$ConfigDir\")) { continue } 22 | 23 | $relPath = $filePathNorm.Substring($ConfigDir.Length + 1) 24 | 25 | # Пропускаем служебный файл 26 | if ($relPath -eq 'ConfigDumpInfo.xml') { 27 | if ($DebugMode -eq '1') { 28 | Write-Host "[DEBUG] Skipped service file: $relPath" 29 | } 30 | continue 31 | } 32 | 33 | # XML файлы 34 | if ($filePath -match '\.xml$') { 35 | if (Test-Path "$ConfigDir\$relPath") { 36 | [System.IO.File]::AppendAllText($TempList, "$relPath`r`n", $utf8NoBom) 37 | if ($DebugMode -eq '1') { 38 | Write-Host "[DEBUG] Added XML: $relPath" 39 | } 40 | } 41 | } 42 | # BSL файлы 43 | elseif ($filePath -match '\.bsl$') { 44 | if ($DebugMode -eq '1') { 45 | Write-Host "[DEBUG] Found BSL file: $relPath" 46 | } 47 | 48 | $parts = $relPath -split '\\' 49 | if ($parts.Count -ge 2) { 50 | $objType = $parts[0] 51 | $objName = $parts[1] 52 | $objXml = "$objType\$objName.xml" 53 | 54 | if (Test-Path "$ConfigDir\$objXml") { 55 | # Добавляем XML объекта 56 | [System.IO.File]::AppendAllText($TempList, "$objXml`r`n", $utf8NoBom) 57 | if ($DebugMode -eq '1') { 58 | Write-Host "[DEBUG] Added object XML for BSL: $objXml" 59 | } 60 | 61 | # Добавляем BSL файл 62 | [System.IO.File]::AppendAllText($TempList, "$relPath`r`n", $utf8NoBom) 63 | if ($DebugMode -eq '1') { 64 | Write-Host "[DEBUG] Added BSL: $relPath" 65 | } 66 | 67 | # Добавляем все файлы из Ext 68 | $extDir = Join-Path $configDirAbs "$objType\$objName\Ext" 69 | if (Test-Path $extDir) { 70 | Get-ChildItem -Path $extDir -Recurse -File | ForEach-Object { 71 | $extRelPath = $_.FullName.Substring($configDirAbs.Length + 1) 72 | [System.IO.File]::AppendAllText($TempList, "$extRelPath`r`n", $utf8NoBom) 73 | if ($DebugMode -eq '1') { 74 | Write-Host "[DEBUG] Added additional file: $extRelPath" 75 | } 76 | } 77 | } 78 | } 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /scripts/dump-full-config.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Полная выгрузка конфигурации 1С в файлы 4 | 5 | .DESCRIPTION 6 | Обертка над dump-config.ps1 для полной выгрузки всей конфигурации. 7 | Выполняет команду /DumpConfigToFiles без дополнительных параметров. 8 | 9 | .PARAMETER ConfigDir 10 | Каталог для выгрузки конфигурации. Переопределяет CONFIG_DIR из .env. 11 | 12 | .PARAMETER InfoBasePath 13 | Путь к файловой информационной базе 14 | 15 | .PARAMETER InfoBaseName 16 | Имя информационной базы из списка 17 | 18 | .PARAMETER UserName 19 | Имя пользователя 1С 20 | 21 | .PARAMETER Password 22 | Пароль пользователя 23 | 24 | .PARAMETER Format 25 | Формат выгрузки: Hierarchical или Plain (default: Hierarchical) 26 | 27 | .PARAMETER V8Path 28 | Путь к 1cv8.exe (если не указан, ищется в PATH) 29 | 30 | .PARAMETER OutFile 31 | Файл для вывода служебных сообщений 32 | 33 | .PARAMETER DebugMode 34 | Режим отладки с дополнительным выводом 35 | 36 | .PARAMETER Extension 37 | Имя расширения для выгрузки 38 | 39 | .PARAMETER AllExtensions 40 | Выгрузить все расширения 41 | 42 | .EXAMPLE 43 | .\dump-full-config.ps1 -OutputDir "src" -InfoBasePath "C:\Bases\MyBase" 44 | 45 | .EXAMPLE 46 | .\dump-full-config.ps1 -InfoBaseName "MyBase" -UserName "Admin" -DebugMode 47 | 48 | .NOTES 49 | Требует: 1cv8.exe 50 | Параметры можно настроить в .env файле 51 | #> 52 | 53 | [CmdletBinding()] 54 | param( 55 | [Parameter(Mandatory=$false)] 56 | [string]$ConfigDir, 57 | 58 | [Parameter(Mandatory=$false)] 59 | [string]$InfoBasePath, 60 | 61 | [Parameter(Mandatory=$false)] 62 | [string]$InfoBaseName, 63 | 64 | [Parameter(Mandatory=$false)] 65 | [string]$UserName, 66 | 67 | [Parameter(Mandatory=$false)] 68 | [string]$Password, 69 | 70 | [Parameter(Mandatory=$false)] 71 | [ValidateSet("Hierarchical", "Plain")] 72 | [string]$Format, 73 | 74 | [Parameter(Mandatory=$false)] 75 | [string]$V8Path, 76 | 77 | [Parameter(Mandatory=$false)] 78 | [string]$OutFile, 79 | 80 | [Parameter(Mandatory=$false)] 81 | [switch]$DebugMode, 82 | 83 | [Parameter(Mandatory=$false)] 84 | [string]$Extension, 85 | 86 | [Parameter(Mandatory=$false)] 87 | [switch]$AllExtensions 88 | ) 89 | 90 | # Формируем параметры для вызова dump-config.ps1 91 | $dumpConfigParams = @{ 92 | Mode = "Full" 93 | } 94 | 95 | # Передаем все остальные параметры, если они указаны 96 | if ($ConfigDir) { $dumpConfigParams['OutputDir'] = $ConfigDir } 97 | if ($InfoBasePath) { $dumpConfigParams['InfoBasePath'] = $InfoBasePath } 98 | if ($InfoBaseName) { $dumpConfigParams['InfoBaseName'] = $InfoBaseName } 99 | if ($UserName) { $dumpConfigParams['UserName'] = $UserName } 100 | if ($Password) { $dumpConfigParams['Password'] = $Password } 101 | if ($Format) { $dumpConfigParams['Format'] = $Format } 102 | if ($V8Path) { $dumpConfigParams['V8Path'] = $V8Path } 103 | if ($OutFile) { $dumpConfigParams['OutFile'] = $OutFile } 104 | if ($DebugMode) { $dumpConfigParams['DebugMode'] = $DebugMode } 105 | if ($Extension) { $dumpConfigParams['Extension'] = $Extension } 106 | if ($AllExtensions) { $dumpConfigParams['AllExtensions'] = $true } 107 | 108 | # Вызываем основной скрипт 109 | $scriptPath = Join-Path $PSScriptRoot "dump-config.ps1" 110 | & $scriptPath @dumpConfigParams 111 | 112 | exit $LASTEXITCODE -------------------------------------------------------------------------------- /loadcfg.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | setlocal enabledelayedexpansion 3 | 4 | REM ============================================================================ 5 | REM loadcfg - Обертка для частичной загрузки конфигурации 1С 6 | REM ============================================================================ 7 | REM 8 | REM Использование: 9 | REM loadcfg - загрузка незафиксированных изменений 10 | REM loadcfg HEAD - загрузка всех изменений с последнего коммита 11 | REM loadcfg HEAD~3 - загрузка изменений за последние 3 коммита 12 | REM loadcfg -UpdateDB - загрузка с обновлением БД 13 | REM loadcfg HEAD -UpdateDB -DebugMode - загрузка с обновлением БД и отладкой 14 | REM 15 | REM Все параметры берутся из .env файла, но могут быть переопределены 16 | REM ============================================================================ 17 | 18 | REM Определяем каталог скрипта 19 | set "SCRIPT_DIR=%~dp0" 20 | set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" 21 | 22 | REM Путь к основному PowerShell скрипту 23 | set "PS_SCRIPT=%SCRIPT_DIR%\scripts\partial-load-config.ps1" 24 | 25 | REM Проверяем существование скрипта 26 | if not exist "%PS_SCRIPT%" ( 27 | echo [ERROR] Script not found: %PS_SCRIPT% 28 | exit /b 1 29 | ) 30 | 31 | REM Проверка на -help или -h 32 | if /i "%~1"=="-help" goto show_help 33 | if /i "%~1"=="-h" goto show_help 34 | if /i "%~1"=="/?" goto show_help 35 | 36 | REM Собираем все параметры 37 | set "PARAMS=" 38 | :parse_args 39 | if "%~1"=="" goto run_script 40 | set "PARAMS=%PARAMS% %1" 41 | shift 42 | goto parse_args 43 | 44 | :run_script 45 | REM Запускаем PowerShell скрипт 46 | powershell.exe -ExecutionPolicy Bypass -File "%PS_SCRIPT%" %PARAMS% 47 | goto end 48 | 49 | :show_help 50 | echo. 51 | echo loadcfg - Загрузка конфигурации 1С из git 52 | echo ========================================= 53 | echo. 54 | echo Использование: 55 | echo loadcfg [CommitId] [параметры] 56 | echo. 57 | echo Примеры: 58 | echo loadcfg - загрузка незафиксированных изменений 59 | echo loadcfg HEAD - загрузка всех изменений с последнего коммита 60 | echo loadcfg HEAD~3 - загрузка изменений за последние 3 коммита 61 | echo loadcfg -UpdateDB - загрузка с обновлением БД 62 | echo loadcfg HEAD -UpdateDB -RunEnterprise 63 | echo. 64 | echo Параметры: 65 | echo CommitId - Коммит git (HEAD, HEAD~N, хеш) 66 | echo -UpdateDB - Обновить конфигурацию БД после загрузки 67 | echo -RunEnterprise - Запустить 1С:Предприятие после загрузки 68 | echo -NavigationLink "url" - Навигационная ссылка для открытия 69 | echo -ExternalDataProcessor "path" - Путь к внешней обработке 70 | echo -DebugMode - Режим отладки 71 | echo -InfoBasePath "path" - Путь к информационной базе 72 | echo -InfoBaseName "name" - Имя базы из списка 73 | echo -UserName "name" - Имя пользователя 74 | echo -Password "pwd" - Пароль 75 | echo -ConfigDir "path" - Каталог конфигурации (default: src) 76 | echo -Format "fmt" - Формат: Hierarchical/Plain 77 | echo -V8Path "path" - Путь к 1cv8.exe 78 | echo. 79 | echo Все основные параметры берутся из .env файла 80 | echo Параметры командной строки переопределяют значения из .env 81 | echo. 82 | echo Подробнее: см. README.md 83 | echo. 84 | exit /b 0 85 | 86 | :end 87 | 88 | REM Возвращаем код возврата из PowerShell 89 | exit /b %ERRORLEVEL% -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # Пример файла конфигурации для скриптов работы с конфигурацией 1С 2 | # Скопируйте этот файл в .env и настройте под свою среду разработки 3 | 4 | # ============================================================================= 5 | # ОСНОВНЫЕ ПАРАМЕТРЫ 6 | # ============================================================================= 7 | 8 | # Путь к платформе 1С:Предприятие (1cv8.exe) 9 | # Если не указан, будет искаться в PATH 10 | V8_PATH=C:\Program Files\1cv8\8.3.24.1467\bin\1cv8.exe 11 | 12 | # Каталог с выгруженной конфигурацией (относительно корня проекта) 13 | CONFIG_DIR=src 14 | 15 | # Формат выгрузки конфигурации 16 | # Возможные значения: Hierarchical, Plain 17 | CONFIG_FORMAT=Hierarchical 18 | 19 | # ============================================================================= 20 | # ПАРАМЕТРЫ ПОДКЛЮЧЕНИЯ К ИНФОРМАЦИОННОЙ БАЗЕ 21 | # ============================================================================= 22 | 23 | # Путь к файловой информационной базе 24 | # Используйте либо INFOBASE_PATH, либо INFOBASE_NAME 25 | INFOBASE_PATH=C:\edt\IB\MyBase 26 | 27 | # Имя информационной базы из списка (альтернатива INFOBASE_PATH) 28 | # INFOBASE_NAME=MyBase 29 | 30 | # ============================================================================= 31 | # УЧЕТНЫЕ ДАННЫЕ 1С 32 | # ============================================================================= 33 | 34 | # Имя пользователя 1С 35 | # Рекомендуется использовать учетную запись для разработки 36 | USERNAME_1C=Администратор 37 | 38 | # Пароль пользователя 1С 39 | # ВНИМАНИЕ: Не рекомендуется хранить пароль в файле! 40 | # Лучше передавать через параметр командной строки 41 | # PASSWORD_1C= 42 | 43 | # ============================================================================= 44 | # ДОПОЛНИТЕЛЬНЫЕ ПАРАМЕТРЫ 45 | # ============================================================================= 46 | 47 | # Файл для вывода служебных сообщений (если не указан, создается временный) 48 | # OUT_FILE=C:\Logs\1c_load.txt 49 | 50 | # Режим отладки (true/false) 51 | # При включении выводится дополнительная информация и сохраняются временные файлы 52 | DEBUG_MODE=false 53 | 54 | # Автоматическое обновление конфигурации БД после загрузки (true/false) 55 | UPDATE_DB=false 56 | 57 | # Запуск 1С:Предприятие после загрузки (true/false) 58 | RUN_ENTERPRISE=false 59 | 60 | # Навигационная ссылка для открытия объекта (требует RUN_ENTERPRISE=true) 61 | # Примеры: 62 | # - e1cib/list/Справочник.Номенклатура 63 | # - e1cib/list/Документ.ЗаказПоставщику 64 | # NAVIGATION_LINK= 65 | 66 | # Путь к внешней обработке для запуска (требует RUN_ENTERPRISE=true) 67 | # EXTERNAL_DATA_PROCESSOR=C:\Tools\MyProcessor.epf 68 | 69 | 70 | # ============================================================================= 71 | # ПАРАМЕТРЫ ВЫГРУЗКИ КОНФИГУРАЦИИ 72 | # ============================================================================= 73 | 74 | # Режим выгрузки по умолчанию: Full, Changes, Partial 75 | # Full - полная выгрузка всей конфигурации 76 | # Changes - только измененные объекты (требует предыдущую выгрузку) 77 | # Partial - конкретные объекты из списка 78 | DUMP_MODE=Changes 79 | 80 | # Файл со списком объектов для частичной выгрузки (режим Partial) 81 | # Формат: по одному объекту на строку 82 | # Примеры: 83 | # Справочник.Справочник1 84 | # Документ.Документ1 85 | # Configuration.Help 86 | DUMP_OBJECTS_LIST=dump_objects.txt 87 | 88 | # Файл для сохранения списка изменений (режим Changes) 89 | # В этот файл будет записан список измененных объектов 90 | DUMP_CHANGES_FILE=config_changes.txt 91 | 92 | # Файл ConfigDumpInfo.xml для сравнения (опционально, режим Changes) 93 | # Позволяет сравнить текущую конфигурацию с другой выгрузкой 94 | # DUMP_COMPARE_WITH=old_dump/ConfigDumpInfo.xml 95 | -------------------------------------------------------------------------------- /scripts/dump-changes-config.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Выгрузка изменений конфигурации 1С в файлы 4 | 5 | .DESCRIPTION 6 | Обертка над dump-config.ps1 для инкрементальной выгрузки только измененных объектов. 7 | Выполняет команду /DumpConfigToFiles с параметром -update. 8 | 9 | .PARAMETER ConfigDir 10 | Каталог для выгрузки конфигурации. Переопределяет CONFIG_DIR из .env. 11 | 12 | .PARAMETER InfoBasePath 13 | Путь к файловой информационной базе 14 | 15 | .PARAMETER InfoBaseName 16 | Имя информационной базы из списка 17 | 18 | .PARAMETER UserName 19 | Имя пользователя 1С 20 | 21 | .PARAMETER Password 22 | Пароль пользователя 23 | 24 | .PARAMETER Format 25 | Формат выгрузки: Hierarchical или Plain (default: Hierarchical) 26 | 27 | .PARAMETER V8Path 28 | Путь к 1cv8.exe (если не указан, ищется в PATH) 29 | 30 | .PARAMETER OutFile 31 | Файл для вывода служебных сообщений 32 | 33 | .PARAMETER DebugMode 34 | Режим отладки с дополнительным выводом 35 | 36 | .PARAMETER ChangesFile 37 | Файл для сохранения списка изменений 38 | 39 | .PARAMETER CompareWith 40 | Путь к ConfigDumpInfo.xml для сравнения 41 | 42 | .PARAMETER Force 43 | Принудительная полная выгрузка при несоответствии версий 44 | 45 | .PARAMETER Extension 46 | Имя расширения для выгрузки 47 | 48 | .PARAMETER AllExtensions 49 | Выгрузить все расширения 50 | 51 | .EXAMPLE 52 | .\dump-changes-config.ps1 -OutputDir "src" -InfoBasePath "C:\Bases\MyBase" 53 | 54 | .EXAMPLE 55 | .\dump-changes-config.ps1 -InfoBaseName "MyBase" -ChangesFile "changes.txt" -DebugMode 56 | 57 | .EXAMPLE 58 | .\dump-changes-config.ps1 -InfoBasePath "C:\Bases\MyBase" -CompareWith "old\ConfigDumpInfo.xml" -Force 59 | 60 | .NOTES 61 | Требует: 1cv8.exe 62 | Параметры можно настроить в .env файле 63 | Для работы необходим файл ConfigDumpInfo.xml от предыдущей выгрузки 64 | #> 65 | 66 | [CmdletBinding()] 67 | param( 68 | [Parameter(Mandatory=$false)] 69 | [string]$ConfigDir, 70 | 71 | [Parameter(Mandatory=$false)] 72 | [string]$InfoBasePath, 73 | 74 | [Parameter(Mandatory=$false)] 75 | [string]$InfoBaseName, 76 | 77 | [Parameter(Mandatory=$false)] 78 | [string]$UserName, 79 | 80 | [Parameter(Mandatory=$false)] 81 | [string]$Password, 82 | 83 | [Parameter(Mandatory=$false)] 84 | [ValidateSet("Hierarchical", "Plain")] 85 | [string]$Format, 86 | 87 | [Parameter(Mandatory=$false)] 88 | [string]$V8Path, 89 | 90 | [Parameter(Mandatory=$false)] 91 | [string]$OutFile, 92 | 93 | [Parameter(Mandatory=$false)] 94 | [switch]$DebugMode, 95 | 96 | [Parameter(Mandatory=$false)] 97 | [string]$ChangesFile, 98 | 99 | [Parameter(Mandatory=$false)] 100 | [string]$CompareWith, 101 | 102 | [Parameter(Mandatory=$false)] 103 | [switch]$Force, 104 | 105 | [Parameter(Mandatory=$false)] 106 | [string]$Extension, 107 | 108 | [Parameter(Mandatory=$false)] 109 | [switch]$AllExtensions 110 | ) 111 | 112 | # Формируем параметры для вызова dump-config.ps1 113 | $dumpConfigParams = @{ 114 | Mode = "Changes" 115 | } 116 | 117 | # Передаем все остальные параметры, если они указаны 118 | if ($ConfigDir) { $dumpConfigParams['OutputDir'] = $ConfigDir } 119 | if ($InfoBasePath) { $dumpConfigParams['InfoBasePath'] = $InfoBasePath } 120 | if ($InfoBaseName) { $dumpConfigParams['InfoBaseName'] = $InfoBaseName } 121 | if ($UserName) { $dumpConfigParams['UserName'] = $UserName } 122 | if ($Password) { $dumpConfigParams['Password'] = $Password } 123 | if ($Format) { $dumpConfigParams['Format'] = $Format } 124 | if ($V8Path) { $dumpConfigParams['V8Path'] = $V8Path } 125 | if ($OutFile) { $dumpConfigParams['OutFile'] = $OutFile } 126 | if ($DebugMode) { $dumpConfigParams['DebugMode'] = $true } 127 | if ($ChangesFile) { $dumpConfigParams['ChangesFile'] = $ChangesFile } 128 | if ($CompareWith) { $dumpConfigParams['CompareWith'] = $CompareWith } 129 | if ($Force) { $dumpConfigParams['Force'] = $true } 130 | if ($Extension) { $dumpConfigParams['Extension'] = $Extension } 131 | if ($AllExtensions) { $dumpConfigParams['AllExtensions'] = $true } 132 | 133 | # Вызываем основной скрипт 134 | $scriptPath = Join-Path $PSScriptRoot "dump-config.ps1" 135 | & $scriptPath @dumpConfigParams 136 | 137 | exit $LASTEXITCODE -------------------------------------------------------------------------------- /dumpcfg.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | setlocal enabledelayedexpansion 3 | 4 | REM ============================================================================ 5 | REM dumpcfg - Обертка для выгрузки конфигурации 1С 6 | REM ============================================================================ 7 | REM 8 | REM Использование: 9 | REM dumpcfg - выгрузка по умолчанию (Changes из .env) 10 | REM dumpcfg Full - полная выгрузка 11 | REM dumpcfg Changes - инкрементальная выгрузка 12 | REM dumpcfg Partial - частичная выгрузка (список из .env) 13 | REM dumpcfg -mode Full - явное указание режима 14 | REM dumpcfg -mode Partial -objects "Справочник.Номенклатура,Документ.Заказ" 15 | REM dumpcfg -DebugMode - выгрузка с отладкой 16 | REM 17 | REM Все параметры берутся из .env файла, но могут быть переопределены 18 | REM ============================================================================ 19 | 20 | REM Определяем каталог скрипта 21 | set "SCRIPT_DIR=%~dp0" 22 | set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" 23 | 24 | REM Проверка на -help или -h 25 | if /i "%~1"=="-help" goto show_help 26 | if /i "%~1"=="-h" goto show_help 27 | if /i "%~1"=="/?" goto show_help 28 | 29 | REM Обработка параметров - ищем режим и -objects 30 | set "MODE=" 31 | set "USE_PARTIAL_SCRIPT=0" 32 | set "PARAMS=" 33 | set "FIRST_PARAM=%~1" 34 | 35 | REM Проверяем первый параметр на режим 36 | if not "%FIRST_PARAM%"=="" ( 37 | if /i "%FIRST_PARAM%"=="Full" ( 38 | set "MODE=Full" 39 | shift 40 | ) else if /i "%FIRST_PARAM%"=="Changes" ( 41 | set "MODE=Changes" 42 | shift 43 | ) else if /i "%FIRST_PARAM%"=="Partial" ( 44 | set "MODE=Partial" 45 | set "USE_PARTIAL_SCRIPT=1" 46 | shift 47 | ) 48 | ) 49 | 50 | REM Собираем остальные параметры и проверяем наличие -objects или -mode Partial 51 | :parse_params 52 | if "%~1"=="" goto determine_script 53 | 54 | if /i "%~1"=="-mode" ( 55 | set "nextparam=%~2" 56 | if /i "!nextparam!"=="Partial" ( 57 | set "USE_PARTIAL_SCRIPT=1" 58 | set "MODE=Partial" 59 | ) else ( 60 | set "MODE=!nextparam!" 61 | ) 62 | shift 63 | shift 64 | goto parse_params 65 | ) 66 | 67 | if /i "%~1"=="-objects" ( 68 | REM Для -objects используем dump-partial-config.ps1 69 | set "USE_PARTIAL_SCRIPT=1" 70 | set "PARAMS=!PARAMS! -ObjectNames %2" 71 | shift 72 | shift 73 | goto parse_params 74 | ) 75 | 76 | REM Все остальные параметры передаем как есть 77 | set "PARAMS=!PARAMS! %1" 78 | shift 79 | goto parse_params 80 | 81 | :determine_script 82 | REM Определяем какой скрипт использовать 83 | if "!USE_PARTIAL_SCRIPT!"=="1" ( 84 | set "PS_SCRIPT=%SCRIPT_DIR%\scripts\dump-partial-config.ps1" 85 | ) else ( 86 | set "PS_SCRIPT=%SCRIPT_DIR%\scripts\dump-config.ps1" 87 | if not "!MODE!"=="" set "PARAMS=-Mode !MODE! !PARAMS!" 88 | ) 89 | 90 | REM Проверяем существование скрипта 91 | if not exist "%PS_SCRIPT%" ( 92 | echo [ERROR] Script not found: %PS_SCRIPT% 93 | exit /b 1 94 | ) 95 | 96 | :run_script 97 | REM Запускаем PowerShell скрипт 98 | powershell.exe -ExecutionPolicy Bypass -File "%PS_SCRIPT%" !PARAMS! 99 | 100 | REM Возвращаем код возврата из PowerShell 101 | exit /b %ERRORLEVEL% 102 | 103 | :show_help 104 | echo. 105 | echo dumpcfg - Выгрузка конфигурации 1С в файлы 106 | echo ========================================== 107 | echo. 108 | echo Использование: 109 | echo dumpcfg [режим] [параметры] 110 | echo. 111 | echo Примеры: 112 | echo dumpcfg - выгрузка по умолчанию (Changes из .env) 113 | echo dumpcfg Full - полная выгрузка 114 | echo dumpcfg Changes - инкрементальная выгрузка 115 | echo dumpcfg Partial - частичная выгрузка (список из .env) 116 | echo dumpcfg -mode Full - явное указание режима 117 | echo dumpcfg -mode Partial -objects "Справочник.Номенклатура,Документ.Заказ" 118 | echo dumpcfg -DebugMode - выгрузка с отладкой 119 | echo. 120 | echo Режимы: 121 | echo Full - Полная выгрузка всей конфигурации 122 | echo Changes - Инкрементальная (только изменения) 123 | echo Partial - Частичная (конкретные объекты) 124 | echo. 125 | echo Параметры: 126 | echo -mode [режим] - Явное указание режима 127 | echo -objects "obj1,obj2,..." - Список объектов (режим Partial) 128 | echo -ObjectsListFile "file" - Файл со списком объектов 129 | echo -ChangesFile "file" - Файл для списка изменений 130 | echo -CompareWith "file" - ConfigDumpInfo.xml для сравнения 131 | echo -Force - Принудительная полная выгрузка 132 | echo -DebugMode - Режим отладки 133 | echo -InfoBasePath "path" - Путь к информационной базе 134 | echo -InfoBaseName "name" - Имя базы из списка 135 | echo -UserName "name" - Имя пользователя 136 | echo -Password "pwd" - Пароль 137 | echo -ConfigDir "path" - Каталог для выгрузки (default: src) 138 | echo -Format "fmt" - Формат: Hierarchical/Plain 139 | echo -V8Path "path" - Путь к 1cv8.exe 140 | echo -Extension "name" - Имя расширения для выгрузки 141 | echo -AllExtensions - Выгрузить все расширения 142 | echo. 143 | echo Все основные параметры берутся из .env файла 144 | echo Параметры командной строки переопределяют значения из .env 145 | echo. 146 | echo Подробнее: см. README.md 147 | echo. 148 | exit /b 0 -------------------------------------------------------------------------------- /scripts/dump-partial-config.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Частичная выгрузка конфигурации 1С в файлы 4 | 5 | .DESCRIPTION 6 | Обертка над dump-config.ps1 для выгрузки конкретных объектов из файла. 7 | 8 | .PARAMETER ConfigDir 9 | Каталог для выгрузки конфигурации. Переопределяет CONFIG_DIR из .env. 10 | 11 | .PARAMETER InfoBasePath 12 | Путь к файловой информационной базе 13 | 14 | .PARAMETER InfoBaseName 15 | Имя информационной базы из списка 16 | 17 | .PARAMETER UserName 18 | Имя пользователя 1С 19 | 20 | .PARAMETER Password 21 | Пароль пользователя 22 | 23 | .PARAMETER Format 24 | Формат выгрузки: Hierarchical или Plain (default: Hierarchical) 25 | 26 | .PARAMETER V8Path 27 | Путь к 1cv8.exe (если не указан, ищется в PATH) 28 | 29 | .PARAMETER OutFile 30 | Файл для вывода служебных сообщений 31 | 32 | .PARAMETER DebugMode 33 | Режим отладки с дополнительным выводом 34 | 35 | .PARAMETER ObjectsListFile 36 | Файл со списком имен объектов метаданных для выгрузки. 37 | 38 | .PARAMETER ObjectNames 39 | Один или несколько объектов для выгрузки, переданные как параметр. 40 | 41 | .PARAMETER Extension 42 | Имя расширения для выгрузки 43 | 44 | .EXAMPLE 45 | .\dump-partial-config.ps1 -ObjectsListFile "dump_objects.txt" -InfoBasePath "C:\Bases\MyBase" 46 | 47 | .EXAMPLE 48 | .\dump-partial-config.ps1 -ObjectNames "Справочник.Номенклатура", "Документ.РеализацияТоваровУслуг" 49 | 50 | .EXAMPLE 51 | .\dump-partial-config.ps1 -ObjectNames "Справочник.Валюты" -InfoBaseName "MyBase" -DebugMode 52 | 53 | .NOTES 54 | Требует: 1cv8.exe. 55 | Нужно указать либо -ObjectsListFile, либо -ObjectNames. 56 | Параметры можно настроить в .env файле. 57 | 58 | Формат файла: одна строка - одно имя объекта метаданных (например, "Справочник.Номенклатура"). 59 | #> 60 | 61 | [CmdletBinding(DefaultParameterSetName = 'FromFile')] 62 | param( 63 | [Parameter(Mandatory=$false)] 64 | [string]$ConfigDir, 65 | 66 | [Parameter(Mandatory=$false)] 67 | [string]$InfoBasePath, 68 | 69 | [Parameter(Mandatory=$false)] 70 | [string]$InfoBaseName, 71 | 72 | [Parameter(Mandatory=$false)] 73 | [string]$UserName, 74 | 75 | [Parameter(Mandatory=$false)] 76 | [string]$Password, 77 | 78 | [Parameter(Mandatory=$false)] 79 | [ValidateSet("Hierarchical", "Plain")] 80 | [string]$Format, 81 | 82 | [Parameter(Mandatory=$false)] 83 | [string]$V8Path, 84 | 85 | [Parameter(Mandatory=$false)] 86 | [string]$OutFile, 87 | 88 | [Parameter(Mandatory=$false)] 89 | [switch]$DebugMode, 90 | 91 | [Parameter(ParameterSetName = 'FromFile', Mandatory=$true)] 92 | [string]$ObjectsListFile, 93 | 94 | [Parameter(ParameterSetName = 'FromNames', Mandatory=$true)] 95 | [string[]]$ObjectNames, 96 | 97 | [Parameter(Mandatory=$false)] 98 | [string]$Extension 99 | ) 100 | 101 | # Проверка, что указан либо файл, либо имена объектов, но не оба сразу 102 | if ($PSBoundParameters.ContainsKey('ObjectsListFile') -and $PSBoundParameters.ContainsKey('ObjectNames')) { 103 | Write-Host "Ошибка: Нельзя одновременно использовать параметры -ObjectsListFile и -ObjectNames." -ForegroundColor Red 104 | exit 1 105 | } 106 | 107 | # Если не указан ни один из обязательных параметров (на случай запуска без параметров) 108 | if (-not $PSBoundParameters.ContainsKey('ObjectsListFile') -and -not $PSBoundParameters.ContainsKey('ObjectNames')) { 109 | Write-Host "Ошибка: Необходимо указать либо -ObjectsListFile, либо -ObjectNames для частичной выгрузки." -ForegroundColor Red 110 | exit 1 111 | } 112 | 113 | $objectsToDump = @() 114 | if ($PSBoundParameters.ContainsKey('ObjectsListFile')) { 115 | if (-not (Test-Path $ObjectsListFile)) { 116 | Write-Host "Ошибка: Файл со списком объектов не найден: $ObjectsListFile" -ForegroundColor Red 117 | exit 1 118 | } 119 | # Читаем содержимое файла в массив, пропуская пустые строки 120 | $objectsToDump = Get-Content -Path $ObjectsListFile -Encoding UTF8 | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } 121 | } 122 | else { 123 | # Если из внешней оболочки пришел один элемент с запятыми, его нужно разделить 124 | if ($ObjectNames.Count -eq 1 -and $ObjectNames[0].Contains(',')) { 125 | $objectsToDump = $ObjectNames[0].Split(',') | ForEach-Object { $_.Trim() } 126 | } 127 | else { 128 | # Иначе, используем массив как есть (например, при вызове из PowerShell) 129 | $objectsToDump = $ObjectNames 130 | } 131 | } 132 | 133 | if ($objectsToDump.Count -eq 0) { 134 | Write-Host "Ошибка: Список объектов для выгрузки пуст." -ForegroundColor Red 135 | exit 1 136 | } 137 | 138 | # Формируем параметры для вызова dump-config.ps1 139 | $dumpConfigParams = @{ 140 | Mode = "Partial" 141 | } 142 | 143 | # Передаем прочитанный массив объектов 144 | $dumpConfigParams['Objects'] = $objectsToDump 145 | 146 | # Передаем все остальные параметры, если они указаны 147 | if ($PSBoundParameters.ContainsKey('ConfigDir')) { $dumpConfigParams['OutputDir'] = $ConfigDir } 148 | if ($PSBoundParameters.ContainsKey('InfoBasePath')) { $dumpConfigParams['InfoBasePath'] = $InfoBasePath } 149 | if ($PSBoundParameters.ContainsKey('InfoBaseName')) { $dumpConfigParams['InfoBaseName'] = $InfoBaseName } 150 | if ($PSBoundParameters.ContainsKey('UserName')) { $dumpConfigParams['UserName'] = $UserName } 151 | if ($PSBoundParameters.ContainsKey('Password')) { $dumpConfigParams['Password'] = $Password } 152 | if ($PSBoundParameters.ContainsKey('Format')) { $dumpConfigParams['Format'] = $Format } 153 | if ($PSBoundParameters.ContainsKey('V8Path')) { $dumpConfigParams['V8Path'] = $V8Path } 154 | if ($PSBoundParameters.ContainsKey('OutFile')) { $dumpConfigParams['OutFile'] = $OutFile } 155 | if ($PSBoundParameters.ContainsKey('DebugMode')) { $dumpConfigParams['DebugMode'] = $true } 156 | if ($PSBoundParameters.ContainsKey('Extension')) { $dumpConfigParams['Extension'] = $Extension } 157 | 158 | # Вызываем основной скрипт 159 | $scriptPath = Join-Path $PSScriptRoot "dump-config.ps1" 160 | & $scriptPath @dumpConfigParams 161 | 162 | exit $LASTEXITCODE -------------------------------------------------------------------------------- /scripts/dump-config.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Универсальный скрипт выгрузки конфигурации 1С в файлы 4 | 5 | .DESCRIPTION 6 | Выполняет выгрузку конфигурации 1С в файлы в трех режимах: 7 | - Full: полная выгрузка всей конфигурации 8 | - Changes: выгрузка только измененных объектов 9 | - Partial: выгрузка конкретных объектов из списка 10 | 11 | .PARAMETER Mode 12 | Режим выгрузки: Full, Changes, Partial (default: Changes) 13 | 14 | .PARAMETER OutputDir 15 | Каталог для выгрузки конфигурации (default: config_dump) 16 | 17 | .PARAMETER InfoBasePath 18 | Путь к файловой информационной базе 19 | 20 | .PARAMETER InfoBaseName 21 | Имя информационной базы из списка 22 | 23 | .PARAMETER UserName 24 | Имя пользователя 1С 25 | 26 | .PARAMETER Password 27 | Пароль пользователя 28 | 29 | .PARAMETER Format 30 | Формат выгрузки: Hierarchical или Plain (default: Hierarchical) 31 | 32 | .PARAMETER V8Path 33 | Путь к 1cv8.exe (если не указан, ищется в PATH) 34 | 35 | .PARAMETER OutFile 36 | Файл для вывода служебных сообщений 37 | 38 | .PARAMETER DebugMode 39 | Режим отладки с дополнительным выводом 40 | 41 | .PARAMETER Objects 42 | Массив имен объектов метаданных для частичной выгрузки (для режима Partial). 43 | 44 | .PARAMETER ChangesFile 45 | Файл для сохранения списка изменений (для режима Changes) 46 | 47 | .PARAMETER CompareWith 48 | Путь к ConfigDumpInfo.xml для сравнения (для режима Changes) 49 | 50 | .PARAMETER UpdateMode 51 | Режим обновления выгрузки (для режима Changes) 52 | 53 | .PARAMETER Force 54 | Принудительная полная выгрузка при несоответствии версий (для режима Changes) 55 | 56 | .PARAMETER Extension 57 | Имя расширения для выгрузки 58 | 59 | .PARAMETER AllExtensions 60 | Выгрузить все расширения 61 | 62 | .EXAMPLE 63 | .\dump-config.ps1 -Mode Full -OutputDir "src" -InfoBasePath "C:\Bases\MyBase" 64 | 65 | .EXAMPLE 66 | .\dump-config.ps1 -Mode Changes -ChangesFile "changes.txt" -InfoBaseName "MyBase" 67 | 68 | .EXAMPLE 69 | .\dump-config.ps1 -Mode Partial -ObjectsListFile "dump_objects.txt" -InfoBasePath "C:\Bases\MyBase" 70 | 71 | .NOTES 72 | Требует: 1cv8.exe 73 | #> 74 | 75 | [CmdletBinding()] 76 | param( 77 | [Parameter(Mandatory=$false)] 78 | [ValidateSet("Full", "Changes", "Partial", "UpdateInfo")] 79 | [string]$Mode = "Changes", 80 | 81 | [Parameter(Mandatory=$false)] 82 | [Alias("ConfigDir")] 83 | [string]$OutputDir, 84 | 85 | [Parameter(Mandatory=$false)] 86 | [string]$InfoBasePath, 87 | 88 | [Parameter(Mandatory=$false)] 89 | [string]$InfoBaseName, 90 | 91 | [Parameter(Mandatory=$false)] 92 | [string]$UserName, 93 | 94 | [Parameter(Mandatory=$false)] 95 | [string]$Password, 96 | 97 | [Parameter(Mandatory=$false)] 98 | [ValidateSet("Hierarchical", "Plain")] 99 | [string]$Format = "Hierarchical", 100 | 101 | [Parameter(Mandatory=$false)] 102 | [string]$V8Path = "1cv8.exe", 103 | 104 | [Parameter(Mandatory=$false)] 105 | [string]$OutFile, 106 | 107 | [Parameter(Mandatory=$false)] 108 | [switch]$DebugMode, 109 | 110 | [Parameter(Mandatory=$false)] 111 | [string[]]$Objects, 112 | 113 | [Parameter(Mandatory=$false)] 114 | [string]$ChangesFile, 115 | 116 | [Parameter(Mandatory=$false)] 117 | [string]$CompareWith, 118 | 119 | [Parameter(Mandatory=$false)] 120 | [switch]$UpdateMode, 121 | 122 | [Parameter(Mandatory=$false)] 123 | [switch]$Force, 124 | 125 | [Parameter(Mandatory=$false)] 126 | [string]$Extension, 127 | 128 | [Parameter(Mandatory=$false)] 129 | [switch]$AllExtensions 130 | ) 131 | 132 | # Устанавливаем кодировку для текущей сессии PowerShell 133 | $OutputEncoding = [System.Text.Encoding]::UTF8 134 | [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 135 | # Функция для загрузки переменных окружения из .env файла 136 | function Import-EnvFile { 137 | param([string]$EnvFilePath = ".env") 138 | 139 | if (Test-Path $EnvFilePath) { 140 | Get-Content $EnvFilePath -Encoding UTF8 | ForEach-Object { 141 | $line = $_.Trim() 142 | # Пропускаем пустые строки и комментарии 143 | if ($line -and -not $line.StartsWith('#')) { 144 | if ($line -match '^([^=]+)=(.*)$') { 145 | $name = $matches[1].Trim() 146 | $value = $matches[2].Trim() 147 | # Удаляем кавычки если есть 148 | $value = $value -replace '^["'']|["'']$', '' 149 | [Environment]::SetEnvironmentVariable($name, $value, 'Process') 150 | } 151 | } 152 | } 153 | return $true 154 | } 155 | return $false 156 | } 157 | 158 | # Загружаем переменные окружения из .env файла (если существует) 159 | $envLoaded = Import-EnvFile 160 | if ($envLoaded) { 161 | Write-Verbose "Environment variables loaded from .env file" 162 | } 163 | 164 | # Приоритет: Параметр командной строки → .env файл → Значение по умолчанию 165 | if (-not $PSBoundParameters.ContainsKey('V8Path')) { 166 | $envV8Path = [Environment]::GetEnvironmentVariable('V8_PATH', 'Process') 167 | if ($envV8Path) { $V8Path = $envV8Path } 168 | } 169 | 170 | if (-not $PSBoundParameters.ContainsKey('OutputDir')) { 171 | $envOutputDir = [Environment]::GetEnvironmentVariable('DUMP_OUTPUT_DIR', 'Process') 172 | if ($envOutputDir) { 173 | $OutputDir = $envOutputDir 174 | } else { 175 | # Если DUMP_OUTPUT_DIR не задан, пробуем использовать CONFIG_DIR для единообразия 176 | $envConfigDir = [Environment]::GetEnvironmentVariable('CONFIG_DIR', 'Process') 177 | if ($envConfigDir) { $OutputDir = $envConfigDir } 178 | } 179 | } 180 | 181 | if (-not $PSBoundParameters.ContainsKey('Format')) { 182 | $envFormat = [Environment]::GetEnvironmentVariable('CONFIG_FORMAT', 'Process') 183 | if ($envFormat -and ($envFormat -eq 'Hierarchical' -or $envFormat -eq 'Plain')) { 184 | $Format = $envFormat 185 | } 186 | } 187 | 188 | if (-not $PSBoundParameters.ContainsKey('Mode')) { 189 | $envMode = [Environment]::GetEnvironmentVariable('DUMP_MODE', 'Process') 190 | if ($envMode -and ($envMode -eq 'Full' -or $envMode -eq 'Changes' -or $envMode -eq 'Partial' -or $envMode -eq 'UpdateInfo')) { 191 | $Mode = $envMode 192 | } 193 | } 194 | 195 | if (-not $PSBoundParameters.ContainsKey('InfoBasePath')) { 196 | $envInfoBasePath = [Environment]::GetEnvironmentVariable('INFOBASE_PATH', 'Process') 197 | if ($envInfoBasePath) { $InfoBasePath = $envInfoBasePath } 198 | } 199 | 200 | if (-not $PSBoundParameters.ContainsKey('InfoBaseName')) { 201 | $envInfoBaseName = [Environment]::GetEnvironmentVariable('INFOBASE_NAME', 'Process') 202 | if ($envInfoBaseName) { $InfoBaseName = $envInfoBaseName } 203 | } 204 | 205 | if (-not $PSBoundParameters.ContainsKey('UserName')) { 206 | $envUserName = [Environment]::GetEnvironmentVariable('USERNAME_1C', 'Process') 207 | if ($envUserName) { $UserName = $envUserName } 208 | } 209 | 210 | if (-not $PSBoundParameters.ContainsKey('Password')) { 211 | $envPassword = [Environment]::GetEnvironmentVariable('PASSWORD_1C', 'Process') 212 | if ($envPassword) { $Password = $envPassword } 213 | } 214 | 215 | if (-not $PSBoundParameters.ContainsKey('OutFile')) { 216 | $envOutFile = [Environment]::GetEnvironmentVariable('OUT_FILE', 'Process') 217 | if ($envOutFile) { $OutFile = $envOutFile } 218 | } 219 | 220 | if (-not $PSBoundParameters.ContainsKey('DebugMode')) { 221 | $envDebugMode = [Environment]::GetEnvironmentVariable('DEBUG_MODE', 'Process') 222 | if ($envDebugMode -eq 'true') { $DebugMode = $true } 223 | } 224 | 225 | if (-not $PSBoundParameters.ContainsKey('Objects')) { 226 | $envObjectsList = [Environment]::GetEnvironmentVariable('DUMP_OBJECTS_LIST', 'Process') 227 | if ($envObjectsList) { 228 | # DUMP_OBJECTS_LIST может быть путем к файлу. Проверяем это. 229 | if (Test-Path $envObjectsList) { 230 | $Objects = Get-Content -Path $envObjectsList -Encoding UTF8 | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } 231 | } 232 | # Иначе, считаем, что это строка с именами через запятую (для будущей гибкости) 233 | else { 234 | $Objects = $envObjectsList.Split(',') | ForEach-Object { $_.Trim() } 235 | } 236 | } 237 | } 238 | 239 | if (-not $PSBoundParameters.ContainsKey('ChangesFile')) { 240 | $envChangesFile = [Environment]::GetEnvironmentVariable('DUMP_CHANGES_FILE', 'Process') 241 | if ($envChangesFile) { $ChangesFile = $envChangesFile } 242 | } 243 | 244 | if (-not $PSBoundParameters.ContainsKey('CompareWith')) { 245 | $envCompareWith = [Environment]::GetEnvironmentVariable('DUMP_COMPARE_WITH', 'Process') 246 | if ($envCompareWith) { $CompareWith = $envCompareWith } 247 | } 248 | 249 | # Функция для вывода отладочной информации 250 | function Write-DebugInfo { 251 | param([string]$Message) 252 | if ($DebugMode) { 253 | Write-Host "[DEBUG] $Message" -ForegroundColor Cyan 254 | } 255 | } 256 | 257 | function Write-ErrorInfo { 258 | param([string]$Message) 259 | Write-Host "Error: $Message" -ForegroundColor Red 260 | } 261 | 262 | # Проверка обязательных параметров 263 | if (-not $InfoBasePath -and -not $InfoBaseName) { 264 | Write-ErrorInfo "InfoBasePath or InfoBaseName required" 265 | exit 1 266 | } 267 | 268 | # Проверка параметров для режима Partial 269 | if ($Mode -eq "Partial") { 270 | if (-not $Objects -or $Objects.Count -eq 0) { 271 | Write-ErrorInfo "Array of objects is required for Partial mode" 272 | Write-Host "Please use wrapper 'dump-partial-config.ps1' with -ObjectsListFile or -ObjectNames parameter" -ForegroundColor Yellow 273 | exit 1 274 | } 275 | } 276 | 277 | # Создание выходного каталога если не существует 278 | if (-not (Test-Path $OutputDir)) { 279 | Write-Host "Creating output directory: $OutputDir" -ForegroundColor Green 280 | New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null 281 | } 282 | 283 | # Проверка существования 1cv8.exe 284 | $v8Exists = $false 285 | if ([System.IO.Path]::IsPathRooted($V8Path)) { 286 | $v8Exists = Test-Path $V8Path 287 | } else { 288 | try { 289 | $null = Get-Command $V8Path -ErrorAction Stop 290 | $v8Exists = $true 291 | } catch { 292 | $v8Exists = $false 293 | } 294 | } 295 | 296 | if (-not $v8Exists) { 297 | Write-Host "" 298 | Write-ErrorInfo "1C:Enterprise platform (1cv8.exe) not found" 299 | Write-Host "" 300 | Write-Host "Checked path: $V8Path" -ForegroundColor Yellow 301 | Write-Host "" 302 | Write-Host "Please check:" -ForegroundColor Cyan 303 | Write-Host " 1. 1C:Enterprise is installed" -ForegroundColor Gray 304 | Write-Host " 2. Correct path specified in V8_PATH parameter or .env file" -ForegroundColor Gray 305 | Write-Host " 3. 1cv8.exe is in system PATH (if using relative path)" -ForegroundColor Gray 306 | Write-Host "" 307 | exit 1 308 | } 309 | 310 | Write-DebugInfo "Using 1C platform: $V8Path" 311 | Write-DebugInfo "Dump mode: $Mode" 312 | Write-DebugInfo "Output directory: $OutputDir" 313 | Write-DebugInfo "Format: $Format" 314 | 315 | # Создание временного каталога 316 | $tempDir = Join-Path $env:TEMP "1c_dump_config_$(Get-Random)" 317 | New-Item -ItemType Directory -Path $tempDir -Force | Out-Null 318 | Write-DebugInfo "Temp directory: $tempDir" 319 | 320 | try { 321 | # Формирование командной строки для 1cv8 322 | $arguments = @("DESIGNER") 323 | 324 | # Параметры подключения к ИБ 325 | if ($InfoBaseName) { 326 | $arguments += "/IBName", "`"$InfoBaseName`"" 327 | } else { 328 | $arguments += "/F", "`"$InfoBasePath`"" 329 | } 330 | 331 | # Учетные данные 332 | if ($UserName) { $arguments += "/N", "`"$UserName`"" } 333 | if ($Password) { $arguments += "/P", "`"$Password`"" } 334 | 335 | # Команда выгрузки 336 | $arguments += "/DumpConfigToFiles", "`"$OutputDir`"" 337 | 338 | # Формат выгрузки 339 | $arguments += "-Format", $Format 340 | 341 | # Параметры в зависимости от режима 342 | switch ($Mode) { 343 | "Full" { 344 | Write-Host "Executing full configuration dump..." -ForegroundColor Green 345 | # Для полной выгрузки дополнительных параметров не нужно 346 | } 347 | 348 | "Changes" { 349 | Write-Host "Executing incremental configuration dump..." -ForegroundColor Green 350 | $arguments += "-update" 351 | 352 | if ($ChangesFile) { 353 | $arguments += "-getChanges", "`"$ChangesFile`"" 354 | Write-DebugInfo "Changes will be saved to: $ChangesFile" 355 | } 356 | 357 | if ($CompareWith) { 358 | if (Test-Path $CompareWith) { 359 | $arguments += "-configDumpInfoForChanges", "`"$CompareWith`"" 360 | Write-DebugInfo "Comparing with: $CompareWith" 361 | } else { 362 | Write-Host "Warning: ConfigDumpInfo file not found: $CompareWith" -ForegroundColor Yellow 363 | } 364 | } 365 | 366 | if ($Force) { 367 | $arguments += "-force" 368 | Write-DebugInfo "Force mode enabled" 369 | } 370 | } 371 | 372 | "Partial" { 373 | Write-Host "Executing partial configuration dump..." -ForegroundColor Green 374 | 375 | # Создаем временный файл в КОРНЕ ПРОЕКТА в правильной кодировке (UTF-8 with BOM) 376 | $tempListFile = Join-Path $PSScriptRoot "partial_dump_list.txt" 377 | $utf8WithBom = New-Object System.Text.UTF8Encoding($true) 378 | # Записываем в него массив объектов, полученный от обертки 379 | [System.IO.File]::WriteAllLines($tempListFile, $Objects, $utf8WithBom) 380 | 381 | $arguments += "-listFile", "`"$tempListFile`"" 382 | Write-DebugInfo "Using temp list file with correct encoding: $tempListFile" 383 | 384 | if ($DebugMode) { 385 | Write-DebugInfo "Objects list content ($($Objects.Count) items):" 386 | Get-Content $tempListFile -Encoding UTF8 | ForEach-Object { Write-Host " $_" -ForegroundColor DarkGray } 387 | } 388 | } 389 | "UpdateInfo" { 390 | Write-Host "Updating ConfigDumpInfo.xml..." -ForegroundColor Green 391 | $arguments += "-configDumpInfoOnly" 392 | } 393 | } 394 | # Расширения 395 | if ($Extension) { 396 | $arguments += "-Extension", "`"$Extension`"" 397 | Write-DebugInfo "Dumping extension: $Extension" 398 | } elseif ($AllExtensions) { 399 | $arguments += "-AllExtensions" 400 | Write-DebugInfo "Dumping all extensions" 401 | } 402 | 403 | # Вывод служебных сообщений 404 | if (-not $OutFile) { 405 | $OutFile = Join-Path $tempDir "dump_log.txt" 406 | } 407 | $arguments += "/Out", "`"$OutFile`"" 408 | 409 | # Отключение диалогов 410 | $arguments += "/DisableStartupDialogs" 411 | 412 | # Выполнение команды 413 | Write-Host "" 414 | if ($DebugMode) { 415 | $cmdLine = "$V8Path $($arguments -join ' ')" 416 | Write-DebugInfo "Command: $cmdLine" 417 | } 418 | 419 | $process = Start-Process -FilePath $V8Path ` 420 | -ArgumentList $arguments ` 421 | -NoNewWindow ` 422 | -Wait ` 423 | -PassThru 424 | 425 | $exitCode = $process.ExitCode 426 | 427 | Write-Host "" 428 | if ($exitCode -eq 0) { 429 | Write-Host "Dump completed successfully" -ForegroundColor Green 430 | Write-Host "Configuration dumped to: $OutputDir" -ForegroundColor Green 431 | 432 | # Выводим информацию об изменениях для режима Changes 433 | if ($Mode -eq "Changes" -and $ChangesFile -and (Test-Path $ChangesFile)) { 434 | Write-Host "" 435 | Write-Host "--- Changes detected ---" -ForegroundColor Yellow 436 | Get-Content $ChangesFile | Write-Host 437 | Write-Host "--- End of changes ---" -ForegroundColor Yellow 438 | } 439 | } else { 440 | Write-Host "Error dumping configuration (code: $exitCode)" -ForegroundColor Red 441 | } 442 | 443 | if (Test-Path $OutFile) { 444 | Write-Host "" 445 | Write-Host "--- Execution log ---" -ForegroundColor Yellow 446 | Get-Content $OutFile | Write-Host 447 | Write-Host "--- End of log ---" -ForegroundColor Yellow 448 | } 449 | 450 | exit $exitCode 451 | 452 | } finally { 453 | # Удаляем временный файл списка, если он был создан 454 | if ($tempListFile -and (Test-Path $tempListFile)) { 455 | Remove-Item -Path $tempListFile -Force 456 | Write-DebugInfo "Temporary list file deleted" 457 | } 458 | 459 | if (-not $DebugMode) { 460 | if (Test-Path $tempDir) { 461 | Remove-Item -Path $tempDir -Recurse -Force 462 | Write-DebugInfo "Temporary files deleted" 463 | } 464 | } else { 465 | Write-DebugInfo "Temporary files saved in: $tempDir" 466 | } 467 | } -------------------------------------------------------------------------------- /scripts/partial-load-config.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | chcp 65001 >nul 3 | setlocal enabledelayedexpansion 4 | 5 | REM ============================================================================ 6 | REM DEPRECATED: Use loadcfg.cmd instead (located in project root) 7 | REM ---------------------------------------------------------------------------- 8 | REM This script is kept for backward compatibility. 9 | REM New projects should use: loadcfg.cmd 10 | REM ============================================================================ 11 | REM 12 | REM Скрипт частичной загрузки конфигурации 1С из файлов по коммиту git 13 | REM ============================================================================ 14 | REM 15 | REM Использование: 16 | REM partial-load-config.cmd [options] 17 | REM 18 | REM Параметры: 19 | REM - Идентификатор коммита git 20 | REM /ib - Путь к информационной базе (файловая) или строка подключения 21 | REM /ibname - Имя информационной базы из списка 22 | REM /n - Имя пользователя 23 | REM /p - Пароль пользователя 24 | REM /configdir - Каталог с выгруженной конфигурацией (по умолчанию: ./config) 25 | REM /format - Формат конфигурации: Hierarchical или Plain (по умолчанию: Hierarchical) 26 | REM /v8 - Путь к 1cv8.exe (по умолчанию: ищется в PATH) 27 | REM /out - Файл для вывода служебных сообщений 28 | REM /debug - Режим отладки (вывод дополнительной информации) 29 | REM /updatedb - Обновить конфигурацию БД после загрузки 30 | REM /run - Запустить 1С:Предприятие после загрузки 31 | REM /navlink - Навигационная ссылка для запуска 32 | REM /runep - Путь к внешней обработке для запуска 33 | REM 34 | REM ============================================================================ 35 | 36 | REM Параметры по умолчанию 37 | set "COMMIT_ID=" 38 | set "IB_PATH=" 39 | set "IB_NAME=" 40 | set "USER_NAME=" 41 | set "USER_PWD=" 42 | set "CONFIG_DIR=config" 43 | set "CONFIG_FORMAT=Hierarchical" 44 | set "V8_PATH=1cv8.exe" 45 | set "OUT_FILE=" 46 | set "DEBUG_MODE=0" 47 | set "UPDATE_DB=0" 48 | set "RUN_ENTERPRISE=0" 49 | set "NAVIGATION_LINK=" 50 | set "EXTERNAL_DATA_PROCESSOR=" 51 | set "TEMP_DIR=%TEMP%\1c_partial_load_%RANDOM%" 52 | set "LIST_FILE=%TEMP_DIR%\load_list.txt" 53 | 54 | REM Загрузка переменных из .env файла, если он существует 55 | if exist ".env" ( 56 | if "!DEBUG_MODE!"=="1" echo [DEBUG] Loading environment variables from .env file 57 | for /f "usebackq eol=# delims=" %%a in (".env") do ( 58 | for /f "tokens=1,* delims==" %%b in ("%%a") do ( 59 | set "key=%%b" 60 | set "value=%%c" 61 | 62 | REM Убираем кавычки из значения 63 | if defined value ( 64 | if "!value:~0,1!"=="""" set "value=!value:~1,-1!" 65 | ) 66 | 67 | if /i "!key!"=="V8_PATH" if "!V8_PATH!"=="1cv8.exe" set "V8_PATH=!value!" 68 | if /i "!key!"=="CONFIG_DIR" if "!CONFIG_DIR!"=="config" set "CONFIG_DIR=!value!" 69 | if /i "!key!"=="CONFIG_FORMAT" if "!CONFIG_FORMAT!"=="Hierarchical" set "CONFIG_FORMAT=!value!" 70 | if /i "!key!"=="INFOBASE_PATH" if "!IB_PATH!"=="" set "IB_PATH=!value!" 71 | if /i "!key!"=="INFOBASE_NAME" if "!IB_NAME!"=="" set "IB_NAME=!value!" 72 | if /i "!key!"=="USERNAME_1C" if "!USER_NAME!"=="" set "USER_NAME=!value!" 73 | if /i "!key!"=="DEBUG_MODE" if "!DEBUG_MODE!"=="0" if /i "!value!"=="true" set "DEBUG_MODE=1" 74 | if /i "!key!"=="UPDATE_DB" if "!UPDATE_DB!"=="0" if /i "!value!"=="true" set "UPDATE_DB=1" 75 | if /i "!key!"=="RUN_ENTERPRISE" if "!RUN_ENTERPRISE!"=="0" if /i "!value!"=="true" set "RUN_ENTERPRISE=1" 76 | ) 77 | ) 78 | ) 79 | 80 | REM Разбор параметров командной строки 81 | :parse_args 82 | if "%~1"=="" goto check_params 83 | if "%~1"=="/ib" ( 84 | set "IB_PATH=%~2" 85 | shift 86 | shift 87 | goto parse_args 88 | ) 89 | if "%~1"=="/ibname" ( 90 | set "IB_NAME=%~2" 91 | shift 92 | shift 93 | goto parse_args 94 | ) 95 | if "%~1"=="/n" ( 96 | set "USER_NAME=%~2" 97 | shift 98 | shift 99 | goto parse_args 100 | ) 101 | if "%~1"=="/p" ( 102 | set "USER_PWD=%~2" 103 | shift 104 | shift 105 | goto parse_args 106 | ) 107 | if "%~1"=="/configdir" ( 108 | set "CONFIG_DIR=%~2" 109 | shift 110 | shift 111 | goto parse_args 112 | ) 113 | if "%~1"=="/format" ( 114 | set "CONFIG_FORMAT=%~2" 115 | shift 116 | shift 117 | goto parse_args 118 | ) 119 | if "%~1"=="/v8" ( 120 | set "V8_PATH=%~2" 121 | shift 122 | shift 123 | goto parse_args 124 | ) 125 | if "%~1"=="/out" ( 126 | set "OUT_FILE=%~2" 127 | shift 128 | shift 129 | goto parse_args 130 | ) 131 | if "%~1"=="/debug" ( 132 | set "DEBUG_MODE=1" 133 | shift 134 | goto parse_args 135 | ) 136 | if "%~1"=="/updatedb" ( 137 | set "UPDATE_DB=1" 138 | shift 139 | goto parse_args 140 | ) 141 | if "%~1"=="/run" ( 142 | set "RUN_ENTERPRISE=1" 143 | shift 144 | goto parse_args 145 | ) 146 | if "%~1"=="/navlink" ( 147 | set "NAVIGATION_LINK=%~2" 148 | shift 149 | shift 150 | goto parse_args 151 | ) 152 | if "%~1"=="/runep" ( 153 | set "EXTERNAL_DATA_PROCESSOR=%~2" 154 | shift 155 | shift 156 | goto parse_args 157 | ) 158 | if "!COMMIT_ID!"=="" ( 159 | set "COMMIT_ID=%~1" 160 | shift 161 | goto parse_args 162 | ) 163 | echo Unknown parameter: %~1 164 | goto usage 165 | 166 | :check_params 167 | if "!IB_PATH!"=="" if "!IB_NAME!"=="" ( 168 | echo Error: InfoBasePath or InfoBaseName required 169 | goto usage 170 | ) 171 | 172 | if not exist "!CONFIG_DIR!" ( 173 | echo Error: Config directory not found: !CONFIG_DIR! 174 | exit /b 1 175 | ) 176 | 177 | where git >nul 2>&1 178 | if errorlevel 1 ( 179 | echo Error: git not found in PATH 180 | exit /b 1 181 | ) 182 | 183 | REM Создание временного каталога 184 | if not exist "!TEMP_DIR!" mkdir "!TEMP_DIR!" 185 | 186 | if "!DEBUG_MODE!"=="1" ( 187 | echo [DEBUG] Commit ID: !COMMIT_ID! 188 | echo [DEBUG] Config dir: !CONFIG_DIR! 189 | echo [DEBUG] Format: !CONFIG_FORMAT! 190 | echo [DEBUG] Temp dir: !TEMP_DIR! 191 | echo [DEBUG] List file: !LIST_FILE! 192 | ) 193 | 194 | REM Получение списка измененных файлов 195 | if "!COMMIT_ID!"=="" ( 196 | echo Checking for uncommitted changes... 197 | 198 | REM Получаем staged изменения 199 | if "!DEBUG_MODE!"=="1" echo [DEBUG] Getting staged changes... 200 | git diff --cached --name-only > "!TEMP_DIR!\staged.txt" 2>&1 201 | ) else ( 202 | echo Getting changed files from commit !COMMIT_ID! to current state... 203 | 204 | REM Получаем изменения от коммита до HEAD 205 | if "!DEBUG_MODE!"=="1" echo [DEBUG] Getting changes from !COMMIT_ID! to HEAD... 206 | git diff --name-only "!COMMIT_ID!..HEAD" > "!TEMP_DIR!\commit_to_head.txt" 2>&1 207 | if errorlevel 1 ( 208 | echo Error getting changes from commit to HEAD 209 | type "!TEMP_DIR!\commit_to_head.txt" 210 | goto cleanup 211 | ) 212 | 213 | REM Получаем staged изменения 214 | if "!DEBUG_MODE!"=="1" echo [DEBUG] Getting staged changes... 215 | git diff --cached --name-only > "!TEMP_DIR!\staged.txt" 2>&1 216 | ) 217 | if errorlevel 1 ( 218 | echo Error getting staged changes 219 | type "!TEMP_DIR!\staged.txt" 220 | goto cleanup 221 | ) 222 | 223 | REM Получаем unstaged изменения (измененные файлы) 224 | if "!DEBUG_MODE!"=="1" echo [DEBUG] Getting unstaged changes... 225 | git diff --name-only > "!TEMP_DIR!\unstaged.txt" 2>&1 226 | if errorlevel 1 ( 227 | echo Error getting unstaged changes 228 | type "!TEMP_DIR!\unstaged.txt" 229 | goto cleanup 230 | ) 231 | 232 | REM Получаем untracked файлы (новые файлы, не добавленные в git) 233 | if "!DEBUG_MODE!"=="1" echo [DEBUG] Getting untracked files... 234 | git ls-files --others --exclude-standard > "!TEMP_DIR!\untracked.txt" 2>&1 235 | if errorlevel 1 ( 236 | echo Error getting untracked files 237 | type "!TEMP_DIR!\untracked.txt" 238 | goto cleanup 239 | ) 240 | 241 | REM Объединяем все файлы 242 | if "!COMMIT_ID!"=="" ( 243 | copy /b "!TEMP_DIR!\staged.txt"+"!TEMP_DIR!\unstaged.txt"+"!TEMP_DIR!\untracked.txt" "!TEMP_DIR!\all_changes.txt" >nul 2>&1 244 | ) else ( 245 | copy /b "!TEMP_DIR!\commit_to_head.txt"+"!TEMP_DIR!\staged.txt"+"!TEMP_DIR!\unstaged.txt"+"!TEMP_DIR!\untracked.txt" "!TEMP_DIR!\all_changes.txt" >nul 2>&1 246 | ) 247 | 248 | REM Подсчет статистики для отладки 249 | if "!DEBUG_MODE!"=="1" ( 250 | if not "!COMMIT_ID!"=="" ( 251 | for /f %%i in ('type "!TEMP_DIR!\commit_to_head.txt" 2^>nul ^| find /c /v ""') do echo [DEBUG] Changes from !COMMIT_ID! to HEAD: %%i files 252 | ) 253 | for /f %%i in ('type "!TEMP_DIR!\staged.txt" 2^>nul ^| find /c /v ""') do echo [DEBUG] Staged changes: %%i files 254 | for /f %%i in ('type "!TEMP_DIR!\unstaged.txt" 2^>nul ^| find /c /v ""') do echo [DEBUG] Unstaged changes: %%i files 255 | for /f %%i in ('type "!TEMP_DIR!\untracked.txt" 2^>nul ^| find /c /v ""') do echo [DEBUG] Untracked files: %%i files 256 | ) 257 | 258 | REM Убираем дубликаты и пустые строки (используем sort) 259 | if exist "!TEMP_DIR!\all_changes.txt" ( 260 | type "!TEMP_DIR!\all_changes.txt" | sort /unique > "!TEMP_DIR!\changed_files.txt" 261 | ) else ( 262 | type nul > "!TEMP_DIR!\changed_files.txt" 263 | ) 264 | 265 | if "!DEBUG_MODE!"=="1" ( 266 | for /f %%i in ('type "!TEMP_DIR!\changed_files.txt" ^| find /c /v ""') do echo [DEBUG] Total unique files: %%i 267 | ) 268 | 269 | REM Фильтрация файлов конфигурации и создание списка для загрузки 270 | echo Preparing file list for loading... 271 | set "FILE_COUNT=0" 272 | set "TEMP_LIST=!TEMP_DIR!\temp_list.txt" 273 | if exist "!TEMP_LIST!" del "!TEMP_LIST!" 274 | 275 | REM Обрабатываем файлы построчно (используем PowerShell для обработки) 276 | powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0process-config-files.ps1" -ChangedFilesPath "!TEMP_DIR!\\changed_files.txt" -ConfigDir "!CONFIG_DIR!" -TempList "!TEMP_LIST!" -DebugMode "!DEBUG_MODE!" 277 | 278 | REM Подсчитываем количество файлов 279 | if exist "!TEMP_LIST!" ( 280 | for /f %%i in ('type "!TEMP_LIST!" ^| find /c /v ""') do set "FILE_COUNT=%%i" 281 | ) else ( 282 | set "FILE_COUNT=0" 283 | ) 284 | 285 | 286 | REM Убираем дубликаты и создаем финальный список 287 | if exist "!TEMP_LIST!" ( 288 | type "!TEMP_LIST!" | sort /unique > "!LIST_FILE!" 289 | del "!TEMP_LIST!" 290 | ) 291 | 292 | set "FILE_COUNT=0" 293 | for /f %%i in ('type "!LIST_FILE!" ^| find /c /v ""') do set "FILE_COUNT=%%i" 294 | 295 | if "!FILE_COUNT!"=="0" ( 296 | if "!COMMIT_ID!"=="" ( 297 | echo No configuration files found in uncommitted changes 298 | ) else ( 299 | echo No configuration files found for loading in commit !COMMIT_ID! 300 | ) 301 | goto cleanup 302 | ) 303 | 304 | echo Files found for loading: !FILE_COUNT! 305 | 306 | if "!DEBUG_MODE!"=="1" ( 307 | echo [DEBUG] List file content: 308 | type "!LIST_FILE!" 309 | ) 310 | 311 | REM Проверка существования 1cv8.exe 312 | set "V8_EXISTS=0" 313 | 314 | REM Проверяем абсолютный путь 315 | if exist "!V8_PATH!" ( 316 | set "V8_EXISTS=1" 317 | ) else ( 318 | REM Проверяем в PATH 319 | where "!V8_PATH!" >nul 2>&1 320 | if !ERRORLEVEL! EQU 0 ( 321 | set "V8_EXISTS=1" 322 | ) 323 | ) 324 | 325 | if "!V8_EXISTS!"=="0" ( 326 | echo. 327 | echo [ERROR] 1C:Enterprise platform ^(1cv8.exe^) not found 328 | echo. 329 | echo Checked path: !V8_PATH! 330 | echo. 331 | echo Please check: 332 | echo 1. 1C:Enterprise is installed 333 | echo 2. Correct path specified in /v8 parameter or V8_PATH environment variable 334 | echo 3. 1cv8.exe is in system PATH ^(if using relative path^) 335 | echo. 336 | echo Examples: 337 | echo set V8_PATH=C:\Program Files\1cv8\8.3.24.1467\bin\1cv8.exe 338 | echo partial-load-config.cmd /v8 "C:\Program Files\1cv8\8.3.24.1467\bin\1cv8.exe" 339 | echo. 340 | set "EXIT_CODE=1" 341 | goto cleanup 342 | ) 343 | 344 | if "!DEBUG_MODE!"=="1" echo [DEBUG] Using 1C platform: !V8_PATH! 345 | 346 | REM Формирование командной строки для 1cv8 347 | set "CMD_LINE="!V8_PATH!" DESIGNER" 348 | 349 | REM Параметры подключения к ИБ 350 | if not "!IB_NAME!"=="" ( 351 | set "CMD_LINE=!CMD_LINE! /IBName "!IB_NAME!"" 352 | ) else ( 353 | set "CMD_LINE=!CMD_LINE! /F !IB_PATH!" 354 | ) 355 | 356 | REM Учетные данные 357 | if not "!USER_NAME!"=="" set "CMD_LINE=!CMD_LINE! /N "!USER_NAME!"" 358 | if not "!USER_PWD!"=="" set "CMD_LINE=!CMD_LINE! /P "!USER_PWD!"" 359 | 360 | REM Параметры загрузки 361 | set "CMD_LINE=!CMD_LINE! /LoadConfigFromFiles "!CONFIG_DIR!"" 362 | set "CMD_LINE=!CMD_LINE! -listFile "!LIST_FILE!"" 363 | set "CMD_LINE=!CMD_LINE! -Format !CONFIG_FORMAT!" 364 | set "CMD_LINE=!CMD_LINE! -partial" 365 | set "CMD_LINE=!CMD_LINE! -updateConfigDumpInfo" 366 | 367 | REM Вывод служебных сообщений 368 | if not "!OUT_FILE!"=="" ( 369 | set "CMD_LINE=!CMD_LINE! /Out "!OUT_FILE!"" 370 | ) else ( 371 | set "CMD_LINE=!CMD_LINE! /Out "!TEMP_DIR!\load_log.txt"" 372 | set "OUT_FILE=!TEMP_DIR!\load_log.txt" 373 | ) 374 | 375 | REM Отключение диалогов 376 | set "CMD_LINE=!CMD_LINE! /DisableStartupDialogs" 377 | 378 | echo. 379 | echo Executing configuration load... 380 | if "!DEBUG_MODE!"=="1" ( 381 | echo [DEBUG] Command: !CMD_LINE! 382 | ) 383 | 384 | REM Выполнение команды 385 | !CMD_LINE! 386 | set "EXIT_CODE=!errorlevel!" 387 | 388 | echo. 389 | if "!EXIT_CODE!"=="0" ( 390 | echo Load completed successfully 391 | ) else ( 392 | echo Error loading configuration ^(code: !EXIT_CODE!^) 393 | ) 394 | 395 | if exist "!OUT_FILE!" ( 396 | echo. 397 | echo --- Execution log --- 398 | type "!OUT_FILE!" 399 | echo --- End of log --- 400 | ) 401 | 402 | if "!EXIT_CODE!" NEQ "0" goto cleanup 403 | 404 | REM Обновление конфигурации БД 405 | if "!UPDATE_DB!"=="1" ( 406 | echo. 407 | echo Updating database configuration... 408 | 409 | set "UPDATE_CMD="!V8_PATH!" DESIGNER" 410 | if not "!IB_NAME!"=="" ( 411 | set "UPDATE_CMD=!UPDATE_CMD! /IBName "!IB_NAME!"" 412 | ) else ( 413 | set "UPDATE_CMD=!UPDATE_CMD! /F !IB_PATH!" 414 | ) 415 | if not "!USER_NAME!"=="" set "UPDATE_CMD=!UPDATE_CMD! /N "!USER_NAME!"" 416 | if not "!USER_PWD!"=="" set "UPDATE_CMD=!UPDATE_CMD! /P "!USER_PWD!"" 417 | 418 | set "UPDATE_CMD=!UPDATE_CMD! /UpdateDBCfg" 419 | set "UPDATE_CMD=!UPDATE_CMD! /DisableStartupDialogs" 420 | 421 | set "UPDATE_OUT=!TEMP_DIR!\update_log.txt" 422 | set "UPDATE_CMD=!UPDATE_CMD! /Out "!UPDATE_OUT!"" 423 | 424 | if "!DEBUG_MODE!"=="1" ( 425 | echo [DEBUG] Update command: !UPDATE_CMD! 426 | ) 427 | 428 | !UPDATE_CMD! 429 | set "UPDATE_EXIT_CODE=!errorlevel!" 430 | 431 | echo. 432 | if "!UPDATE_EXIT_CODE!"=="0" ( 433 | echo Database configuration updated successfully 434 | ) else ( 435 | echo Error updating database configuration ^(code: !UPDATE_EXIT_CODE!^) 436 | set "EXIT_CODE=!UPDATE_EXIT_CODE!" 437 | ) 438 | 439 | if exist "!UPDATE_OUT!" ( 440 | echo. 441 | echo --- Update log --- 442 | type "!UPDATE_OUT!" 443 | echo --- End of update log --- 444 | ) 445 | 446 | if "!EXIT_CODE!" NEQ "0" goto cleanup 447 | ) 448 | 449 | REM Запуск 1С:Предприятие 450 | if "!RUN_ENTERPRISE!"=="1" ( 451 | echo. 452 | echo Starting 1C:Enterprise... 453 | 454 | set "ENTERPRISE_CMD="!V8_PATH!" ENTERPRISE" 455 | if not "!IB_NAME!"=="" ( 456 | set "ENTERPRISE_CMD=!ENTERPRISE_CMD! /IBName "!IB_NAME!"" 457 | ) else ( 458 | set "ENTERPRISE_CMD=!ENTERPRISE_CMD! /F !IB_PATH!" 459 | ) 460 | if not "!USER_NAME!"=="" set "ENTERPRISE_CMD=!ENTERPRISE_CMD! /N "!USER_NAME!"" 461 | if not "!USER_PWD!"=="" set "ENTERPRISE_CMD=!ENTERPRISE_CMD! /P "!USER_PWD!"" 462 | 463 | if not "!NAVIGATION_LINK!"=="" ( 464 | set "ENTERPRISE_CMD=!ENTERPRISE_CMD! /URL "!NAVIGATION_LINK!"" 465 | ) 466 | 467 | if not "!EXTERNAL_DATA_PROCESSOR!"=="" ( 468 | if exist "!EXTERNAL_DATA_PROCESSOR!" ( 469 | set "ENTERPRISE_CMD=!ENTERPRISE_CMD! /Execute "!EXTERNAL_DATA_PROCESSOR!"" 470 | ) else ( 471 | echo Warning: External data processor not found: !EXTERNAL_DATA_PROCESSOR! 472 | ) 473 | ) 474 | 475 | if "!DEBUG_MODE!"=="1" ( 476 | echo [DEBUG] Enterprise command: !ENTERPRISE_CMD! 477 | ) 478 | 479 | start "" !ENTERPRISE_CMD! 480 | echo 1C:Enterprise started 481 | ) 482 | 483 | :cleanup 484 | REM Очистка временных файлов 485 | if "!DEBUG_MODE!"=="0" ( 486 | if exist "!TEMP_DIR!" rd /s /q "!TEMP_DIR!" 487 | ) else ( 488 | echo [DEBUG] Temporary files saved in: !TEMP_DIR! 489 | ) 490 | 491 | exit /b !EXIT_CODE! 492 | 493 | :usage 494 | echo. 495 | echo Usage: 496 | echo %~nx0 ^ [options] 497 | echo. 498 | echo Parameters: 499 | echo ^ - Git commit identifier (optional - if not specified, checks uncommitted changes) 500 | echo /ib ^ - Path to infobase or connection string 501 | echo /ibname ^ - Infobase name from list 502 | echo /n ^ - Username 503 | echo /p ^ - Password 504 | echo /configdir ^- Configuration directory (default: ./config) 505 | echo /format ^ - Format: Hierarchical or Plain (default: Hierarchical) 506 | echo /v8 ^ - Path to 1cv8.exe 507 | echo /out ^ - Output file for service messages 508 | echo /debug - Debug mode 509 | echo /updatedb - Update database configuration after loading 510 | echo /run - Run 1C:Enterprise after loading 511 | echo /navlink ^ - Navigation link to open in 1C:Enterprise 512 | echo /runep ^ - Path to external data processor to run 513 | echo. 514 | echo Examples: 515 | echo %~nx0 /ib "C:\Bases\MyBase" (load uncommitted changes) 516 | echo %~nx0 a3f5b21 /ib "C:\Bases\MyBase" /n Admin 517 | echo %~nx0 HEAD~1 /ibname "MyBase" /configdir ".\src" 518 | echo %~nx0 HEAD /ib "C:\Bases\MyBase" /updatedb 519 | echo %~nx0 HEAD /ib "C:\Bases\MyBase" /run /navlink "e1cib/data/Catalog.Items" 520 | echo. 521 | exit /b 1 522 | -------------------------------------------------------------------------------- /scripts/partial-load-config.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Скрипт частичной загрузки конфигурации 1С из файлов по коммиту git 4 | 5 | .DESCRIPTION 6 | Получает список измененных файлов из указанного git коммита, 7 | создает файл списка для частичной загрузки и выполняет команду 8 | LoadConfigFromFiles с параметром -partial 9 | 10 | .PARAMETER CommitId 11 | Git commit identifier (required) 12 | 13 | .PARAMETER InfoBasePath 14 | Path to file infobase 15 | 16 | .PARAMETER InfoBaseName 17 | Infobase name from list 18 | 19 | .PARAMETER UserName 20 | 1C username 21 | 22 | .PARAMETER Password 23 | User password 24 | 25 | .PARAMETER ConfigDir 26 | Configuration directory (default: config) 27 | 28 | .PARAMETER Format 29 | Format: Hierarchical or Plain (default: Hierarchical) 30 | 31 | .PARAMETER V8Path 32 | Path to 1cv8.exe (if not specified, searched in PATH) 33 | 34 | .PARAMETER OutFile 35 | Output file for service messages 36 | 37 | .PARAMETER DebugMode 38 | Debug mode with additional output 39 | 40 | .PARAMETER UpdateDB 41 | Update database configuration after loading 42 | 43 | .PARAMETER RunEnterprise 44 | Run 1C:Enterprise in user mode after loading 45 | 46 | .PARAMETER NavigationLink 47 | Navigation link to open in 1C:Enterprise (requires -RunEnterprise) 48 | 49 | .PARAMETER ExternalDataProcessor 50 | Path to external data processor to run (requires -RunEnterprise) 51 | 52 | .EXAMPLE 53 | .\partial-load-config.ps1 -CommitId "a3f5b21" -InfoBasePath "C:\Bases\MyBase" -UserName "Admin" 54 | 55 | .EXAMPLE 56 | .\partial-load-config.ps1 -CommitId "HEAD~1" -InfoBaseName "MyBase" -ConfigDir ".\src" 57 | 58 | .EXAMPLE 59 | .\partial-load-config.ps1 -CommitId "HEAD" -InfoBasePath "C:\Bases\MyBase" -UpdateDB 60 | 61 | .EXAMPLE 62 | .\partial-load-config.ps1 -CommitId "HEAD" -InfoBasePath "C:\Bases\MyBase" -RunEnterprise -NavigationLink "e1cib/data/Catalog.Items" 63 | 64 | .NOTES 65 | Требует: git, 1cv8.exe 66 | #> 67 | 68 | [CmdletBinding()] 69 | param( 70 | [Parameter(Mandatory=$false, Position=0)] 71 | [string]$CommitId, 72 | 73 | [Parameter(Mandatory=$false)] 74 | [string]$InfoBasePath, 75 | 76 | [Parameter(Mandatory=$false)] 77 | [string]$InfoBaseName, 78 | 79 | [Parameter(Mandatory=$false)] 80 | [string]$UserName, 81 | 82 | [Parameter(Mandatory=$false)] 83 | [string]$Password, 84 | 85 | [Parameter(Mandatory=$false)] 86 | [string]$ConfigDir = "config", 87 | 88 | [Parameter(Mandatory=$false)] 89 | [ValidateSet("Hierarchical", "Plain")] 90 | [string]$Format = "Hierarchical", 91 | 92 | [Parameter(Mandatory=$false)] 93 | [string]$V8Path = "1cv8.exe", 94 | 95 | [Parameter(Mandatory=$false)] 96 | [string]$OutFile, 97 | 98 | [Parameter(Mandatory=$false)] 99 | [switch]$DebugMode, 100 | 101 | [Parameter(Mandatory=$false)] 102 | [switch]$UpdateDB, 103 | 104 | [Parameter(Mandatory=$false)] 105 | [switch]$RunEnterprise, 106 | 107 | [Parameter(Mandatory=$false)] 108 | [string]$NavigationLink, 109 | 110 | [Parameter(Mandatory=$false)] 111 | [string]$ExternalDataProcessor 112 | ) 113 | 114 | # Устанавливаем кодировку для текущей сессии PowerShell 115 | $OutputEncoding = [System.Text.Encoding]::UTF8 116 | 117 | # Функция для загрузки переменных окружения из .env файла 118 | function Import-EnvFile { 119 | param([string]$EnvFilePath = ".env") 120 | 121 | if (Test-Path $EnvFilePath) { 122 | Get-Content $EnvFilePath -Encoding UTF8 | ForEach-Object { 123 | $line = $_.Trim() 124 | # Пропускаем пустые строки и комментарии 125 | if ($line -and -not $line.StartsWith('#')) { 126 | if ($line -match '^([^=]+)=(.*)$') { 127 | $name = $matches[1].Trim() 128 | $value = $matches[2].Trim() 129 | # Удаляем кавычки если есть 130 | $value = $value -replace '^["'']|["'']$', '' 131 | [Environment]::SetEnvironmentVariable($name, $value, 'Process') 132 | } 133 | } 134 | } 135 | return $true 136 | } 137 | return $false 138 | } 139 | 140 | # Загружаем переменные окружения из .env файла (если существует) 141 | $envLoaded = Import-EnvFile 142 | if ($envLoaded) { 143 | Write-Verbose "Environment variables loaded from .env file" 144 | } 145 | 146 | # Установка кодировки консоли 147 | [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 148 | 149 | # Приоритет: Параметр командной строки → .env файл → Значение по умолчанию 150 | if (-not $PSBoundParameters.ContainsKey('V8Path')) { 151 | $envV8Path = [Environment]::GetEnvironmentVariable('V8_PATH', 'Process') 152 | if ($envV8Path) { $V8Path = $envV8Path } 153 | } 154 | 155 | if (-not $PSBoundParameters.ContainsKey('ConfigDir')) { 156 | $envConfigDir = [Environment]::GetEnvironmentVariable('CONFIG_DIR', 'Process') 157 | if ($envConfigDir) { $ConfigDir = $envConfigDir } 158 | } 159 | 160 | if (-not $PSBoundParameters.ContainsKey('Format')) { 161 | $envFormat = [Environment]::GetEnvironmentVariable('CONFIG_FORMAT', 'Process') 162 | if ($envFormat -and ($envFormat -eq 'Hierarchical' -or $envFormat -eq 'Plain')) { 163 | $Format = $envFormat 164 | } 165 | } 166 | 167 | if (-not $PSBoundParameters.ContainsKey('InfoBasePath')) { 168 | $envInfoBasePath = [Environment]::GetEnvironmentVariable('INFOBASE_PATH', 'Process') 169 | if ($envInfoBasePath) { $InfoBasePath = $envInfoBasePath } 170 | } 171 | 172 | if (-not $PSBoundParameters.ContainsKey('InfoBaseName')) { 173 | $envInfoBaseName = [Environment]::GetEnvironmentVariable('INFOBASE_NAME', 'Process') 174 | if ($envInfoBaseName) { $InfoBaseName = $envInfoBaseName } 175 | } 176 | 177 | if (-not $PSBoundParameters.ContainsKey('UserName')) { 178 | $envUserName = [Environment]::GetEnvironmentVariable('USERNAME_1C', 'Process') 179 | if ($envUserName) { $UserName = $envUserName } 180 | } 181 | 182 | if (-not $PSBoundParameters.ContainsKey('Password')) { 183 | $envPassword = [Environment]::GetEnvironmentVariable('PASSWORD_1C', 'Process') 184 | if ($envPassword) { $Password = $envPassword } 185 | } 186 | 187 | if (-not $PSBoundParameters.ContainsKey('OutFile')) { 188 | $envOutFile = [Environment]::GetEnvironmentVariable('OUT_FILE', 'Process') 189 | if ($envOutFile) { $OutFile = $envOutFile } 190 | } 191 | 192 | if (-not $PSBoundParameters.ContainsKey('DebugMode')) { 193 | $envDebugMode = [Environment]::GetEnvironmentVariable('DEBUG_MODE', 'Process') 194 | if ($envDebugMode -eq 'true') { $DebugMode = $true } 195 | } 196 | 197 | if (-not $PSBoundParameters.ContainsKey('UpdateDB')) { 198 | $envUpdateDB = [Environment]::GetEnvironmentVariable('UPDATE_DB', 'Process') 199 | if ($envUpdateDB -eq 'true') { $UpdateDB = $true } 200 | } 201 | 202 | if (-not $PSBoundParameters.ContainsKey('RunEnterprise')) { 203 | $envRunEnterprise = [Environment]::GetEnvironmentVariable('RUN_ENTERPRISE', 'Process') 204 | if ($envRunEnterprise -eq 'true') { $RunEnterprise = $true } 205 | } 206 | 207 | if (-not $PSBoundParameters.ContainsKey('NavigationLink')) { 208 | $envNavigationLink = [Environment]::GetEnvironmentVariable('NAVIGATION_LINK', 'Process') 209 | if ($envNavigationLink) { $NavigationLink = $envNavigationLink } 210 | } 211 | 212 | if (-not $PSBoundParameters.ContainsKey('ExternalDataProcessor')) { 213 | $envExternalDataProcessor = [Environment]::GetEnvironmentVariable('EXTERNAL_DATA_PROCESSOR', 'Process') 214 | if ($envExternalDataProcessor) { $ExternalDataProcessor = $envExternalDataProcessor } 215 | } 216 | 217 | # Функция для вывода отладочной информации 218 | function Write-DebugInfo { 219 | param([string]$Message) 220 | if ($DebugMode) { 221 | Write-Host "[DEBUG] $Message" -ForegroundColor Cyan 222 | } 223 | } 224 | 225 | function Write-ErrorInfo { 226 | param([string]$Message) 227 | Write-Host "Error: $Message" -ForegroundColor Red 228 | } 229 | 230 | function Get-ObjectXmlFromBsl { 231 | param([string]$BslPath, [string]$ConfigDir) 232 | 233 | $relativePath = $BslPath -replace "^$ConfigDir[\\/]", "" 234 | $parts = $relativePath -split '[\\/]' 235 | 236 | if ($parts.Count -ge 2) { 237 | $objectType = $parts[0] 238 | $objectName = $parts[1] 239 | $xmlPath = "$objectType/$objectName.xml" 240 | return $xmlPath 241 | } 242 | 243 | return $null 244 | } 245 | 246 | if (-not $InfoBasePath -and -not $InfoBaseName) { 247 | Write-ErrorInfo "InfoBasePath or InfoBaseName required" 248 | exit 1 249 | } 250 | 251 | if (-not (Test-Path $ConfigDir)) { 252 | Write-ErrorInfo "Config directory not found: $ConfigDir" 253 | exit 1 254 | } 255 | 256 | try { 257 | $null = git --version 258 | Write-DebugInfo "Git found" 259 | } catch { 260 | Write-ErrorInfo "git not found in PATH" 261 | exit 1 262 | } 263 | 264 | # Создание временного каталога 265 | $tempDir = Join-Path $env:TEMP "1c_partial_load_$(Get-Random)" 266 | New-Item -ItemType Directory -Path $tempDir -Force | Out-Null 267 | Write-DebugInfo "Temp directory: $tempDir" 268 | 269 | $listFile = Join-Path $tempDir "load_list.txt" 270 | 271 | try { 272 | $changedFiles = @() 273 | 274 | if ([string]::IsNullOrWhiteSpace($CommitId)) { 275 | Write-Host "Checking for uncommitted changes..." -ForegroundColor Green 276 | 277 | # Получаем staged изменения 278 | Write-DebugInfo "Getting staged changes..." 279 | $stagedFiles = git diff --cached --name-only 2>&1 280 | if ($LASTEXITCODE -ne 0) { 281 | Write-ErrorInfo "Error getting staged changes" 282 | Write-Host $stagedFiles 283 | exit 1 284 | } 285 | 286 | # Получаем unstaged изменения (измененные файлы) 287 | Write-DebugInfo "Getting unstaged changes..." 288 | $unstagedFiles = git diff --name-only 2>&1 289 | if ($LASTEXITCODE -ne 0) { 290 | Write-ErrorInfo "Error getting unstaged changes" 291 | Write-Host $unstagedFiles 292 | exit 1 293 | } 294 | 295 | # Получаем untracked файлы (новые файлы, не добавленные в git) 296 | Write-DebugInfo "Getting untracked files..." 297 | $untrackedFiles = git ls-files --others --exclude-standard 2>&1 298 | if ($LASTEXITCODE -ne 0) { 299 | Write-ErrorInfo "Error getting untracked files" 300 | Write-Host $untrackedFiles 301 | exit 1 302 | } 303 | 304 | # Объединяем все незафиксированные изменения 305 | $changedFiles += $stagedFiles 306 | $changedFiles += $unstagedFiles 307 | $changedFiles += $untrackedFiles 308 | $changedFiles = $changedFiles | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | Select-Object -Unique 309 | 310 | Write-DebugInfo "Staged changes: $(($stagedFiles | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }).Count) files" 311 | Write-DebugInfo "Unstaged changes: $(($unstagedFiles | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }).Count) files" 312 | Write-DebugInfo "Untracked files: $(($untrackedFiles | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }).Count) files" 313 | Write-DebugInfo "Total unique uncommitted files: $($changedFiles.Count)" 314 | 315 | if ($changedFiles.Count -eq 0) { 316 | Write-Host "No uncommitted changes found" -ForegroundColor Yellow 317 | exit 0 318 | } 319 | } else { 320 | Write-Host "Getting changed files from commit $CommitId to current state..." -ForegroundColor Green 321 | 322 | # Получаем изменения от указанного коммита до HEAD 323 | Write-DebugInfo "Getting changes from $CommitId to HEAD..." 324 | $commitToHead = git diff --name-only "$CommitId..HEAD" 2>&1 325 | if ($LASTEXITCODE -ne 0) { 326 | Write-ErrorInfo "Error getting changes from commit to HEAD" 327 | Write-Host $commitToHead 328 | exit 1 329 | } 330 | 331 | # Получаем staged изменения 332 | Write-DebugInfo "Getting staged changes..." 333 | $stagedFiles = git diff --cached --name-only 2>&1 334 | if ($LASTEXITCODE -ne 0) { 335 | Write-ErrorInfo "Error getting staged changes" 336 | Write-Host $stagedFiles 337 | exit 1 338 | } 339 | 340 | # Получаем unstaged изменения (измененные файлы) 341 | Write-DebugInfo "Getting unstaged changes..." 342 | $unstagedFiles = git diff --name-only 2>&1 343 | if ($LASTEXITCODE -ne 0) { 344 | Write-ErrorInfo "Error getting unstaged changes" 345 | Write-Host $unstagedFiles 346 | exit 1 347 | } 348 | 349 | # Получаем untracked файлы (новые файлы, не добавленные в git) 350 | Write-DebugInfo "Getting untracked files..." 351 | $untrackedFiles = git ls-files --others --exclude-standard 2>&1 352 | if ($LASTEXITCODE -ne 0) { 353 | Write-ErrorInfo "Error getting untracked files" 354 | Write-Host $untrackedFiles 355 | exit 1 356 | } 357 | 358 | # Объединяем все изменения и убираем дубликаты 359 | $changedFiles += $commitToHead 360 | $changedFiles += $stagedFiles 361 | $changedFiles += $unstagedFiles 362 | $changedFiles += $untrackedFiles 363 | $changedFiles = $changedFiles | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | Select-Object -Unique 364 | 365 | Write-DebugInfo "Changes from $CommitId to HEAD: $(($commitToHead | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }).Count) files" 366 | Write-DebugInfo "Staged changes: $(($stagedFiles | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }).Count) files" 367 | Write-DebugInfo "Unstaged changes: $(($unstagedFiles | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }).Count) files" 368 | Write-DebugInfo "Untracked files: $(($untrackedFiles | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }).Count) files" 369 | Write-DebugInfo "Total unique files: $($changedFiles.Count)" 370 | } 371 | Write-Host "Preparing file list for loading..." -ForegroundColor Green 372 | 373 | $configFiles = @() 374 | $configDirNormalized = $ConfigDir.TrimEnd('\', '/') 375 | 376 | foreach ($file in $changedFiles) { 377 | $file = $file.Trim() 378 | if ([string]::IsNullOrWhiteSpace($file)) { continue } 379 | 380 | if ($file -like "$configDirNormalized/*" -or $file -like "$configDirNormalized\*") { 381 | $relativePath = $file -replace "^$configDirNormalized[\\/]", "" 382 | 383 | # Пропускаем служебные файлы 384 | if ($relativePath -eq "ConfigDumpInfo.xml") { 385 | Write-DebugInfo "Skipped service file: $relativePath" 386 | continue 387 | } 388 | 389 | if ($file -match '\.xml$') { 390 | $fullPath = Join-Path $ConfigDir $relativePath 391 | if (Test-Path $fullPath) { 392 | if ($configFiles -notcontains $relativePath) { 393 | $configFiles += $relativePath 394 | Write-DebugInfo "Added XML: $relativePath" 395 | } 396 | } 397 | } 398 | elseif ($file -match '\.bsl$') { 399 | Write-DebugInfo "Found BSL file: $relativePath" 400 | 401 | $objectXml = Get-ObjectXmlFromBsl -BslPath $file -ConfigDir $configDirNormalized 402 | if ($objectXml) { 403 | $fullXmlPath = Join-Path $ConfigDir $objectXml 404 | if (Test-Path $fullXmlPath) { 405 | if ($configFiles -notcontains $objectXml) { 406 | $configFiles += $objectXml 407 | Write-DebugInfo "Added object XML for BSL: $objectXml" 408 | } 409 | 410 | if ($configFiles -notcontains $relativePath) { 411 | $configFiles += $relativePath 412 | Write-DebugInfo "Added BSL: $relativePath" 413 | } 414 | 415 | $objectDir = Split-Path $fullXmlPath -Parent 416 | if (Test-Path $objectDir) { 417 | $extDir = Join-Path $objectDir "Ext" 418 | if (Test-Path $extDir) { 419 | Get-ChildItem -Path $extDir -Recurse -File | ForEach-Object { 420 | $extRelPath = $_.FullName.Replace($ConfigDir + '\', '').Replace('\', '/') 421 | if ($configFiles -notcontains $extRelPath) { 422 | $configFiles += $extRelPath 423 | Write-DebugInfo "Added additional file: $extRelPath" 424 | } 425 | } 426 | } 427 | } 428 | } 429 | } 430 | } 431 | } 432 | } 433 | 434 | if ($configFiles.Count -eq 0) { 435 | if ([string]::IsNullOrWhiteSpace($CommitId)) { 436 | Write-Host "No configuration files found in uncommitted changes" -ForegroundColor Yellow 437 | } else { 438 | Write-Host "No configuration files found for loading in commit $CommitId" -ForegroundColor Yellow 439 | } 440 | exit 0 441 | } 442 | 443 | Write-Host "Files found for loading: $($configFiles.Count)" -ForegroundColor Green 444 | 445 | $configFiles | Out-File -FilePath $listFile -Encoding UTF8 446 | 447 | if ($DebugMode) { 448 | Write-DebugInfo "List file content:" 449 | Get-Content $listFile | ForEach-Object { Write-Host " $_" -ForegroundColor DarkGray } 450 | } 451 | 452 | # Проверка существования 1cv8.exe 453 | $v8Exists = $false 454 | if ([System.IO.Path]::IsPathRooted($V8Path)) { 455 | # Абсолютный путь - проверяем напрямую 456 | $v8Exists = Test-Path $V8Path 457 | } else { 458 | # Относительный путь или имя файла - проверяем в PATH 459 | try { 460 | $null = Get-Command $V8Path -ErrorAction Stop 461 | $v8Exists = $true 462 | } catch { 463 | $v8Exists = $false 464 | } 465 | } 466 | 467 | if (-not $v8Exists) { 468 | Write-Host "" 469 | Write-ErrorInfo "1C:Enterprise platform (1cv8.exe) not found" 470 | Write-Host "" 471 | Write-Host "Checked path: $V8Path" -ForegroundColor Yellow 472 | Write-Host "" 473 | Write-Host "Please check:" -ForegroundColor Cyan 474 | Write-Host " 1. 1C:Enterprise is installed" -ForegroundColor Gray 475 | Write-Host " 2. Correct path specified in V8_PATH parameter or .env file" -ForegroundColor Gray 476 | Write-Host " 3. 1cv8.exe is in system PATH (if using relative path)" -ForegroundColor Gray 477 | Write-Host "" 478 | Write-Host "Examples:" -ForegroundColor Cyan 479 | Write-Host " V8_PATH=`"C:\Program Files\1cv8\8.3.24.1467\bin\1cv8.exe`"" -ForegroundColor Gray 480 | Write-Host " -V8Path `"C:\Program Files\1cv8\8.3.24.1467\bin\1cv8.exe`"" -ForegroundColor Gray 481 | Write-Host "" 482 | exit 1 483 | } 484 | 485 | Write-DebugInfo "Using 1C platform: $V8Path" 486 | 487 | # Формирование командной строки для 1cv8 488 | $arguments = @("DESIGNER") 489 | 490 | # Параметры подключения к ИБ 491 | if ($InfoBaseName) { 492 | $arguments += "/IBName", "`"$InfoBaseName`"" 493 | } else { 494 | $arguments += "/F", "`"$InfoBasePath`"" 495 | } 496 | 497 | # Учетные данные 498 | if ($UserName) { $arguments += "/N", "`"$UserName`"" } 499 | if ($Password) { $arguments += "/P", "`"$Password`"" } 500 | 501 | # Параметры загрузки 502 | $arguments += "/LoadConfigFromFiles", "`"$ConfigDir`"" 503 | $arguments += "-listFile", "`"$listFile`"" 504 | $arguments += "-Format", $Format 505 | $arguments += "-partial" 506 | $arguments += "-updateConfigDumpInfo" 507 | 508 | # Вывод служебных сообщений 509 | if (-not $OutFile) { 510 | $OutFile = Join-Path $tempDir "load_log.txt" 511 | } 512 | $arguments += "/Out", "`"$OutFile`"" 513 | 514 | # Отключение диалогов 515 | $arguments += "/DisableStartupDialogs" 516 | 517 | # Выполнение команды 518 | Write-Host "" 519 | Write-Host "Executing configuration load..." -ForegroundColor Green 520 | 521 | if ($DebugMode) { 522 | $cmdLine = "$V8Path $($arguments -join ' ')" 523 | Write-DebugInfo "Команда: $cmdLine" 524 | } 525 | 526 | $process = Start-Process -FilePath $V8Path ` 527 | -ArgumentList $arguments ` 528 | -NoNewWindow ` 529 | -Wait ` 530 | -PassThru 531 | 532 | $exitCode = $process.ExitCode 533 | 534 | Write-Host "" 535 | if ($exitCode -eq 0) { 536 | Write-Host "Load completed successfully" -ForegroundColor Green 537 | } else { 538 | Write-Host "Error loading configuration (code: $exitCode)" -ForegroundColor Red 539 | } 540 | 541 | if (Test-Path $OutFile) { 542 | Write-Host "" 543 | Write-Host "--- Execution log ---" -ForegroundColor Yellow 544 | Get-Content $OutFile | Write-Host 545 | Write-Host "--- End of log ---" -ForegroundColor Yellow 546 | } 547 | 548 | # Обновление конфигурации БД если запрошено 549 | if ($UpdateDB -and $exitCode -eq 0) { 550 | Write-Host "" 551 | Write-Host "Updating database configuration..." -ForegroundColor Green 552 | 553 | $updateArguments = @("DESIGNER") 554 | 555 | # Параметры подключения к ИБ 556 | if ($InfoBaseName) { 557 | $updateArguments += "/IBName", "`"$InfoBaseName`"" 558 | } else { 559 | $updateArguments += "/F", "`"$InfoBasePath`"" 560 | } 561 | 562 | # Учетные данные 563 | if ($UserName) { $updateArguments += "/N", "`"$UserName`"" } 564 | if ($Password) { $updateArguments += "/P", "`"$Password`"" } 565 | 566 | # Команда обновления 567 | $updateArguments += "/UpdateDBCfg" 568 | $updateArguments += "/DisableStartupDialogs" 569 | 570 | # Файл вывода 571 | $updateOutFile = Join-Path $tempDir "update_log.txt" 572 | $updateArguments += "/Out", "`"$updateOutFile`"" 573 | 574 | if ($DebugMode) { 575 | $updateCmdLine = "$V8Path $($updateArguments -join ' ')" 576 | Write-DebugInfo "Update command: $updateCmdLine" 577 | } 578 | 579 | $updateProcess = Start-Process -FilePath $V8Path ` 580 | -ArgumentList $updateArguments ` 581 | -NoNewWindow ` 582 | -Wait ` 583 | -PassThru 584 | 585 | $updateExitCode = $updateProcess.ExitCode 586 | 587 | Write-Host "" 588 | if ($updateExitCode -eq 0) { 589 | Write-Host "Database configuration updated successfully" -ForegroundColor Green 590 | } else { 591 | Write-Host "Error updating database configuration (code: $updateExitCode)" -ForegroundColor Red 592 | $exitCode = $updateExitCode 593 | } 594 | 595 | if (Test-Path $updateOutFile) { 596 | Write-Host "" 597 | Write-Host "--- Update log ---" -ForegroundColor Yellow 598 | Get-Content $updateOutFile | Write-Host 599 | Write-Host "--- End of update log ---" -ForegroundColor Yellow 600 | } 601 | } 602 | 603 | # Запуск в режиме 1С:Предприятие если запрошено 604 | if ($RunEnterprise -and $exitCode -eq 0) { 605 | Write-Host "" 606 | Write-Host "Starting 1C:Enterprise..." -ForegroundColor Green 607 | 608 | $enterpriseArguments = @("ENTERPRISE") 609 | 610 | # Параметры подключения к ИБ 611 | if ($InfoBaseName) { 612 | $enterpriseArguments += "/IBName", "`"$InfoBaseName`"" 613 | } else { 614 | $enterpriseArguments += "/F", "`"$InfoBasePath`"" 615 | } 616 | 617 | # Учетные данные 618 | if ($UserName) { $enterpriseArguments += "/N", "`"$UserName`"" } 619 | if ($Password) { $enterpriseArguments += "/P", "`"$Password`"" } 620 | 621 | # Навигационная ссылка 622 | if ($NavigationLink) { 623 | $enterpriseArguments += "/URL", "`"$NavigationLink`"" 624 | } 625 | 626 | # Внешняя обработка 627 | if ($ExternalDataProcessor) { 628 | if (Test-Path $ExternalDataProcessor) { 629 | $enterpriseArguments += "/Execute", "`"$ExternalDataProcessor`"" 630 | } else { 631 | Write-Host "Warning: External data processor not found: $ExternalDataProcessor" -ForegroundColor Yellow 632 | } 633 | } 634 | 635 | if ($DebugMode) { 636 | $enterpriseCmdLine = "$V8Path $($enterpriseArguments -join ' ')" 637 | Write-DebugInfo "Enterprise command: $enterpriseCmdLine" 638 | } 639 | 640 | # Запуск в обычном режиме (неблокирующий) 641 | Start-Process -FilePath $V8Path -ArgumentList $enterpriseArguments 642 | 643 | Write-Host "1C:Enterprise started" -ForegroundColor Green 644 | } 645 | 646 | exit $exitCode 647 | 648 | } finally { 649 | if (-not $DebugMode) { 650 | if (Test-Path $tempDir) { 651 | Remove-Item -Path $tempDir -Recurse -Force 652 | Write-DebugInfo "Temporary files deleted" 653 | } 654 | } else { 655 | Write-DebugInfo "Temporary files saved in: $tempDir" 656 | } 657 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Скрипты работы с конфигурацией 1С 2 | 3 | ## Описание 4 | 5 | Набор скриптов для автоматической работы с конфигурацией 1С:Предприятие: 6 | - **Частичная загрузка** - загрузка измененных файлов из git в информационную базу 7 | - **Выгрузка конфигурации** - выгрузка конфигурации из информационной базы в файлы (полная, инкрементальная, частичная) 8 | 9 | ### Возможности загрузки 10 | 11 | - ✅ Получение всех измененных файлов от указанного коммита до текущего состояния (включая незафиксированные) 12 | - ✅ Автоматическая фильтрация файлов конфигурации (XML) 13 | - ✅ **Поддержка BSL файлов** - автоматическое добавление XML объектов при изменении модулей 14 | - ✅ Создание файла списка для частичной загрузки 15 | - ✅ Выполнение команды `/LoadConfigFromFiles` с параметром `-partial` 16 | - ✅ **Автоматическое обновление конфигурации БД** - опциональное обновление после загрузки 17 | - ✅ **Запуск в режиме 1С:Предприятие** - автоматический запуск после загрузки 18 | - ✅ **Поддержка навигационных ссылок** - открытие конкретного объекта после старта 19 | - ✅ **Запуск внешних обработок** - возможность запуска обработки после старта 20 | - ✅ Поддержка обоих форматов выгрузки (Hierarchical/Plain) 21 | - ✅ Подробное логирование процесса 22 | - ✅ Режим отладки 23 | 24 | ### Возможности выгрузки 25 | 26 | - ✅ **Полная выгрузка** - выгрузка всей конфигурации в файлы 27 | - ✅ **Инкрементальная выгрузка** - выгрузка только измененных объектов 28 | - ✅ **Частичная выгрузка** - выгрузка конкретных объектов из списка 29 | - ✅ Поддержка обоих форматов (Hierarchical/Plain) 30 | - ✅ Сохранение списка изменений 31 | - ✅ Сравнение с другой выгрузкой 32 | - ✅ Поддержка расширений конфигурации 33 | - ✅ Режим отладки 34 | 35 | ## Структура проекта 36 | 37 | ``` 38 | partial-load-config/ 39 | ├── loadcfg.cmd # Команда быстрой загрузки конфигурации 40 | ├── dumpcfg.cmd # Команда быстрой выгрузки конфигурации 41 | ├── scripts/ # PowerShell скрипты 42 | │ ├── partial-load-config.ps1 43 | │ ├── dump-config.ps1 44 | │ ├── dump-full-config.ps1 45 | │ ├── dump-changes-config.ps1 46 | │ ├── dump-partial-config.ps1 47 | │ ├── update-dump-info.ps1 48 | │ └── process-config-files.ps1 49 | ├── .env # Настройки проекта (не в git) 50 | ├── .env.example # Пример настроек 51 | └── README.md 52 | ``` 53 | 54 | ## Быстрый старт 55 | 56 | ### Простые команды (рекомендуется) 57 | 58 | После настройки [`.env` файла](#конфигурация-через-env-файл) используйте короткие команды: 59 | 60 | ```cmd 61 | REM Загрузка конфигурации 62 | loadcfg :: загрузка незафиксированных изменений 63 | loadcfg HEAD :: загрузка всех изменений с последнего коммита 64 | loadcfg HEAD~3 :: загрузка изменений за последние 3 коммита 65 | loadcfg -UpdateDB :: загрузка с обновлением БД 66 | loadcfg HEAD -DebugMode :: загрузка с отладкой 67 | 68 | REM Выгрузка конфигурации 69 | dumpcfg :: выгрузка по умолчанию (Changes из .env) 70 | dumpcfg Full :: полная выгрузка 71 | dumpcfg Changes :: инкрементальная выгрузка 72 | dumpcfg Partial :: частичная выгрузка (список из .env) 73 | dumpcfg -mode Partial -objects "Справочник.Номенклатура,Документ.Заказ" 74 | dumpcfg -DebugMode :: выгрузка с отладкой 75 | ``` 76 | 77 | ### PowerShell скрипты (для продвинутых сценариев) 78 | 79 | Для полного контроля используйте скрипты напрямую: 80 | 81 | ```powershell 82 | # Загрузка 83 | .\scripts\partial-load-config.ps1 -CommitId "HEAD" -UpdateDB -RunEnterprise 84 | 85 | # Выгрузка 86 | .\scripts\dump-config.ps1 -Mode Full -ConfigDir "src" -InfoBasePath "C:\Bases\MyBase" 87 | ``` 88 | 89 | ## Требования 90 | 91 | - Git установлен и доступен в PATH 92 | - Платформа 1С:Предприятие 8.3 93 | - Git репозиторий с историей изменений конфигурации 94 | 95 | ## Конфигурация через .env файл 96 | 97 | Для удобства работы с параметрами можно создать файл `.env` в корне проекта. Скопируйте `.env.example` и настройте под свою среду: 98 | 99 | ```bash 100 | cp .env.example .env 101 | ``` 102 | 103 | ### Приоритет параметров 104 | 105 | Параметры применяются в следующем порядке приоритета: 106 | 1. **Параметры командной строки** (самый высокий приоритет) 107 | 2. **Переменные из .env файла** 108 | 3. **Значения по умолчанию** (самый низкий приоритет) 109 | 110 | Это позволяет настроить базовые параметры в `.env`, но при необходимости переопределить их через командную строку. 111 | 112 | ### Пример .env файла 113 | 114 | ```ini 115 | # ============================================================================= 116 | # ОСНОВНЫЕ ПАРАМЕТРЫ 117 | # ============================================================================= 118 | 119 | # Путь к платформе 1С:Предприятие (1cv8.exe) 120 | # Если не указан, будет искаться в PATH 121 | V8_PATH=C:\\Program Files\\1cv8\\8.3.24.1467\\bin\\1cv8.exe 122 | 123 | # Каталог с выгруженной конфигурацией (относительно корня проекта) 124 | CONFIG_DIR=src 125 | 126 | # Формат выгрузки конфигурации 127 | # Возможные значения: Hierarchical, Plain 128 | CONFIG_FORMAT=Hierarchical 129 | 130 | # ============================================================================= 131 | # ПАРАМЕТРЫ ПОДКЛЮЧЕНИЯ К ИНФОРМАЦИОННОЙ БАЗЕ 132 | # ============================================================================= 133 | 134 | # Путь к файловой информационной базе 135 | # Используйте либо INFOBASE_PATH, либо INFOBASE_NAME 136 | INFOBASE_PATH=C:\\edt\\IB\\MyBase 137 | 138 | # Имя информационной базы из списка (альтернатива INFOBASE_PATH) 139 | # INFOBASE_NAME=MyBase 140 | 141 | # ============================================================================= 142 | # УЧЕТНЫЕ ДАННЫЕ 1С 143 | # ============================================================================= 144 | 145 | # Имя пользователя 1С 146 | # Рекомендуется использовать учетную запись для разработки 147 | USERNAME_1C=Администратор 148 | 149 | # Пароль пользователя 1С 150 | # ВНИМАНИЕ: Не рекомендуется хранить пароль в файле! 151 | # Лучше передавать через параметр командной строки 152 | # PASSWORD_1C= 153 | 154 | # ============================================================================= 155 | # ДОПОЛНИТЕЛЬНЫЕ ПАРАМЕТРЫ 156 | # ============================================================================= 157 | 158 | # Файл для вывода служебных сообщений (если не указан, создается временный) 159 | # OUT_FILE=C:\\Logs\\1c_load.txt 160 | 161 | # Режим отладки (true/false) 162 | # При включении выводится дополнительная информация и сохраняются временные файлы 163 | DEBUG_MODE=false 164 | 165 | # Автоматическое обновление конфигурации БД после загрузки (true/false) 166 | UPDATE_DB=false 167 | 168 | # Запуск 1С:Предприятие после загрузки (true/false) 169 | RUN_ENTERPRISE=false 170 | 171 | # Навигационная ссылка для открытия объекта (требует RUN_ENTERPRISE=true) 172 | # Примеры: 173 | # - e1cib/list/Справочник.Номенклатура 174 | # - e1cib/list/Документ.ЗаказПоставщику 175 | # NAVIGATION_LINK= 176 | 177 | # Путь к внешней обработке для запуска (требует RUN_ENTERPRISE=true) 178 | # EXTERNAL_DATA_PROCESSOR=C:\\Tools\\MyProcessor.epf 179 | 180 | # ============================================================================= 181 | # ПАРАМЕТРЫ ВЫГРУЗКИ КОНФИГУРАЦИИ 182 | # ============================================================================= 183 | 184 | # Режим выгрузки по умолчанию: Full, Changes, Partial 185 | # Full - полная выгрузка всей конфигурации 186 | # Changes - только измененные объекты (требует предыдущую выгрузку) 187 | # Partial - конкретные объекты из списка 188 | DUMP_MODE=Changes 189 | 190 | # Файл со списком объектов для частичной выгрузки (режим Partial) 191 | # Формат: по одному объекту на строку 192 | # Примеры: 193 | # Справочник.Справочник1 194 | # Документ.Документ1 195 | # Configuration.Help 196 | DUMP_OBJECTS_LIST=dump_objects.txt 197 | 198 | # Файл для сохранения списка изменений (режим Changes) 199 | # В этот файл будет записан список измененных объектов 200 | DUMP_CHANGES_FILE=config_changes.txt 201 | 202 | # Файл ConfigDumpInfo.xml для сравнения (опционально, режим Changes) 203 | # Позволяет сравнить текущую конфигурацию с другой выгрузкой 204 | # DUMP_COMPARE_WITH=old_dump/ConfigDumpInfo.xml 205 | ``` 206 | 207 | ### Безопасность 208 | 209 | ⚠️ **Не храните пароли в .env файле!** Файл `.env` добавлен в `.gitignore`, но для дополнительной безопасности рекомендуется передавать пароль через параметр командной строки: 210 | 211 | ```cmd 212 | REM Короткая команда 213 | loadcfg HEAD -Password "your_password" 214 | ``` 215 | 216 | ```powershell 217 | # PowerShell скрипт напрямую 218 | .\scripts\partial-load-config.ps1 -CommitId "HEAD" -Password "your_password" 219 | ``` 220 | 221 | ### Использование с .env 222 | 223 | После настройки `.env` можно запускать команды без указания базовых параметров: 224 | 225 | ```cmd 226 | REM Короткие команды (рекомендуется) 227 | loadcfg HEAD 228 | dumpcfg Changes 229 | ``` 230 | 231 | ```powershell 232 | # PowerShell скрипты напрямую 233 | .\scripts\partial-load-config.ps1 -CommitId "HEAD" 234 | .\scripts\dump-changes-config.ps1 235 | ``` 236 | 237 | ## Использование 238 | 239 | ### Короткие команды (рекомендуется) 240 | 241 | После настройки `.env` используйте простые команды: 242 | 243 | **Загрузка конфигурации:** 244 | ```cmd 245 | REM Базовые примеры 246 | loadcfg :: незафиксированные изменения 247 | loadcfg HEAD :: изменения с последнего коммита 248 | loadcfg HEAD~3 :: изменения за последние 3 коммита 249 | 250 | REM С дополнительными параметрами 251 | loadcfg -UpdateDB :: с обновлением БД 252 | loadcfg HEAD -UpdateDB -RunEnterprise :: загрузка, обновление и запуск 253 | loadcfg -DebugMode :: с отладкой 254 | ``` 255 | 256 | **Выгрузка конфигурации:** 257 | ```cmd 258 | REM Базовые примеры 259 | dumpcfg :: режим из .env (обычно Changes) 260 | dumpcfg Full :: полная выгрузка 261 | dumpcfg Changes :: инкрементальная выгрузка 262 | dumpcfg Partial :: частичная выгрузка (список из .env) 263 | 264 | REM С параметрами 265 | dumpcfg -mode Full :: явное указание режима 266 | dumpcfg -mode Partial -objects "Справочник.Номенклатура,Документ.Заказ" 267 | dumpcfg -DebugMode :: с отладкой 268 | ``` 269 | 270 | ### PowerShell скрипты (продвинутое использование) 271 | 272 | Для сложных сценариев используйте скрипты напрямую: 273 | 274 | **Загрузка:** 275 | ```powershell 276 | # Базовые примеры 277 | .\scripts\partial-load-config.ps1 278 | 279 | # С параметрами 280 | .\scripts\partial-load-config.ps1 -CommitId "HEAD" ` 281 | -InfoBasePath "C:\Bases\MyBase" ` 282 | -UpdateDB ` 283 | -RunEnterprise ` 284 | -NavigationLink "e1cib/data/Catalog.Items" 285 | ``` 286 | 287 | **Выгрузка:** 288 | ```powershell 289 | # Полная выгрузка 290 | .\scripts\dump-config.ps1 -Mode Full -ConfigDir "src" -InfoBasePath "C:\Bases\MyBase" 291 | 292 | # Или используйте специализированные обертки 293 | .\scripts\dump-full-config.ps1 -ConfigDir "src" -InfoBasePath "C:\Bases\MyBase" 294 | .\scripts\dump-changes-config.ps1 -ChangesFile "changes.txt" 295 | .\scripts\dump-partial-config.ps1 -ObjectNames "Справочник.Номенклатура" 296 | ``` 297 | 298 | ## Параметры 299 | 300 | ### Основные 301 | 302 | | Параметр | Обязательный | Описание | 303 | |----------|--------------|----------| 304 | | `CommitId` | Нет | Идентификатор коммита git - **точка отсчета** для получения изменений (хеш, ветка, HEAD~N и т.д.). **Если не указан, загружаются только незафиксированные изменения** (staged + unstaged + untracked) | 305 | 306 | ### Параметры подключения к ИБ (один из двух обязателен) 307 | 308 | | Параметр | Описание | 309 | |---|---| 310 | | `InfoBasePath` / `/ib` | **Путь к каталогу файловой базы данных.** Указывается каталог, содержащий файл `1Cv8.1CD`.
*Пример: `C:\Bases\MyFileBase`* | 311 | | `InfoBaseName` / `/ibname` | **Имя клиент-серверной базы из списка баз 1С.**
*Пример: `MyServerBase`* | 312 | 313 | ### Дополнительные параметры 314 | 315 | | Параметр | Значение по умолчанию | Описание | 316 | |----------|----------------------|----------| 317 | | `UserName` / `/n` | - | Имя пользователя 1С | 318 | | `Password` / `/p` | - | Пароль пользователя | 319 | | `ConfigDir` / `/configdir` | `config` | Каталог с выгруженной конфигурацией | 320 | | `Format` / `/format` | `Hierarchical` | Формат: Hierarchical или Plain | 321 | | `V8Path` / `/v8` | `1cv8.exe` | Путь к исполняемому файлу платформы (если не указан, ищется в PATH) | 322 | | `OutFile` / `/out` | temp файл | Файл для вывода служебных сообщений | 323 | | `DebugMode` / `/debug` | - | Включить режим отладки | 324 | | `UpdateDB` | - | Автоматически обновить конфигурацию БД после загрузки | 325 | | `RunEnterprise` | - | Запустить 1С:Предприятие после загрузки | 326 | | `NavigationLink` | - | Навигационная ссылка для открытия объекта (требует `-RunEnterprise`) | 327 | | `ExternalDataProcessor` | - | Путь к внешней обработке для запуска (требует `-RunEnterprise`) | 328 | 329 | ## Как это работает 330 | 331 | 1. **Получение списка файлов** 332 | 333 | Скрипт получает **все** измененные файлы от указанного коммита до текущего состояния: 334 | 335 | ```bash 336 | # Изменения от коммита до HEAD 337 | git diff --name-only ..HEAD 338 | 339 | # Staged изменения (git add) 340 | git diff --cached --name-only 341 | 342 | # Unstaged изменения (измененные файлы) 343 | git diff --name-only 344 | 345 | # Untracked файлы (новые файлы, не добавленные в git) 346 | git ls-files --others --exclude-standard 347 | ``` 348 | 349 | Все списки объединяются, дубликаты удаляются. 350 | 351 | 2. **Фильтрация файлов** 352 | - Проверяется, что файл находится в каталоге конфигурации 353 | - Для XML файлов - добавляются напрямую 354 | - **Для BSL файлов** - автоматически добавляется соответствующий XML объекта и все связанные файлы (модули, формы и т.д.) 355 | - Проверяется существование файла 356 | 357 | 3. **Создание файла списка** 358 | - Файлы записываются построчно 359 | - Пути указываются относительно каталога конфигурации 360 | 361 | 4. **Выполнение загрузки** 362 | ```cmd 363 | 1cv8.exe DESIGNER /F "path\to\base" /LoadConfigFromFiles "config" 364 | -listFile "load_list.txt" -Format Hierarchical -partial 365 | -updateConfigDumpInfo /DisableStartupDialogs 366 | ``` 367 | 368 | ## Примеры использования 369 | 370 | ### Типичные сценарии разработки 371 | 372 | **Сценарий 1: Быстрая загрузка текущих изменений** 373 | ```cmd 374 | REM Самый частый случай - загрузить то, что меняли прямо сейчас 375 | loadcfg 376 | ``` 377 | 378 | **Сценарий 2: Загрузка с последнего коммита и запуск** 379 | ```cmd 380 | REM Загрузить изменения из последнего коммита, обновить БД и запустить 381 | loadcfg HEAD -UpdateDB -RunEnterprise 382 | ``` 383 | 384 | **Сценарий 3: Выгрузка изменений после работы в конфигураторе** 385 | ```cmd 386 | REM Выгрузить только то, что изменилось 387 | dumpcfg Changes 388 | 389 | REM Посмотреть что изменилось 390 | type config_changes.txt 391 | 392 | REM Зафиксировать в git 393 | git add . 394 | git commit -m "Добавлен новый отчет" 395 | ``` 396 | 397 | **Сценарий 4: Выгрузка конкретных объектов для анализа** 398 | ```cmd 399 | REM Быстрая выгрузка одного-двух объектов 400 | dumpcfg -mode Partial -objects "Справочник.Номенклатура,Отчет.ОстаткиТоваров" 401 | ``` 402 | 403 | **Сценарий 5: Полный цикл разработки** 404 | ```cmd 405 | REM 1. Выгружаем изменения из продуктивной базы 406 | dumpcfg Changes 407 | git add . && git commit -m "Обновление конфигурации" 408 | 409 | REM 2. В тестовой базе загружаем изменения 410 | loadcfg HEAD -UpdateDB -RunEnterprise 411 | ``` 412 | 413 | ### Продвинутые сценарии (PowerShell) 414 | 415 | **Загрузка изменений за период:** 416 | ```powershell 417 | # Загрузить все изменения за последние 5 коммитов 418 | .\scripts\partial-load-config.ps1 -CommitId "HEAD~5" -DebugMode 419 | ``` 420 | 421 | **Комплексный сценарий с запуском:** 422 | ```powershell 423 | # Загрузка, обновление БД и открытие конкретной формы 424 | .\scripts\partial-load-config.ps1 -CommitId "HEAD~3" ` 425 | -UpdateDB ` 426 | -RunEnterprise ` 427 | -NavigationLink "e1cib/data/Document.SalesOrder" 428 | ``` 429 | 430 | **Выгрузка с сохранением списка изменений:** 431 | ```powershell 432 | .\scripts\dump-changes-config.ps1 -ChangesFile "changes.txt" -DebugMode 433 | ``` 434 | 435 | 436 | ## Коды возврата 437 | 438 | | Код | Описание | 439 | |-----|----------| 440 | | 0 | Успешное выполнение | 441 | | 1 | Ошибка (неверные параметры, git ошибка, ошибка загрузки) | 442 | 443 | ## Отладка 444 | 445 | При возникновении проблем используйте параметр `-DebugMode`: 446 | 447 | ```cmd 448 | REM Короткая команда 449 | loadcfg HEAD -DebugMode 450 | dumpcfg -DebugMode 451 | ``` 452 | 453 | ```powershell 454 | # PowerShell скрипт напрямую 455 | .\scripts\partial-load-config.ps1 -CommitId "HEAD" -InfoBasePath "C:\Bases\Test" -DebugMode 456 | ``` 457 | 458 | Это выведет: 459 | - Параметры запуска 460 | - Список найденных файлов 461 | - Содержимое файла списка загрузки 462 | - Полную командную строку 1cv8.exe 463 | - Путь к временным файлам (не удаляются) 464 | 465 | ## Как работает поддержка BSL 466 | 467 | Когда скрипт обнаруживает изменение в BSL файле (например, `src/Catalogs/Справочник1/Ext/ObjectModule.bsl`), он автоматически: 468 | 469 | 1. Определяет тип объекта (`Catalogs`) и его имя (`Справочник1`) 470 | 2. Добавляет в список загрузки XML объекта (`Catalogs/Справочник1.xml`) 471 | 3. Добавляет сам BSL файл 472 | 4. Рекурсивно добавляет все файлы из подкаталога `Ext` (включая формы, предопределенные данные и т.д.) 473 | 474 | Это гарантирует корректную загрузку изменений в модулях объектов. 475 | 476 | ## Логика работы с коммитами 477 | 478 | ### Точка отсчета 479 | 480 | Указанный параметр `CommitId` является **точкой отсчета** для получения изменений: 481 | 482 | ``` 483 | CommitId ────────> HEAD ────────> Current State 484 | ▲ ▲ ▲ 485 | │ │ │ 486 | └─────────────────┴──────────────────┘ 487 | Все эти изменения загружаются 488 | ``` 489 | 490 | **Примеры:** 491 | 492 | - `HEAD~5` - загрузит все изменения за последние 5 коммитов + незафиксированные 493 | - `abc123` - загрузит все изменения от коммита abc123 до текущего состояния 494 | - `feature/branch` - загрузит все изменения от указанной ветки до текущего HEAD 495 | 496 | ### Что включается в загрузку 497 | 498 | 1. **Зафиксированные изменения**: все коммиты от указанного до HEAD 499 | 2. **Staged изменения**: файлы после `git add` 500 | 3. **Unstaged изменения**: измененные файлы в рабочем каталоге 501 | 502 | ### Важно 503 | 504 | ⚠️ Загрузка **всегда** происходит из текущего состояния файлов, не из коммита! 505 | ✅ Указанный коммит определяет **какие объекты** загружать, но не **откуда** их брать. 506 | 507 | ## Ограничения 508 | 509 | 1. Работает только с файлами формата XML/BSL (не с `.cf`, `.cfu`) 510 | 2. Требует предварительную выгрузку конфигурации в файлы 511 | 3. Не поддерживает расширения конфигурации 512 | 4. Загружает измененные файлы из текущего состояния (не переключается на указанный коммит) 513 | 514 | ## Расширение функциональности 515 | 516 | ### Загрузка изменений из диапазона коммитов 517 | 518 | Можно модифицировать скрипт для загрузки всех изменений между двумя коммитами: 519 | 520 | ```bash 521 | git diff --name-only .. 522 | ``` 523 | 524 | ### Поддержка расширений 525 | 526 | Добавить параметр `-Extension`: 527 | 528 | ```powershell 529 | $arguments += "-Extension", "`"MyExtension`"" 530 | ``` 531 | 532 | ### Автоматическое обновление БД 533 | 534 | **Реализовано!** Используйте параметр `-UpdateDB`: 535 | 536 | ```cmd 537 | REM Короткая команда 538 | loadcfg HEAD -UpdateDB 539 | ``` 540 | 541 | ```powershell 542 | # PowerShell скрипт напрямую (с явными параметрами) 543 | .\scripts\partial-load-config.ps1 -CommitId "HEAD" ` 544 | -InfoBasePath "C:\Bases\MyBase" ` 545 | -UpdateDB 546 | ``` 547 | 548 | ### Запуск в режиме 1С:Предприятие 549 | 550 | **Реализовано!** Используйте параметр `-RunEnterprise`: 551 | 552 | ```cmd 553 | REM Простой запуск 554 | loadcfg HEAD -RunEnterprise 555 | 556 | REM С открытием конкретного объекта 557 | loadcfg HEAD -RunEnterprise -NavigationLink "e1cib/data/Catalog.Items" 558 | 559 | REM С запуском внешней обработки 560 | loadcfg HEAD -RunEnterprise -ExternalDataProcessor "C:\Tools\MyProcessor.epf" 561 | ``` 562 | 563 | ```powershell 564 | # PowerShell скрипт напрямую (с явными параметрами) 565 | .\scripts\partial-load-config.ps1 -CommitId "HEAD" ` 566 | -InfoBasePath "C:\Bases\MyBase" ` 567 | -RunEnterprise ` 568 | -NavigationLink "e1cib/data/Catalog.Items" 569 | ``` 570 | 571 | ### Комплексный сценарий 572 | 573 | Загрузка, обновление БД и запуск с открытием объекта: 574 | 575 | ```cmd 576 | REM Короткая команда (параметры из .env) 577 | loadcfg HEAD -UpdateDB -RunEnterprise -NavigationLink "e1cib/data/Document.SalesOrder" 578 | ``` 579 | 580 | ```powershell 581 | # PowerShell скрипт напрямую (с явными параметрами) 582 | .\scripts\partial-load-config.ps1 -CommitId "HEAD" ` 583 | -InfoBasePath "C:\edt\IB\ERP_2.5.12.73" ` 584 | -ConfigDir "src" ` 585 | -UserName "Администратор" ` 586 | -UpdateDB ` 587 | -RunEnterprise ` 588 | -NavigationLink "e1cib/data/Document.SalesOrder" 589 | ``` 590 | 591 | ## Устранение неполадок 592 | ### Скрипт открывается в Блокноте вместо выполнения 593 | Если при запуске `.ps1` файла он открывается в текстовом редакторе, это означает, что в вашей системе для этого типа файлов не настроено действие "Выполнить". 594 | 595 | Для принудительного выполнения используйте `powershell.exe`: 596 | 597 | ```powershell 598 | # Пример для полной выгрузки 599 | powershell.exe -ExecutionPolicy Bypass -File .\dump-full-config.ps1 600 | 601 | # Пример для частичной загрузки 602 | powershell.exe -ExecutionPolicy Bypass -File .\partial-load-config.ps1 -CommitId "HEAD" 603 | ``` 604 | 605 | 606 | ### Ошибка: "git не найден" 607 | Установите git и добавьте его в PATH 608 | 609 | ### Ошибка: "Каталог конфигурации не найден" 610 | Проверьте параметр `-ConfigDir` и наличие каталога 611 | 612 | ### Ошибка: "No configuration files found for loading" 613 | - Проверьте идентификатор коммита 614 | - Убедитесь, что в коммите есть изменения XML или BSL файлов 615 | - Проверьте путь к каталогу конфигурации (параметр `-ConfigDir`) 616 | 617 | ### Ошибка: "The system cannot find the file specified" при запуске 1cv8.exe 618 | - Укажите полный путь к платформе через параметр `-V8Path` 619 | - Пример: `-V8Path "C:\Program Files\1cv8\8.3.27.1859\bin\1cv8.exe"` 620 | 621 | ### Код возврата 1 от 1cv8.exe 622 | Проверьте файл лога (`-OutFile` или временный файл) 623 | 624 | ## См. также 625 | 626 | - [Документация 1С: Командная строка](https://its.1c.ru/db/v8324doc#bookmark:adm:TI000000527) 627 | - [Git документация](https://git-scm.com/doc) 628 | - Параметр `/LoadConfigFromFiles` (строка 1070 в документации) 629 | 630 | # Выгрузка конфигурации в файлы 631 | 632 | ## Описание 633 | 634 | Скрипты для выгрузки конфигурации 1С:Предприятие из информационной базы в файлы в трех режимах. 635 | 636 | ## Режимы выгрузки 637 | 638 | ### 1. Полная выгрузка (Full) 639 | 640 | Выгружает всю конфигурацию целиком. 641 | 642 | ```cmd 643 | REM Короткая команда 644 | dumpcfg Full 645 | ``` 646 | 647 | ```powershell 648 | # PowerShell скрипты напрямую (с явными параметрами) 649 | .\scripts\dump-full-config.ps1 -ConfigDir "src" -InfoBasePath "C:\Bases\MyBase" 650 | .\scripts\dump-config.ps1 -Mode Full -ConfigDir "src" -InfoBasePath "C:\Bases\MyBase" 651 | ``` 652 | 653 | **Использование:** 654 | - Первичная выгрузка конфигурации 655 | - Создание базовой копии для версионирования 656 | - Экспорт для анализа 657 | 658 | ### 2. Инкрементальная выгрузка (Changes) 659 | 660 | Выгружает только измененные объекты относительно предыдущей выгрузки. 661 | 662 | ```cmd 663 | REM Короткая команда 664 | dumpcfg Changes 665 | 666 | REM С сохранением списка изменений (если не настроено в .env) 667 | dumpcfg Changes -ChangesFile "changes.txt" 668 | ``` 669 | 670 | ```powershell 671 | # PowerShell скрипты напрямую (с явными параметрами) 672 | .\scripts\dump-changes-config.ps1 -ConfigDir "src" -InfoBasePath "C:\Bases\MyBase" 673 | 674 | # С сохранением списка изменений 675 | .\scripts\dump-changes-config.ps1 -ConfigDir "src" ` 676 | -InfoBasePath "C:\Bases\MyBase" ` 677 | -ChangesFile "changes.txt" 678 | 679 | # Сравнение с другой выгрузкой 680 | .\scripts\dump-changes-config.ps1 -ConfigDir "src" ` 681 | -InfoBasePath "C:\Bases\MyBase" ` 682 | -CompareWith "old_dump\ConfigDumpInfo.xml" ` 683 | -Force 684 | ``` 685 | 686 | **Использование:** 687 | - Регулярная выгрузка изменений для версионирования 688 | - Отслеживание модификаций конфигурации 689 | - Экспорт для анализа изменений с AI-ассистентами 690 | 691 | **Важно:** Требует файл `ConfigDumpInfo.xml` от предыдущей выгрузки. 692 | 693 | ### 3. Частичная выгрузка (Partial) 694 | 695 | Выгружает только конкретные объекты, указанные либо в файле, либо напрямую в командной строке. 696 | 697 | **Способ 1: Указание объектов в файле** 698 | ```cmd 699 | REM Короткая команда (файл из .env: DUMP_OBJECTS_LIST) 700 | dumpcfg Partial 701 | ``` 702 | 703 | ```powershell 704 | # PowerShell скрипт напрямую (с явными параметрами) 705 | .\scripts\dump-partial-config.ps1 -ObjectsListFile "dump_objects.txt" ` 706 | -ConfigDir "src" ` 707 | -InfoBasePath "C:\Bases\MyBase" 708 | ``` 709 | 710 | **Способ 2: Указание объектов в параметре** 711 | ```cmd 712 | REM Короткая команда - выгрузка одного объекта 713 | dumpcfg -mode Partial -objects "Справочник.Номенклатура" 714 | 715 | REM Выгрузка нескольких объектов (важно: в двойных кавычках, без пробелов у запятой) 716 | dumpcfg -mode Partial -objects "Справочник.Номенклатура,Документ.РеализацияТоваровУслуг" 717 | ``` 718 | 719 | ```powershell 720 | # PowerShell скрипт напрямую 721 | .\scripts\dump-partial-config.ps1 -ObjectNames "Справочник.Номенклатура" -InfoBaseName "MyBase" 722 | 723 | # Выгрузка нескольких объектов 724 | .\scripts\dump-partial-config.ps1 -ObjectNames "Справочник.Номенклатура,Документ.РеализацияТоваровУслуг" ` 725 | -InfoBasePath "C:\Bases\MyBase" ` 726 | -DebugMode 727 | ``` 728 | 729 | **Формат файла списка объектов (`dump_objects.txt`):** 730 | ``` 731 | # Каждая строка - имя объекта метаданных 732 | Справочник.Номенклатура 733 | Документ.РеализацияТоваровУслуг 734 | Отчет.АнализПродаж 735 | ``` 736 | 737 | **Использование:** 738 | - **Через параметр `-ObjectNames`**: идеально для быстрой выгрузки 1-2 объектов. 739 | - **Через файл `-ObjectsListFile`**: удобно для выгрузки большого или часто используемого списка объектов. 740 | - Экспорт отдельных модулей для анализа или передачи коллегам. 741 | 742 | ## Параметры выгрузки 743 | 744 | ### Основные параметры 745 | 746 | | Параметр | Обязательный | Описание | 747 | |----------|--------------|----------| 748 | | `Mode` | Нет | Режим выгрузки: Full, Changes, Partial (default: Changes) | 749 | | `ConfigDir` | Нет | Каталог для выгрузки. Переопределяет `CONFIG_DIR` из `.env`. (default: `config`) | 750 | | `InfoBasePath` | Да* | Путь к файловой базе данных | 751 | | `InfoBaseName` | Да* | Имя базы из списка (альтернатива InfoBasePath) | 752 | 753 | *Один из двух параметров обязателен 754 | 755 | ### Параметры для режима Changes 756 | 757 | | Параметр | Описание | 758 | |----------|----------| 759 | | `ChangesFile` | Файл для сохранения списка изменений | 760 | | `CompareWith` | Путь к ConfigDumpInfo.xml для сравнения | 761 | | `Force` | Принудительная полная выгрузка при несоответствии версий | 762 | 763 | ### Параметры для режима Partial 764 | 765 | | Параметр | Описание | 766 | |----------|----------| 767 | | `ObjectsListFile` | **(Обязательный, если не указан `ObjectNames`)**
Файл со списком имен объектов для выгрузки. | 768 | | `ObjectNames` | **(Обязательный, если не указан `ObjectsListFile`)**
Массив строк с именами объектов для выгрузки. | 769 | 770 | ### Дополнительные параметры 771 | 772 | | Параметр | Значение по умолчанию | Описание | 773 | |----------|----------------------|----------| 774 | | `UserName` | - | Имя пользователя 1С | 775 | | `Password` | - | Пароль пользователя | 776 | | `Format` | `Hierarchical` | Формат: Hierarchical или Plain | 777 | | `V8Path` | `1cv8.exe` | Путь к исполняемому файлу платформы | 778 | | `OutFile` | temp файл | Файл для вывода служебных сообщений | 779 | | `DebugMode` | - | Режим отладки | 780 | | `Extension` | - | Имя расширения для выгрузки | 781 | | `AllExtensions` | - | Выгрузить все расширения | 782 | 783 | ## Использование с .env 784 | 785 | Параметры выгрузки можно настроить в файле `.env`: 786 | 787 | ```ini 788 | # Выгрузка конфигурации 789 | DUMP_MODE=Changes 790 | DUMP_OBJECTS_LIST=objects.txt 791 | DUMP_CHANGES_FILE=config_changes.txt 792 | ``` 793 | 794 | После настройки `.env` запуск упрощается: 795 | 796 | ```cmd 797 | REM Короткие команды (рекомендуется) 798 | dumpcfg :: использует DUMP_MODE из .env 799 | dumpcfg Full :: переопределяет режим 800 | ``` 801 | 802 | ```powershell 803 | # PowerShell скрипты напрямую 804 | .\scripts\dump-changes-config.ps1 805 | .\scripts\dump-full-config.ps1 -ConfigDir "config_backup" 806 | ``` 807 | 808 | ## Примеры использования 809 | 810 | ### Сценарий 1: Регулярная выгрузка изменений 811 | 812 | Это основной сценарий работы с системой контроля версий. 813 | 814 | ```cmd 815 | REM Короткие команды (рекомендуется, параметры из .env) 816 | dumpcfg Full 817 | REM ... работа в конфигураторе, внесение изменений ... 818 | 819 | REM Выгрузка только изменений 820 | dumpcfg Changes 821 | 822 | REM Фиксация в git 823 | git add . 824 | git commit -m "Добавлен новый справочник" 825 | ``` 826 | 827 | ```powershell 828 | # PowerShell скрипты напрямую (с явными параметрами) 829 | .\scripts\dump-full-config.ps1 -ConfigDir "src" -InfoBasePath "C:\Bases\Dev" 830 | 831 | # ... работа в конфигураторе ... 832 | 833 | # Выгрузка только изменений 834 | .\scripts\dump-changes-config.ps1 -ConfigDir "src" ` 835 | -InfoBasePath "C:\Bases\Dev" ` 836 | -ChangesFile "changes.txt" 837 | 838 | git add . 839 | git commit -m "Добавлен новый справочник" 840 | 841 | # Обновление файла состояния (опционально) 842 | .\scripts\update-dump-info.ps1 -ConfigDir "src" -InfoBasePath "C:\Bases\Dev" 843 | ``` 844 | 845 | ### Сценарий 2: Выгрузка конкретных объектов 846 | 847 | ```cmd 848 | REM Короткая команда - передаем объекты напрямую 849 | dumpcfg -mode Partial -objects "Справочник.Номенклатура,Отчет.АнализПродаж" 850 | ``` 851 | 852 | ```powershell 853 | # PowerShell - создаем список в файле 854 | @" 855 | Справочник.Номенклатура 856 | Документ.РеализацияТоваровУслуг 857 | Отчет.АнализПродаж 858 | "@ | Out-File dump_objects.txt -Encoding UTF8 859 | 860 | # Выгружаем из файла 861 | .\scripts\dump-partial-config.ps1 -ObjectsListFile "dump_objects.txt" ` 862 | -ConfigDir "selected_objects" ` 863 | -InfoBasePath "C:\Bases\MyBase" 864 | 865 | # Или передаем объекты напрямую 866 | .\scripts\dump-partial-config.ps1 -ObjectNames "Справочник.Номенклатура", "Отчет.АнализПродаж" ` 867 | -ConfigDir "selected_objects" ` 868 | -InfoBasePath "C:\Bases\MyBase" 869 | ``` 870 | 871 | ### Сценарий 3: Выгрузка расширений 872 | 873 | ```cmd 874 | REM Короткая команда 875 | dumpcfg Full -Extension "MyExtension" 876 | dumpcfg Full -AllExtensions 877 | ``` 878 | 879 | ```powershell 880 | # PowerShell скрипты напрямую 881 | .\scripts\dump-full-config.ps1 -ConfigDir "extensions\MyExtension" ` 882 | -InfoBasePath "C:\Bases\MyBase" ` 883 | -Extension "MyExtension" 884 | 885 | .\scripts\dump-full-config.ps1 -ConfigDir "all_extensions" ` 886 | -InfoBasePath "C:\Bases\MyBase" ` 887 | -AllExtensions 888 | ``` 889 | 890 | ## Интеграция с загрузкой 891 | 892 | Скрипты выгрузки и загрузки дополняют друг друга: 893 | 894 | ```cmd 895 | REM Короткие команды (параметры из .env) 896 | dumpcfg Changes 897 | git add src 898 | git commit -m "Обновление конфигурации" 899 | 900 | loadcfg HEAD -UpdateDB 901 | ``` 902 | 903 | ```powershell 904 | # PowerShell скрипты напрямую (с явными параметрами) 905 | .\scripts\dump-changes-config.ps1 -ConfigDir "src" -InfoBasePath "C:\Bases\Prod" 906 | git add src 907 | git commit -m "Обновление конфигурации" 908 | 909 | # Загружаем в конфигурацию информацонной базы 910 | .\scripts\partial-load-config.ps1 -CommitId "HEAD" ` 911 | -ConfigDir "src" ` 912 | -InfoBasePath "C:\Bases\Dev" ` 913 | -UpdateDB 914 | ``` 915 | 916 | ## Отладка 917 | 918 | При возникновении проблем используйте параметр `-DebugMode`: 919 | 920 | ```cmd 921 | REM Короткая команда 922 | dumpcfg -DebugMode 923 | ``` 924 | 925 | ```powershell 926 | # PowerShell скрипт напрямую 927 | .\scripts\dump-changes-config.ps1 -ConfigDir "src" ` 928 | -InfoBasePath "C:\Bases\MyBase" ` 929 | -DebugMode 930 | ``` 931 | 932 | Это выведет: 933 | - Параметры запуска 934 | - Режим выгрузки 935 | - Полную командную строку 1cv8.exe 936 | - Список изменений (для режима Changes) 937 | - Путь к временным файлам (не удаляются) 938 | 939 | ## История изменений 940 | 941 | ### Версия 6.0 (ноябрь 2025) 942 | - ✅ **Короткие команды** - `loadcfg` и `dumpcfg` для быстрого доступа 943 | - ✅ **Реорганизация проекта** - все скрипты в каталоге `scripts/` 944 | - ✅ **Упрощенный синтаксис** - позиционные параметры для режимов выгрузки 945 | - ✅ Обновлена документация с примерами коротких команд 946 | 947 | ### Версия 5.0 (ноябрь 2025) 948 | - ✅ **Добавлена выгрузка конфигурации** - три режима (Full, Changes, Partial) 949 | - ✅ **Универсальный скрипт dump-config.ps1** с поддержкой .env 950 | - ✅ **Три обертки** для удобного запуска каждого режима 951 | - ✅ Поддержка расширений конфигурации 952 | - ✅ Интеграция с существующей системой загрузки 953 | 954 | ### Версия 4.0 (ноябрь 2025) 955 | - ✅ **Изменена логика получения файлов**: указанный коммит теперь точка отсчета 956 | - ✅ **Загрузка всех изменений**: от коммита до HEAD + незафиксированные 957 | - ✅ **Улучшенная отладка**: детальная статистика по источникам изменений 958 | - ✅ Обновлена документация с подробным описанием логики 959 | 960 | ### Версия 3.0 (ноябрь 2025) 961 | - ✅ **Автоматическое обновление конфигурации БД** (`-UpdateDB`) 962 | - ✅ **Запуск в режиме 1С:Предприятие** (`-RunEnterprise`) 963 | - ✅ **Поддержка навигационных ссылок** (`-NavigationLink`) 964 | - ✅ **Запуск внешних обработок** (`-ExternalDataProcessor`) 965 | - ✅ Комплексные сценарии: загрузка + обновление + запуск 966 | 967 | ### Версия 2.0 (ноябрь 2025) 968 | - ✅ Добавлена поддержка BSL файлов 969 | - ✅ Автоматическое добавление XML объектов при изменении модулей 970 | - ✅ Улучшенная обработка связанных файлов объектов 971 | - ✅ Исправлен конфликт параметра `-Debug` с встроенным PowerShell параметром (переименован в `-DebugMode`) 972 | - ✅ Интернационализация сообщений (English) 973 | 974 | ### Версия 1.0 975 | - ✅ Базовая функциональность частичной загрузки 976 | - ✅ Поддержка XML файлов конфигурации 977 | - ✅ Режим отладки 978 | 979 | ## Автор 980 | 981 | Скрипт создан для автоматизации процесса разработки конфигураций 1С с использованием git. 982 | 983 | ## Лицензия 984 | 985 | Свободное использование --------------------------------------------------------------------------------