1С предоставила возможность разработчикам использовать сторонние утилиты для сравнения.
Рассмотрим в качестве утилиты WinMerge. Утилита бесплатная, с открытым исходным кодом и поддержкой синтаксиса различных языков (язык 1С пока не поддерживается, но кто знает).
Настройка WinMerge
К сожалению, 1С не предлагает использование WinMerge, как внешнюю программу сравнения по умолчанию, поэтому настройку нужно выполнить вручную
Для этого в соответствующем разделе добавляем новую программу для сравнения и указываем следующие настройки
Сравнение двух файлов: /e /u /dl %baseCfgTitle /dr %secondCfgTitle %baseCfg %secondCfg Объединение двух файлов: /e /u /dl %baseCfgTitle /dr %secondCfgTitle %baseCfg %secondCfg /o %merged Трехстороннее объединение: /e /u /fr /dl %oldVendorCfgTitle /dm %baseCfgTitle /dr %secondCfgTitle %oldVendorCfg %baseCfg %secondCfg /o %merged Автоматическое трехстороннее объединение: /e /u /fm /dl %baseCfgTitle /dm %oldVendorCfgTitle /dr %secondCfgTitle %oldVendorCfg %baseCfg %secondCfg /o %merged /am
Настройка внешней программы
Чтобы распробовать WinMerge рекомендую сначала настроить использование WinMerge как внешней программы, а когда освоитесь, то как основной программы для сравнения.
При такой настройке, для запуска WinMerge выбрать режим объединения "Объединить с помощью внешней программы", а затем на шестеренку.
Сравнение модулей
WinMerge сравнивает модули как текстовые файлы, без учета структуры. Иногда это может вызывать определенные сложности. Например, при массовом переносе функций по тексту.
Из больших плюсов WinMerge отмечу то, как WinMerger выделяет различия в пропущенных строках: он выделяет их отдельными строкам, так что текст визуально совпадает по размеру. На мой взгляд - это удобнее, чем в других сравнивалках текстов (P4Merge, например).
Коротко об интерфейсе WinMerge
- Слева с краю расположена панель навигации(Location Pane). В панели помечаются выявленные различия по всему тексту. Об этой панели поговорим ниже. Забегая вперед отмечу, что эта панель основной рабочий инструмент при обновлении
- Левое окно кода - содержит основной код модуля, здесь же результирующий код модуля. При сохранении текст из этого окна вернется в конфигуратор.
- Правок окно кода - содержит код с которым сравниваем. Данный текст так же можно редактировать, но результат никуда не пойдет.
- Панель внизу - детальное сравнение выделенных строк. Удобнее сравнивать, когда оно отключено.
- Строки, которых нет в одной части выделены серым. Такие строки нельзя скопировать, они для визуального выделения пропусков.
- Строки с различиями выделены оранжевым
- Найденные различия выделены красным
- Цветовую схему можно изменить в настройках
- В настройках можно включить/выключить сравнение учитывая пробелы и регистр.
- Для переноса строк в нужную часть можно воспользоваться кнопками сверху или горячими клавишами (Например, Alt+Влево - перенесет текст из правого окна в левое)
- Для возврата кода в 1С достаточно сохранить текст(Ctrl+S) и закрыть WinMerge.
Трехстороннее объединение
Трехстороннее сравнение - это замечательная опция, которая появляется при использовании внешней программы для сравнения. Позволяет сравнить сразу три кода:
- Слева - Старый код поставщика
- Центр - Основной код конфигурации(с изменениями). Результирующий код
- Справа - Новый код поставщика
При таком сравнении можно сразу увидеть какие измерения сделал поставщик и понять нужно ли вносить в основной код какие-либо правки.
Дополнительным бонусом является возможность трехстороннего сравнения измененных функций в расширениях с типом вызова "ИзменениеИКонтроль".
Например, на скрине ниже сравнение модуля обработки.
В панели навигации(Location Pane) видны участки кода, которые были изменены при внедрении. Видны изменения которые сделал поставщик, и проблемные участки кода. Детальное описание Location Pane ниже.
Задача - перенести код из правой колонки в центральную.
Делать это можно как построчно, так и выделив блок кода, затем нажав на сочетание Alt+Влево
Можно копировать и вставлять блоки кода(простой копипастой).
На скрине выше отмечены области которые можно оставить в коде. Остальные блоки, выделить перенести не погружаясь в анализ.
Я выделяю код в правой панели ткнув в белый участок, затем, зажав Shift и используя скрол мыши добираюсь до участка кода, который нужно оставить или как-то обработать. Затем нажимаю Alt+Влево. Весь выделенный фрагмент переносится в результат.
Использование Location pane
Важнейшая фича WinMerge, которая помогает при трехстороннем обновлении - это панель навигации по коду, Location pane.
Location Pane отображает все различия, которые есть в коде. По цветовым маркерам в Location Pane можно определить какие места в коде требуют детального рассмотрения, а какие можно объединить, не погружаясь в анализ различий.
На Location Pane видим три столбика в которых цветами выделяются различия кода. Три столбика соответствуют трем окнам. Так же цветом выделяются области между столбиками.
Наибольшую полезность представляют именно эти отметки между колонок.
Пояснение по цветовым выделениям в WinMerge
Все описания в цветовой схеме по умолчанию
- Серым - выделен отсутствующий блок кода
- Бирюзовым (в области между колонок) - Когда блок кода присутствует только в основной конфигурации. Например, когда сделана доработка кода. Но данного блока нет ни в старой, ни в новой конфигурации поставщика
- Оранжевый - Код присутствует, и имеет какое-то отличие от остальных конфигураций. Оранжевым отмечаются все различия. Это цвет по умолчанию для WinMerge.
- Бледно желтый (в коде) - Код поставщика совпадает с кодом основной конфигурации.
- Если выделена левая колонка, то основной код совпадает со старым кодом поставщика, но не совпадает с новым кодом. Доработок не было, и в этом случае нужно перенести новый код поставщика.
- Если выделена правая колонка, то новый код поставщика совпадает с результатом. Делать ничего не нужно
- Желтый (в области между колонок) - Показывает, что основной код с одной стороны совпадает с кодом поставщика с другой отличается. Используется совместно с бледно желтым
- Красный (в области между колонок) - WinMerge не смог сопоставить старый код поставщика, основной и новый код. Так бывает, например, в случае, когда в правки в код были в внесены в те же строки которые изменились в новой конфигурации поставщика.
Все отметки красного цвета нужно объединять внимательно. - Коричневый - Перенос строк. WinMerge подсказывает что некоторые блоки были не просто удалены, но перенесены в другое место. Есть возможность быстрого перехода к участку текста куда перенесен блок кода(Через правую кнопку мыши).
К сожалению, нет возможности быстро перенести перемещенные блоки и отсутствует простая возможность сверки, что в перемещенном коде не сделали никаких изменений.
Мне помогает небольшая хитрость: чтобы понять, что изменилось в коде, переношу в блок в старом коде поставщика, в то же место, куда его перенесли в новом, и проделываю эту же операцию с основным кодом. В этом случае возвращается возможность сравнения.
Резюме
Благодаря панели навигации, трехстороннее сравнение позволяет серьезно сократить время необходимое для обновления модулей конфигурации.
На наших проектах сократили время обновления конфигурации в несколько раз.
Большой бонус - это возможность трехстороннего сравнения импортированных модулей в расширения. Конфигуратор 1С не предоставляет такой опции.
Возможно, в будущем в WinMerge появится подсветка синтаксиса кода 1C
П.С. Напишите комментарии, если нужно дополнить статью примерами сравнения.