Что изменилось в расширении: разбор различий между версиями .cfe

· 10 мин

Содержание

Сравнить расширения 1С проще всего в Конфигураторе: Конфигурация → Расширения конфигурации, выделить расширение, открыть его меню Конфигурация и выбрать Сравнить, объединить с конфигурацией из файла — там указывают второй файл .cfe. Платформа покажет дерево объектов с отметками различий и сравнение модулей построчно. Если нужен анализ истории, ревью кода или сравнение без запуска Конфигуратора, расширение выгружают в XML-файлы и сравнивают обычной diff-утилитой или через Git.

Какой метод выбрать, зависит от задачи. Быстро понять, чем файл подрядчика отличается от того, что стоит в базе, — встроенное сравнение. Найти, кто и когда поменял одну строку в модуле, — Git и XML-выгрузка. Регулярно контролировать, что расширение не разошлось с типовой после обновления, — проверка применимости и автоматический прогон в CI.

МетодКогда подходитОграничения
Окно сравнения в КонфигуратореРазовая проверка двух версий, перенос измененийНужна база с расширением, сложно сохранить историю
Отчёт о сравненииНужен документ для заказчика или ревьюТекстовый, без подсветки кода
XML-выгрузка + diff-утилитаРевью кода, сравнение между базамиМного служебных файлов, нужен навык чтения XML
Git и CIПостоянная разработка, команда из 2+ человекТребует настройки один раз

Подготовка к сравнению расширений

Встроенное сравнение работает только с двумя «контейнерами» одного типа: расширение в базе против файла .cfe или расширение в базе против его же версии, применённой к базе данных. Поэтому сначала соберите оба варианта.

Откуда берутся версии для сравнения:

  • 📦 Файл от разработчика или подрядчика — обычный .cfe.
  • 🗄 Текущая версия из рабочей базы — в Конфигураторе: окно расширений, меню Конфигурация → Сохранить конфигурацию в файл. Файл получит расширение .cfe.
  • 🧩 Версия из режима Предприятия — Все функции → Стандартные → Управление расширениями конфигурации, команда сохранения в файл. В Бухгалтерии 3.0 то же доступно через Администрирование → Печатные формы, отчеты и обработки → Расширения.
  • 🕓 Старая версия из хранилища — если расширение подключено к хранилищу конфигурации, любую версию можно получить из истории хранилища.

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

Ещё один нюанс до начала. Платформа сопоставляет объекты по внутренним идентификаторам, а не по именам. Если подрядчик не дорабатывал ваше расширение, а создал новое с тем же именем с нуля, все объекты будут показаны как «новые» и «удалённые». В таком случае полезнее сравнивать выгрузку в XML по именам файлов (см. раздел про diff-утилиты) или включать в окне объединения сопоставление по именам, если платформа его предлагает.

Сравнение расширений в Конфигураторе: пошагово

Основной сценарий — у вас расширение в базе и новый файл .cfe, нужно понять разницу.

  1. Откройте базу в режиме Конфигуратора.
  2. Меню Конфигурация → Расширения конфигурации. Откроется список расширений.
  3. Выделите нужное и откройте его дерево (двойной щелчок или кнопка открытия).
  4. В окне списка расширений нажмите меню Конфигурация и выберите Сравнить, объединить с конфигурацией из файла.
  5. Укажите второй файл .cfe.
  6. Дождитесь построения дерева сравнения.

В дереве каждый объект помечен. Изменённые объекты подсвечены, у новых и удалённых — свои значки. Удобнее всего включить отбор, который скрывает совпадающие объекты: на панели окна есть флажок показа только различий. В крупном расширении он сокращает дерево с сотен строк до десятка.

Как посмотреть различия в модуле

Дважды щёлкните по модулю в дереве или вызовите на нём контекстное меню и выберите показ различий в модулях. Откроется окно с двумя колонками кода. Удалённые, добавленные и изменённые строки подсвечены разными цветами.

💡 Длинный модуль удобнее листать по различиям, а не прокруткой: в окне сравнения модулей есть переход к следующему и предыдущему различию.

Сравнение с версией базы данных

Частая ситуация: разработчик поправил расширение в Конфигураторе, но не обновил конфигурацию базы данных. Чтобы увидеть, что именно ждёт применения, используйте Конфигурация → Сравнить конфигурации в меню расширения. В качестве сторон выберите редактируемое расширение и расширение базы данных.

Отчёт о сравнении

Когда изменения нужно показать заказчику или приложить к задаче, сформируйте отчёт прямо из окна сравнения. Команда отчёта есть в меню Действия окна. Отчёт бывает кратким (только список объектов) и подробным (с текстом изменений модулей). Его можно сохранить в текстовый файл или табличный документ.

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

Внешние diff-утилиты: как сравнить выгрузки расширений в XML

Файл .cfe — двоичный контейнер, сравнивать его напрямую текстовыми утилитами бессмысленно. Сначала расширение раскладывают на файлы.

Выгрузка вручную: в окне расширений меню Конфигурация → Выгрузить конфигурацию в файлы. Выберите пустую папку и формат иерархической выгрузки. Каждый объект ляжет отдельным XML, а модули — отдельными файлами .bsl.

Выгрузка из командной строки, без открытия Конфигуратора:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F "D:\Bases\Copy" /N "Администратор" /P "" /DumpConfigToFiles "D:\Compare\v_new" -Extension "МоеРасширение" /Out "D:\Compare\dump.log"

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

После этого сравните папки любым средством:

  • 🟢 WinMerge — бесплатно, сравнение каталогов и файлов, удобно для разовых задач.
  • 🟢 KDiff3 — бесплатно, хорошо работает с трёхсторонним слиянием.
  • 🔵 Beyond Compare — платная, сильные фильтры и правила для XML.
  • ⚙️ Git — без установки отдельного интерфейса:
git diff --no-index --stat D:/Compare/v_old D:/Compare/v_new
git diff --no-index D:/Compare/v_old/CommonModules D:/Compare/v_new/CommonModules

Первая команда даёт сводку по файлам, вторая — построчные различия в общих модулях.

Как читать выгрузку и не утонуть в шуме

  • 📄 Код модулей лежит в файлах .bsl в подпапках Ext — начинайте с них.
  • 🧾 Корневой файл Configuration.xml хранит свойства расширения: имя, версию, назначение, режим совместимости.
  • 🔐 Права ролей — в файлах Roles/<ИмяРоли>/Ext/Rights.xml.
  • 🔀 Порядок элементов в XML иногда меняется после пересохранения без реальных изменений. Если diff показывает сотни строк в формах при одной правке в коде — это шум перестановки, а не работа подрядчика.

Есть и утилиты распаковки .cfe без платформы, например открытый v8unpack. Они полезны, когда 1С под рукой нет, но выгрузка самой платформой надёжнее: формат одинаковый с тем, что видит Конфигуратор.

Сравнение расширения с основной конфигурацией: проверка применимости

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

Что ломается чаще всего:

  • 🔧 Методы с аннотацией &ИзменениеИКонтроль (появилась в платформе 8.3.16). Платформа сверяет текст исходной процедуры с тем, что лежит в расширении. Если в типовой поменялась хотя бы строка, расширение не применяется — нужно перенести изменения заново.
  • 🏷 Контролируемые свойства заимствованных объектов. Если у заимствованного объекта включён контроль свойства и оно изменилось в основной конфигурации, применить расширение не получится.
  • 🗑 Удалённые или переименованные объекты. Обработчик с &Перед, &После или &Вместо ссылается на процедуру, которой больше нет.

Проверку запускают из Конфигуратора: в меню расширения есть команда проверки применимости. Платформа выдаёт список проблем с указанием объектов. Работайте по нему сверху вниз.

Для методов с &ИзменениеИКонтроль пригодится сравнение: откройте процедуру в расширении, сравните её тело с актуальной процедурой основной конфигурации и перенесите блоки между директивами #Вставка … #КонецВставки и #Удаление … #КонецУдаления на новый текст.

&ИзменениеИКонтроль("ПередЗаписью")
Процедура МоеРасш_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	// исходный текст типовой процедуры
	#Вставка
	Если Не ЗначениеЗаполнено(Комментарий) Тогда
		Комментарий = "Создан из расширения";
	КонецЕсли;
	#КонецВставки
	// продолжение исходного текста
КонецПроцедуры

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

Роли, права и свойства расширения: что сравнивать кроме кода

Различия в коде видны сразу, а изменения прав часто пропускают. Между тем именно они дают пользователям доступ к тому, чего быть не должно.

На что смотреть:

ЧтоГде в КонфигуратореГде в XML-выгрузке
Новые роли расширенияВетка Общие → Роли в дереве сравненияПапка Roles
Права в заимствованных роляхТа же ветка, отмечены как изменённыеRoles/<Имя>/Ext/Rights.xml
Назначение (исправление, адаптация, дополнение)Свойства корня расширенияConfiguration.xml
Версия и режим совместимостиСвойства корня расширенияConfiguration.xml
Новые реквизиты и табличные частиВетки объектов в деревеXML объекта, блок реквизитов

Свойства, которых нет в файле

Часть настроек живёт не в .cfe, а в самой базе. Это признак активности, флаг безопасного режима и защиты от опасных действий. Они задаются в форме управления расширениями в режиме Предприятия. Сравнение файлов их не покажет — сверяйте их отдельно, открыв список расширений в обеих базах.

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

Изменение структуры данных

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

Автоматизация: сравнение расширений в Git и CI

Когда расширение дорабатывают несколько человек, ручное сравнение быстро перестаёт работать. Решение — хранить выгрузку в XML в Git и сравнивать версии автоматически.

Типичная схема:

  1. Исходники расширения хранятся в Git в формате XML-выгрузки Конфигуратора или в формате проекта 1С:EDT.
  2. Каждая правка идёт отдельной веткой и запросом на слияние.
  3. Сервер сборки (GitLab CI, Jenkins, TeamCity) по запросу на слияние собирает .cfe, загружает его в тестовую базу и запускает проверку.
  4. Ревьюер видит различия в веб-интерфейсе Git — с подсветкой, комментариями к строкам и историей.

Инструменты, которые используют в сообществе 1С:

  • 🧰 vanessa-runner — набор скриптов на OneScript для сборки, загрузки расширений и запуска тестов из командной строки.
  • 🔁 gitsync — перенос истории хранилища конфигурации в Git, если команда пока работает через хранилище.
  • 🔎 BSL Language Server с SonarQube — статический анализ кода модулей: находит ошибки и нарушения стандартов на каждом коммите.
  • 🧪 Vanessa Automation — сценарные тесты интерфейса после загрузки новой версии.

Минимальный шаг для сборки в CI — загрузка расширения из файлов и обновление базы данных. Это два отдельных действия:

1cv8.exe DESIGNER /F "D:\Bases\Test" /LoadConfigFromFiles "D:\Repo\src\ext" -Extension "МоеРасширение"
1cv8.exe DESIGNER /F "D:\Bases\Test" /UpdateDBCfg -Extension "МоеРасширение"

Если загрузка прошла, а обновление упало с ошибкой — расширение несовместимо с текущей конфигурацией базы. Это тот же сигнал, что и при ручной проверке применимости, только без участия человека.

💡 Добавьте в репозиторий файл .gitattributes с указанием кодировки для .bsl и .xml. Тогда diff в веб-интерфейсе не будет показывать кракозябры в русских комментариях.

Перед переносом новой версии расширения в рабочую базу
Выполнено: 0 / 6

Частые вопросы о сравнении расширений

Можно ли сравнить два расширения с разными именами?
Да. Встроенное сравнение с файлом не требует совпадения имён. Но если расширения создавались независимо, объекты не сопоставятся по идентификаторам. Тогда надёжнее выгрузить оба в XML и сравнить папки diff-утилитой.
Как сравнить расширение в двух разных базах?
Сохраните расширение из каждой базы в файл .cfe. Затем откройте одну из баз в Конфигураторе и сравните её расширение с файлом из второй. Флаги безопасного режима и активности сверяйте отдельно — их в файле нет.
Почему сравнение показывает изменения в формах, хотя их никто не трогал?
Чаще всего форму пересохранили в другой версии платформы или в 1С:EDT, и поменялся порядок служебных элементов. Посмотрите, есть ли различия в элементах и командах. Если меняются только идентификаторы и порядок, это шум.
Видно ли при сравнении, какая версия платформы нужна расширению?
Косвенно — через режим совместимости в свойствах корня. Если в новой версии он выше, расширение не загрузится в базу на более старой платформе.
Нужен ли монопольный режим для сравнения?
Для самого сравнения нет. Монопольный доступ понадобится, только если после сравнения вы применяете изменения и расширение меняет структуру данных.