Сравнение и объединение конфигураций

Правила автоматической настройки объединения конфигураций

Операцию сравнения и объединения конфигураций можно вызвать прямой командой (например, Сравнить/объединить в контекстном меню проекта) либо опосредованно, выполняя слияние веток Git'а. Если это трехстороннее сравнение без конфликтных изменений, 1C:EDT объединит конфигурации автоматически. Трехстороннее сравнение, например, очень часто выполняется в Git'е.

Во всех остальных случаях после сравнения 1C:EDT автоматически установит настройки объединения конфигураций и откроет редактор сравнения и объединения. Это нужно для того, чтобы вы могли подтвердить или изменить настройки объединения, установленные автоматически.

В этом разделе описываются правила, в соответствии с которыми 1C:EDT устанавливает эти настройки.

Настройки объединения

В редакторе сравнения и объединения 1C:EDT показывает конфигурацию в виде, который очень похож на то представление, которое она имеет в панели Навигатор. Разница заключается в том, что в редакторе дерево конфигурации более подробное. Например, оно содержит в себе все те свойства объектов, которые при работе в панели Навигатор показываются в отдельной панели Свойства (на рисунке у узла Конфигурация есть дочерний узел Свойства).

Настройка объединения представляет собой совокупность флажка (в первой колонке слева) и режима объединения (в последней колонке). Такая настройка есть у каждого узла в дереве (у каждой строки).

Флажок отображается для всех узлов, но не во всех узлах можно его изменить. Например, если сравниваемые значения одинаковые, флажок будет сброшен и установить его нельзя.

Режим объединения отображается не для всех узлов, а только:

  • Для тех, которые участвуют в процедуре объединения;
  • Для тех, которые поддерживают изменение режима объединения;
  • Для тех, у которых выбран режим объединения, отличный от Не объединять.
Флажки объединения

Каждый флажок имеет три состояния:

  • установлен. Означает, что узел и все его потомки будут участвовать в процедуре объединения в соответствии со своими правилами объединения.
  • снят. Означает, что узел и все его потомки не будут участвовать в процедуре объединения и останутся без изменений.
  • установлен частично. Означает, что среди потомков есть узлы как с установленными, так и со снятыми флажками. Узлы с установленными флажками будут участвовать в процедуре объединения, а узлы со снятыми флажками останутся без изменений.

Состояние установлен частично возможно только для тех узлов, у которых есть потомки. Оно устанавливается автоматически, его нельзя установить в явном виде, нажимая на флажок.

Нажатие на флажок, который находится в состоянии установлен частично , переводит его в состояние снят .

При установке или снятии флажка у всех дочерних узлов также устанавливаются или снимаются флажки. При этом родительским узлам устанавливается состояние, соответствующее текущей расстановке флажков у детей.

Режимы объединения

Существует четыре режима объединения:

  • Не объединять. Выбор этого режима снимает флажок объединения. Фактически это означает, что узел и все его потомки не будут участвовать в процессе объединения.
  • Взять справа. При объединении будет взято значение из второго источника. Если этот режим выбран для родительского узла, можно устанавливать и снимать флажки у его дочерних узлов, исключая их из процесса объединения или добавляя к объединению.
  • Объединить с приоритетом второго источника. Этот режим используется при трехстороннем сравнении и указывает, как должны быть обработаны конфликтные изменения. Изменения, не имеющие конфликтов, будут объединены, а при объединении изменений, имеющих конфликты, будет взято значение из второго источника. Если этот режим выбран для родительского узла, изменение флажков у дочерних узлов будет невозможно.
  • Объединить с приоритетом главного источника. Этот режим работает аналогично предыдущему — с той разницей, что при конфликтные изменения не будут участвовать в объединении.
Правила настройки объединения

Если попытаться сформулировать эти правила в двух словах, то получится, что при двустороннем сравнении флажки объединения устанавливаются таким образом, чтобы все изменения были перенесены в главный источник. При трехстороннем сравнении дополнительно к этому флажки не устанавливаются в тех случаях, когда изменения есть только в главном источнике, чтобы случайно не "обнулить" их.

Поэтому в подавляющем большинстве случаев ваша задача будет заключаться не в том, чтобы установить флажки там, где они не установлены, а в том, чтобы проконтролировать конфликтные изменения модулей и, возможно, снять флажки у тех узлов, которые вы не хотите переносить в главный источник.

Если говорить подробно, то 1C:EDT автоматически устанавливает флажки в состояние снят и не позволяет изменять их в следующих случаях:

  • Когда значения в главном источнике и во втором источнике одинаковы (нечего изменять);
  • Когда изменение объекта конфигурации в главном источнике запрещено правилами поддержки конфигурации (нельзя изменять);
  • Когда объект конфигурации присутствует только в главном источнике и выполняются следующие условия (нельзя удалять):
    • Выполняется двустороннее сравнение;
    • В диалоге сравнения был снят флажок Разрешить удаление объектов главного источника.

Если ни одно из этих правил не сработало, то дальше 1C:EDT действует следующим образом:

  • Если объект конфигурации присутствует только во втором источнике, флажок будет установлен , режим объединения будет Взять справа (новое надо добавить);
  • Если объект конфигурации присутствует только в главном источнике, флажок будет сброшен , режим объединения будет Не объединять (удалить из главного источника можно, но только явным образом, вручную включив объект в процедуру объединения);
  • Если выполняется двустороннее сравнение и значения в главном и втором источниках различаются, флажок будет установлен , режим объединения будет Взять справа (существующее надо обновить);
  • Если выполняется трехстороннее сравнение:
    • и имеется конфликтное изменение — главный и второй источники имеют разные отличия от предка — флажок будет сброшен , режим объединения будет Не объединять;
    • и значение во втором источнике не отличается от предка, флажок будет сброшен , режим объединения будет Не объединять (либо нет необходимости в объединении, главный источник тоже не отличается от предка, либо изменения в главном источнике нужно сохранить и не "затереть").

Есть исключение, которое касается настроек поддержки. Если при объединении конфигураций есть конфликтные изменения в настройках поддержки, настройки поддержки объединяются всегда с режимом объединения Взять справа;

Сравнение модулей с учетом семантики встроенного языка

При сравнении разных модулей или разных версий одного и того же модуля используется встроенный механизм сравнения файлов.

Он учитывает семантику встроенного языка и может определять перемещение фрагментов кода (процедур и функций) внутри модуля. В результате вы не просто видите, что строки одного модуля отличаются от строк другого, а понимаете, что в принципе модуль не изменился, изменилось лишь положение процедур внутри него.

Также можно группировать соседние измененные строки в один блок. Это облегчает анализ изменений в этих строках.

Сравнение и объединение модулей с учетом структуры

Чтобы сравнивать и объединять модули с учетом их структуры, в параметрах 1C:EDT установите флажок Сравнивать модули с учетом структуры.

Этот режим позволяет вам анализировать отличия в разрезе отдельных методов модуля. При сравнении конфигураций методы отображаются в общей структуре конфигурации. Можно видеть, например, добавленные методы, можете исключить из объединения любой из методов.

При сравнении модулей в верхней части редактора сравнения и объединения модулей отображается список методов, а в нижней части сравнивается только выбранный метод.

В этом режиме 1C:EDT сначала выполняет разбор содержимого модуля, а после этого выполняет сравнение. Если разбор содержимого модуля завершился неудачно (например, из-за синтаксической ошибки), то модуль будет сравниваться без учета структуры, как один общий текст.

Сравнение и объединение модулей с помощью внешних программ

Чтобы сравнивать и объединять модули с помощью внешних программ, в параметрах 1C:EDT укажите путь к исполняемому файлу внешней программы и операции, для которых вы будете ее использовать.

Если вы хотите, чтобы в редакторе сравнения и объединения конфигураций режим объединения с помощью внешней программы автоматически устанавливался для всех модулей, также установите в параметрах 1C:EDT флажок Автоматически объединять с помощью выбранных программ. В противном случае вам нужно будет вручную выбрать этот режим для интересующих вас модулей.

Тут же вы можете выбрать, какие узлы объединять внешней программой: Все или Только дважды измененные, т. е. узлы с конфликтными изменениями.

Также в параметрах можно указать таймаут выполнения внешней программы, по истечении которого она будет прервана.

Прежде чем выполнять объединение, можно проанализировать некоторые модули. Для этого нажмите Сравнить с помощью внешней программы контекстном меню модуля.

С помощью этой команды можно сравнить тексты модулей в источниках.

При нажатии на шестеренку в строке модуля внешняя программа запускается для объединения модулей.

Результат объединения сохраняется в редакторе, при этом правило объединения меняется на Ручное объединение.

Если необходимость индивидуальной работы с модулями отсутствует, можно сразу запустить процедуру объединения. В этом случае сначала запустится объединение с помощью внешней программы для тех узлов, у которых установлен режим Объединить с помощью внешней программы. После этого будет выполнено основное обновление.

Если на этапе работы внешней программы вы не примите результат ее объединения для каких-то узлов, то будет снова открыт редактор сравнения объединения и на таких узлах появляется значок шестеренки с восклицательным знаком.

Редактор сравнения и объединения конфигураций

Этот редактор позволяет вам просматривать отличия одной конфигурации от другой, отмечать объекты и свойства, которые следует (или, наоборот, не следует) перенести в главную конфигурацию, и выполнять объединение двух конфигураций. Также из этого редактора можно вызвать редактор сравнения и объединения текстовых файлов (подробнее) — с его помощью можно для каждого модуля в отдельности выполнить сравнение и при необходимости отредактировать текст, который должен получиться в результате объединения двух модулей.

Условные обозначения
  • — флажок объединения установлен. Означает, что узел и все его потомки будут участвовать в процедуре объединения в соответствии со своими правилами объединения;
  • — флажок объединения снят. Означает, что узел и все его потомки не будут участвовать в процедуре объединения и останутся без изменений;
  • — Флажок объединения установлен частично. Означает, что среди потомков есть узлы как с установленными, так и со снятыми флажками. Узлы с установленными флажками будут участвовать в процедуре объединения, а узлы со снятыми флажками останутся без изменений.

Редактор сравнения и объединения модулей

Редактор сравнения и объединения текстовых файлов позволяет вам сравнивать содержимое двух модулей и объединять его.

Редактор состоит из трех областей. Слева находится главный источник, справа — второй источник, а посередине — результат объединения.

Этот редактор вызывается для сравнения и объединения модулей, которые присутствуют в редакторе сравнения и объединения конфигураций. Чтобы открыть этот редактор, нажмите "шестеренку" в строке Модуль.

Редактор сравнения и объединения текстовых файлов можно использовать, например, для сравнения двух общих модулей. Также мы интегрировали его в редактор сравнения и объединения конфигураций, поэтому при сравнении модулей будет также использоваться этот редактор.

Можно выбирать разные стратегии сравнения и объединения. Набор этих стратегий расширяемый, поэтому при желании можно реализовать собственную стратегию.

Анализируя изменения, можно переходить по блокам изменений, можно принудительно переносить изменения слева и справа в результат, а также редактировать результат вручную.

Можно сравнивать любые две области попарно в отдельном диалоге.

Можно отключать и включать синхронную прокрутку всех трех областей — как горизонтально, так и вертикально.

Панель сравнения файлов

Панель сравнения файлов позволяет вам сравнивать текстовое содержимое двух файлов.

Она может быть открыта при синхронизации локального и удаленного хранилища для просмотра отличий в модулях. Также она может быть открыта для просмотра отличий разных версий одного модуля в локальном хранилище.

Кроме того, можно с ее помощью сравнивать содержимое файлов метаданных и других объектов, хранящихся в формате XML.

В этой панели реализован встроенный в 1C:EDT механизм сравнения файлов. Его преимущество заключается в том, что он учитывает семантику и может определять перемещение фрагментов кода (процедур и функций). Например, можно включить показ изменения порядка , и тогда станет видно, что процедура ПриСозданииНаСервере() изменила свое местоположение в модуле.

Кроме этого, можно группировать соответствия , что облегчает восприятие изменений в нескольких соседних строках: без группировки (верхний рисунок) и с группировкой (нижний рисунок).

Группа параметров «Сравнение и объединение»

Группа параметров Сравнение и объединение позволяет вам выбрать способ сравнения модулей: с учетом их структуры или без учета.

Открыть группу параметров «Сравнение и объединение»

Нажмите Окно > Параметры... > V8 > Сравнение и объединение.

Группа параметров «Внешние программы»

Группа параметров Внешние программы позволяет вам настроить то, какие внешние программы и каким образом будут использоваться для сравнения модулей.

Открыть группу параметров «Внешние программы»

Нажмите Окно > Параметры... > V8 > Сравнение и объединение > Внешние программы.