При совместной разработке часто возникает классическая ситуация: есть исходная версия расширения до доработок (состояние А), а также две независимые ветки изменений от разных специалистов — версия Программиста 1 (состояние Б) и версия Программиста 2 (состояние В). Задача заключается в том, чтобы корректно объединить эти доработки и четко увидеть «дважды измененные» объекты, где код или метаданные редактировались одновременно с двух сторон.
Разберем, почему стандартный инструмент сравнения и объединения в классическом Конфигураторе не решает эту задачу «из коробки», а также рассмотрим проверенные способы выполнения трехстороннего слияния (3-way merge) для расширений конфигурации.
Проанализируем архитектурные ограничения платформы 1С:Предприятие. В стандартном Конфигураторе механизм выявления дважды измененных объектов тесно связан с подсистемой поставки и поддержки. При обновлении типовых конфигураций платформа опирается на конфигурацию поставщика, которая выступает общим предком (Base/Ancestry). Зная предка, платформа может сопоставить текущую конфигурацию базы и файл обновления, выделив конфликты.
Для файлов расширений (.cfe) механизм поддержки не предусмотрен. Поэтому штатная команда Сравнить, объединить с расширением из файла... всегда выполняет только попарное (двухстороннее) сравнение. Платформа физически не знает, какая версия была исходной точкой отсчета, и не может определить факт одновременного изменения одного и того же свойства, реквизита или строки кода обеими сторонами.
Даже если в параметрах Конфигуратора подключена внешняя программа трехстороннего слияния (например, KDiff3 или P4Merge), платформа автоматически вызывает ее в трехстороннем режиме только для конфигураций на поддержке. При сравнении расширений во внешнюю утилиту передаются только два файла, чего для полноценного разрешения конфликтов недостаточно.
Рассмотрим наиболее современный и «нативный» подход к трехстороннему слиянию расширений. Среда разработки 1C:EDT построена на базе Eclipse и использует Git в качестве базовой системы контроля версий. В ней задача поиска дважды измененных объектов решается штатно:
Если разработка ведется в классическом Конфигураторе, но вам требуется точно контролировать конфликты, применим выгрузку расширений в файлы исходного кода. Разберем этот процесс по шагам:
1cv8.exe DESIGNER /IBConnectionString "..." /DumpConfigToFiles "C:\Repo\Extension" -Extension "МоеРасширение"
C:\Repo\Extension и создадим базовый коммит для состояния А.feature/programmer1, выгрузим туда состояние Б и закоммитим изменения.feature/programmer2, выгрузим туда состояние В и выполним коммит.
git checkout feature/programmer1
git merge feature/programmer2
KDiff3, P4Merge, VS Code).
1cv8.exe DESIGNER /IBConnectionString "..." /LoadConfigFromFiles "C:\Repo\Extension" -Extension "МоеРасширение"
Посмотрим на сценарий, когда Git на проекте не развернут, но требуется быстро локализовать дважды измененные объекты. Для этого используем внешние программы, умеющие выполнять 3-Way Merge на уровне каталогов (например, KDiff3, Beyond Compare или P4Merge):
C:\Merge\Base через команду пакетного режима /DumpConfigToFiles -Extension <ИмяРасширения> или через меню Конфигуратора Конфигурация - Выгрузить конфигурацию в файлы... (предварительно открыв расширение).C:\Merge\Mine.C:\Merge\Theirs.C:\Merge\Base (исходное состояние А);C:\Merge\Mine (доработки первого программиста Б);C:\Merge\Theirs (доработки второго программиста В).Mine и Theirs относительно Base. Это и есть искомые дважды измененные объекты./LoadConfigFromFiles.Разберем ситуацию, когда выгрузка во внешние утилиты недоступна из-за политик безопасности. В этом случае выявить дважды измененные элементы можно с помощью встроенных отчетов о сравнении: