Инструмент сравнения и трёхстороннего слияния табличных документов 1С в
формате .mxl (MOXCEL). Подключается к Git как diff- и merge-драйвер,
автоматически объединяет независимые изменения и открывает локальный редактор
для конфликтов.
Платформа 1С не требуется для diff и слияния. Она используется только для точного HTML-предпросмотра документов.
- текстовый diff для бинарных
.mxl; - автоматическое трёхстороннее слияние Base, Local и Remote;
- разрешение конфликтов ячеек и строк в браузере;
- обработка добавления, удаления и перестановки строк;
- переставленный блок решается целиком, одной стороной, и не смешивается построчно;
- выбор Base, Local, Remote или ручного значения;
- переопределение автоматически выбранных изменений;
- одновременный предпросмотр источников и результата;
- режимы просмотра
Full,Changes,Conflicts, затемнение неизменённого содержимого и масштаб; - список конфликтов в панели результата с переходом по ним;
- открытие безопасных копий источников и ручная доработка результата в «1С:Предприятие — Работа с файлами»;
- координаты ячеек, навигация по конфликтам и Undo/Redo;
- проверка структуры перед записью результата;
- интеграция с Git, Git Extensions и другими Git-клиентами;
- готовый Windows-дистрибутив со встроенным Python, нативным окном настройки, автопоиском 1С, контекстным меню Проводника и штатным удалением.
- Поэлементное структурное слияние поддерживается для строк. Изменения колонок и нераспознанная структура разрешаются выбором целого Base, Local или Remote.
- Сохранение и удаление строк можно комбинировать с перестановками другой стороны. Противоречащие друг другу варианты порядка строк не сохраняются.
- Удаление строки, изменённой в другой ветке, всегда требует явного решения.
- Если одна сторона переставила блок строк, а другая изменила строки внутри его диапазона, порядок и структура блока берутся с одной стороны целиком. Построчно смешать такой блок нельзя.
- Подсветка в HTML сопоставляется по видимым значениям ячеек. Пустые строки и строки-разделители не содержат текста, поэтому не подсвечиваются и не участвуют в сопоставлении; повторяющиеся значения могут отображаться только в панели решений. На сам результат слияния это не влияет.
- Ручная доработка в 1С доступна после разрешения всех конфликтов. На время редактирования решения в merge-интерфейсе блокируются.
- Git;
- Python 3.10 или новее — для macOS, Linux и запуска из исходников. Для Windows Python не нужен: он входит в архив;
- современный браузер — для визуального редактора конфликтов;
- 1С:Предприятие — для точного HTML-предпросмотра;
- 1С:Предприятие — Работа с файлами для внешнего редактирования MXL.
Рядом с архивом на странице релиза лежит файл .sha256. В PowerShell вычислите
сумму скачанного архива и сравните значение Hash с первой колонкой этого
файла:
Get-FileHash .\mxl-merge-tool-<версия>-win64.zip -Algorithm SHA256- Скачайте
mxl-merge-tool-<версия>-win64.zipсо страницы релизов. - Распакуйте в любую папку.
- Двойной клик по
MXL merge tool.exe.
Откроется нативное окно настройки. Оно найдёт Git и установленные версии 1С. Версию 1С можно выбрать из списка или указать пути к тонкому клиенту и «1С:Предприятие — Работа с файлами» вручную. Кнопка «Установить» настраивает diff- и merge-драйверы для всех ваших репозиториев. Права администратора не нужны, Python устанавливать не нужно.
После установки распакованную папку можно удалить: файлы копируются в
%LOCALAPPDATA%\mxl-merge-tool.
В меню «Пуск» создаётся папка MXL Merge Tool с двумя ярлыками: «Настройка
MXL Merge Tool» и «Удаление MXL Merge Tool».
Правый клик по папке репозитория даёт пункт «MXL merge: настроить этот
репозиторий» — он дописывает .gitattributes в конкретный проект:
Удаление доступно через ярлык в меню «Пуск» или через «Программы и компоненты», пункт «MXL Merge Tool».
При обновлении распакуйте новый архив и снова запустите установщик.
Из корня Git-репозитория:
python3 mxl_tool.py installНа Windows для полного функционала укажите тонкий клиент платформы и «1С:Предприятие — Работа с файлами»:
python mxl_tool.py install ^
--onec-client "C:\Program Files\1cv8\8.3.27.2074\bin\1cv8c.exe" ^
--onec-file-editor "C:\Program Files (x86)\1cv8fv\bin\1cv8fv.exe"--onec-client включает точный HTML-предпросмотр через 1С,
--onec-file-editor — открытие копий источников и ручное редактирование
результата. Если эти функции не нужны, достаточно python mxl_tool.py install.
Установщик настраивает локальные diff-, merge- и mergetool-драйверы и добавляет
в .gitattributes:
*.mxl -text diff=mxl merge=mxlДобавьте .gitattributes в репозиторий. Сам инструмент каждый разработчик
устанавливает локально один раз.
Проверка:
git check-attr diff merge -- path/to/template.mxlОжидаются атрибуты diff: mxl и merge: mxl.
python3 /absolute/path/to/mxl_tool.py install --globalНа Windows:
python C:\mxl_tool.py install --globalGit сохраняет абсолютный путь к mxl_tool.py, поэтому после установки каталог
инструмента нельзя перемещать.
При установке с --onec-client файл 1cv8.exe должен находиться рядом с
1cv8c.exe. При первом запуске инструмент автоматически создаст служебную базу
и подключит встроенную обработку. Base, Local и Remote преобразуются в HTML
пакетно за один запуск 1С.
Проверка конвертера:
python mxl_tool.py render-onec ^
path\to\sample.mxl %TEMP%\sample-mxl.htmlПакетная проверка нескольких файлов за один запуск 1С:
python mxl_tool.py render-onec-batch %TEMP%\manifest.jsonМанифест — JSON вида
{"items": [{"name": "base", "inputPath": "…", "outputPath": "…"}]}.
Свою базу или обработку можно задать параметрами --onec-infobase,
--onec-epf и --onec-username. Пароль передаётся через
MXL_ONEC_PASSWORD. Для собственного EPF с поддержкой пакетного манифеста
добавьте --onec-batch-capable.
--onec-file-editor настраивает приложение «1С:Предприятие — Работа с
файлами». Его можно указать и без --onec-client, если точный
HTML-предпросмотр не нужен.
Git вызывает merge-драйвер автоматически:
git merge feature/my-branchЕсли файл остался конфликтным, откройте редактор:
git mergetool --tool=mxl path/to/template.mxlЛокальная сессия завершится после Save или Cancel.
Base— общий предок веток;Local— текущая ветка;Remote— вливаемая ветка;Merged result— итоговый документ.
Клик по изменённой ячейке или строке открывает выбор источника. Односторонние изменения выбираются автоматически, но их можно переопределить. Решения по сохранению, удалению и расположению строк можно комбинировать.
Список конфликтов справа от результата показывает координату, тип и статус
каждого конфликта; клик по элементу переводит фокус на него. Переставленный блок
занимает в списке одну позицию: до выбора стороны он показан в результате единым
плейсхолдером R… · Reordered block, а после — содержимым выбранной стороны,
обведённым её цветом.
Над предпросмотром: Full показывает документ целиком, Changes выделяет
изменённые поля, Conflicts — только конфликтные; Dim затемняет неизменённое
содержимое, кнопки −/+ меняют масштаб.
Use Base/Local/Remoteиспользует соответствующий исходный документ целиком.Resolve pendingвыбирает сторону только для конфликтов без решения.All local/remoteзаменяет все решения выбранной стороной.Render exactсоздаёт промежуточный MXL и обновляет его предпросмотр через 1С.Open Base/Local/Remote copyоткрывает отдельную read-only копию источника; оригинальный файл не меняется.Edit in 1Cоткрывает отдельный MXL с текущими решениями. После сохранения и закрытия редактора предпросмотр обновляется автоматически; при необходимости используйтеReload from 1C. КнопкаEdit again in 1Cповторно открывает ту же копию и сохраняет первоначальный результат для сравнения.- Ручные изменения отмечаются
EDITEDили, например,LOCAL → EDITED. Пока они активны, решения в merge-интерфейсе заблокированы;Discard manual editsснимает блокировку и возвращает исходный результат. UndoиRedoработают также черезCtrl/Cmd+Z,Ctrl/Cmd+Shift+ZиCtrl/Cmd+Y.Saveпроверяет и записывает результат;Cancelничего не записывает.
После установки Git Extensions использует настройки из Git config. Для
конфликтного .mxl запустите mergetool и выберите mxl, если клиент запросит
инструмент. После Save файл будет отмечен как разрешённый.
Для диагностики используйте ту же команду в терминале:
git mergetool --tool=mxl relative/path/to/file.mxlРедактор можно открыть без Git-конфликта:
python3 mxl_tool.py ui \
base.mxl local.mxl remote.mxl \
--output merged.mxlНа Windows:
python mxl_tool.py ui ^
C:\Temp\base.mxl C:\Temp\local.mxl C:\Temp\remote.mxl ^
--output C:\Temp\merged.mxl--no-browser выводит URL сессии без автоматического открытия браузера.
Проверка структуры:
python3 mxl_tool.py validate file.mxlТекстовое представление для diff:
python3 mxl_tool.py textconv file.mxlMerge с явными файлами и отчётом:
python3 mxl_tool.py merge \
base.mxl local.mxl remote.mxl \
--output merged.mxl \
--report conflict.jsonВместо 1С можно подключить доверенный конвертер:
git config --local mxl.previewCommand \
'path/to/converter {input} {output}'Команда должна принять входной MXL, записать самодостаточный HTML и завершиться после полной записи файла. Она запускается без shell.
Пакетный вариант:
git config --local mxl.previewBatchCommand \
'path/to/batch-converter {manifest}'Команды можно переопределить переменными окружения MXL_PREVIEW_COMMAND и
MXL_PREVIEW_BATCH_COMMAND. Пустое значение отключает внешний конвертер —
удобно, когда предпросмотр через 1С нежелателен, например в CI:
MXL_PREVIEW_COMMAND= MXL_PREVIEW_BATCH_COMMAND= python3 -m unittest discover -s testsПроверка настроек Git:
git check-attr diff merge -- path/to/file.mxl
git config --get merge.mxl.driver
git config --get mergetool.mxl.cmdПроверка настроек предпросмотра:
git config --get mxl.onecClient
git config --get mxl.onecFileEditor
git config --get mxl.previewCommand
git config --get mxl.previewBatchCommandЕсли Git-репозиторий не найден, проверьте текущий каталог:
git rev-parse --show-toplevelОшибки HTML-конвертера не блокируют семантический diff и разрешение конфликтов.
Отчёты merge-драйвера находятся в .git/mxl-merge/reports.
python3 -m unittest discover -s tests -vСборка выполняется на macOS или Linux и требует компилятора mingw-w64 и
msitools (для извлечения tkinter из отдельного MSI Python, поскольку
embeddable-сборка его не содержит):
brew install mingw-w64 msitools
python3 tools/build_windows.pyСкрипт скачивает embeddable-сборку Python и tcltk.msi с python.org,
извлекает из него tkinter и Tcl/Tk, компилирует лаунчер и упаковывает всё в
dist/mxl-merge-tool-<версия>-win64.zip (~14 МБ); рядом кладётся файл
.sha256 с контрольной суммой архива.
Без компилятора mingw-w64 скрипт всё равно соберёт рабочий архив, но подставит
вместо лаунчера файл Настроить.cmd и пометит сборку как dev — такой архив не
для публикации.
Если у Python на машине сборки нет доверенного хранилища сертификатов,
скачивание падает с CERTIFICATE_VERIFY_FAILED. Решение — запустить скрипт с
переменной окружения SSL_CERT_FILE:
SSL_CERT_FILE=$(python3 -c "import certifi; print(certifi.where())") python3 tools/build_windows.pyНомер версии задаётся в одном месте — APP_VERSION в mxl_setup.py. Скрипт
сборки берёт его оттуда и сам подставляет в имя архива, в каталог установки, в
запись «Программ и компонентов» и в ресурсы лаунчера, поэтому править версию в
launcher.rc или launcher.manifest не нужно: там стоят подстановочные
метки. Прогон тестов проверяет, что литерал версии не вернулся в эти файлы.
Отдельного удаления прошлой версии не требуется: установка кладёт файлы в каталог своей версии, переписывает конфигурацию Git и ключи реестра на новые пути и удаляет каталоги прошлых версий.
- локальный сервер визуального редактора конфликтов слушает только loopback-интерфейс и использует случайный токен сессии;
- предпросмотры не загружают внешние сетевые ресурсы;
- исходные файлы не меняются до
Save; - результат проверяется и записывается атомарно;
- неоднозначные структурные решения не сохраняются.

