📦 Что потребуется
Visual Studio Code (желательно не из Microsoft Store, а обычный инсталлятор с сайта).
Установленная команда code в PATH.
Для этого в VS Code выполните команду:
Ctrl+Shift+P → Shell Command: Install 'code' command in PATH
Файл CompareAndCopyWait.bat — наш помощник, который запустит сравнение и выполнит копирование результата.
Настройка в 1С
Откройте Конфигуратор → Сервис → Параметры → Сравнение, объединение и обновление конфигураций.
В блоке Внешняя программа сравнения укажите путь к нашему батнику:
"C:\Tools\CompareAndCopyWait.bat"
Настройте способ объединения:
%secondCfg %baseCfg %merged
Что делает каждый параметр
%1 — первый файл (оригинал);
%2 — второй файл (изменённый);
%3 — путь, куда нужно записать результат.
🧠 Логика работы скрипта
Батник:
Проверяет входные параметры.
Находит установленный VS Code (code или Code.exe).
Запускает визуальное сравнение с флагами:
code --new-window --wait --diff "%1" "%2"
Ключ --wait заставляет VS Code ждать, пока окно не будет закрыто, что критично для автоматизации.
После закрытия VS Code копирует второй файл (как результат) в путь, указанный третьим параметром.
Записывает все действия в лог-файл.
🧾 Полный код CompareAndCopyWait.bat
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
rem =====================[ НАСТРОЙКИ ЛОГИРОВАНИЯ ]=====================
set "SCRIPT_DIR=%~dp0"
set "LOGDIR=%SCRIPT_DIR%logs"
rem Формируем безопасный таймстемп YYYY-MM-DD_HH-MM-SS
for /f "tokens=1-3 delims=.:-/ " %%a in ("%date%") do (
set "D1=%%a" & set "D2=%%b" & set "D3=%%c"
)
for /f "tokens=1-4 delims=.:-/ " %%h in ("%time%") do (
set "H1=%%h" & set "M1=%%i" & set "S1=%%j" & set "MS=%%k"
)
rem Нормализуем час (убираем пробел в начале)
if "%H1:~1,1%"=="" (set "H1=0%H1:~0,1%")
set "TS=%D3%-%D2%-%D1%_%H1%-%M1%-%S1%"
if not exist "%LOGDIR%" mkdir "%LOGDIR%" >nul 2>&1
set "LOGFILE=%LOGDIR%\CompareAndCopy_%TS%.log"
rem Утилита для записи в лог
set "LOGPFX=[%TS%]"
>>"%LOGFILE%" echo %LOGPFX% ==== START CompareAndCopyWait ====
>>"%LOGFILE%" echo %LOGPFX% Raw args: 1="%~1" 2="%~2" 3="%~3"
rem =====================[ ПРОВЕРКА ПАРАМЕТРОВ ]=====================
if "%~1"=="" (
echo Использование: %~nx0 ^<original_file^> ^<changed_file^> ^<dest_path^>
>>"%LOGFILE%" echo %LOGPFX% ERROR: arg1 missing
exit /b 1
)
if "%~2"=="" (
echo Ошибка: не указан второй параметр ^(changed_file^).
>>"%LOGFILE%" echo %LOGPFX% ERROR: arg2 missing
exit /b 1
)
if "%~3"=="" (
echo Ошибка: не указан третий параметр ^(dest_path^).
>>"%LOGFILE%" echo %LOGPFX% ERROR: arg3 missing
exit /b 1
)
rem =====================[ НОРМАЛИЗАЦИЯ ПУТЕЙ ]=====================
set "ORIG=%~f1"
set "CHANGED=%~f2"
set "DEST=%~f3"
>>"%LOGFILE%" echo %LOGPFX% Resolved: ORIG="%ORIG%" CHANGED="%CHANGED%" DEST="%DEST%"
if not exist "%ORIG%" (
echo Ошибка: файл не найден: "%ORIG%"
>>"%LOGFILE%" echo %LOGPFX% ERROR: ORIG not found
exit /b 1
)
if not exist "%CHANGED%" (
echo Ошибка: файл не найден: "%CHANGED%"
>>"%LOGFILE%" echo %LOGPFX% ERROR: CHANGED not found
exit /b 1
)
rem =====================[ ПОИСК VS CODE ]===========================
where code >nul 2>&1
if %errorlevel%==0 (
for /f "delims=" %%p in ('where code') do set "VSCODE=%%p"
set "VSCODE=code"
>>"%LOGFILE%" echo %LOGPFX% Using CLI: "code" (found in PATH)
) else (
set "VSCODE=C:\Program Files\Microsoft VS Code\Code.exe"
if not exist "%VSCODE%" (
set "VSCODE=%LocalAppData%\Programs\Microsoft VS Code\Code.exe"
)
if not exist "%VSCODE%" (
echo Ошибка: VS Code не найден. Установите 'code' в PATH или поправьте путь к Code.exe.
>>"%LOGFILE%" echo %LOGPFX% ERROR: VS Code not found
exit /b 1
)
>>"%LOGFILE%" echo %LOGPFX% Using EXE: "%VSCODE%"
)
rem =====================[ ЗАПУСК DIFF + ОЖИДАНИЕ ]==================
set "CMDLINE=%VSCODE% --new-window --wait --diff "%ORIG%" "%CHANGED%""
>>"%LOGFILE%" echo %LOGPFX% Exec: %CMDLINE%
"%VSCODE%" --new-window --wait --diff "%ORIG%" "%CHANGED%"
set "RC_VSCODE=%ERRORLEVEL%"
>>"%LOGFILE%" echo %LOGPFX% VSCode exit code: %RC_VSCODE%
if not "%RC_VSCODE%"=="0" (
echo Предупреждение: VS Code завершился с кодом %RC_VSCODE%.
)
rem =====================[ КОПИРОВАНИЕ ]============================
for %%F in ("%DEST%") do set "DEST_DIR=%%~dpF"
>>"%LOGFILE%" echo %LOGPFX% Dest dir: "%DEST_DIR%"
if not exist "%DEST_DIR%" (
mkdir "%DEST_DIR%" 2>>"%LOGFILE%"
if errorlevel 1 (
echo Ошибка: не удалось создать каталог назначения "%DEST_DIR%".
>>"%LOGFILE%" echo %LOGPFX% ERROR: mkdir failed
exit /b 1
)
>>"%LOGFILE%" echo %LOGPFX% Created dest dir
)
copy /Y "%CHANGED%" "%DEST%" >>"%LOGFILE%" 2>&1
set "RC_COPY=%ERRORLEVEL%"
if not "%RC_COPY%"=="0" (
echo Ошибка: не удалось скопировать "%CHANGED%" в "%DEST%".
>>"%LOGFILE%" echo %LOGPFX% ERROR: copy failed, rc=%RC_COPY%
exit /b 1
)
>>"%LOGFILE%" echo %LOGPFX% Copy OK to "%DEST%"
echo Готово: "%CHANGED%" скопирован в "%DEST%".
>>"%LOGFILE%" echo %LOGPFX% ==== END CompareAndCopyWait (rc=%RC_VSCODE%) ====
exit /b 0
💡 Пример вызова из командной строки
CompareAndCopyWait.bat "C:\temp\a.xml" "C:\temp\b.xml" "C:\out\result.xml"
После закрытия окна VS Code, файл b.xml будет скопирован в result.xml.
🧾 Преимущества такого подхода
- Красивое визуальное сравнение прямо в VS Code
- Работает с любыми текстовыми файлами (.bsl, .xml, .json, .sql, .txt)
- Полная совместимость с 1С:Предприятием (через стандартный интерфейс)
- Логирование всех действий (для диагностики)
- Автоматическое ожидание закрытия окна
- Можно доработать под merge или под собственный pipeline
🎯 Заключение
Теперь вы можете использовать VS Code как внешний инструмент сравнения и слияния в 1С, без сторонних программ вроде WinMerge или Beyond Compare.
Скрипт прост, надёжен и даёт возможность централизованно логировать все операции.
Вступайте в нашу телеграмм-группу Инфостарт