Что изменилось в расширении: разбор различий между версиями .cfe
Содержание
Сравнить расширения 1С проще всего в Конфигураторе: Конфигурация → Расширения конфигурации, выделить расширение, открыть его меню Конфигурация и выбрать Сравнить, объединить с конфигурацией из файла — там указывают второй файл .cfe. Платформа покажет дерево объектов с отметками различий и сравнение модулей построчно. Если нужен анализ истории, ревью кода или сравнение без запуска Конфигуратора, расширение выгружают в XML-файлы и сравнивают обычной diff-утилитой или через Git.
Какой метод выбрать, зависит от задачи. Быстро понять, чем файл подрядчика отличается от того, что стоит в базе, — встроенное сравнение. Найти, кто и когда поменял одну строку в модуле, — Git и XML-выгрузка. Регулярно контролировать, что расширение не разошлось с типовой после обновления, — проверка применимости и автоматический прогон в CI.
| Метод | Когда подходит | Ограничения |
|---|---|---|
| Окно сравнения в Конфигураторе | Разовая проверка двух версий, перенос изменений | Нужна база с расширением, сложно сохранить историю |
| Отчёт о сравнении | Нужен документ для заказчика или ревью | Текстовый, без подсветки кода |
| XML-выгрузка + diff-утилита | Ревью кода, сравнение между базами | Много служебных файлов, нужен навык чтения XML |
| Git и CI | Постоянная разработка, команда из 2+ человек | Требует настройки один раз |
Подготовка к сравнению расширений
Встроенное сравнение работает только с двумя «контейнерами» одного типа: расширение в базе против файла .cfe или расширение в базе против его же версии, применённой к базе данных. Поэтому сначала соберите оба варианта.
Откуда берутся версии для сравнения:
- 📦 Файл от разработчика или подрядчика — обычный
.cfe. - 🗄 Текущая версия из рабочей базы — в Конфигураторе: окно расширений, меню
Конфигурация → Сохранить конфигурацию в файл. Файл получит расширение.cfe. - 🧩 Версия из режима Предприятия —
Все функции → Стандартные → Управление расширениями конфигурации, команда сохранения в файл. В Бухгалтерии 3.0 то же доступно черезАдминистрирование → Печатные формы, отчеты и обработки → Расширения. - 🕓 Старая версия из хранилища — если расширение подключено к хранилищу конфигурации, любую версию можно получить из истории хранилища.
Сравнивайте на копии базы, а не в рабочей. Окно сравнения легко превращается в окно объединения: одна лишняя галочка и кнопка Выполнить — и чужие изменения уже внутри расширения.
Ещё один нюанс до начала. Платформа сопоставляет объекты по внутренним идентификаторам, а не по именам. Если подрядчик не дорабатывал ваше расширение, а создал новое с тем же именем с нуля, все объекты будут показаны как «новые» и «удалённые». В таком случае полезнее сравнивать выгрузку в XML по именам файлов (см. раздел про diff-утилиты) или включать в окне объединения сопоставление по именам, если платформа его предлагает.
Сравнение расширений в Конфигураторе: пошагово
Основной сценарий — у вас расширение в базе и новый файл .cfe, нужно понять разницу.
- Откройте базу в режиме Конфигуратора.
- Меню
Конфигурация → Расширения конфигурации. Откроется список расширений. - Выделите нужное и откройте его дерево (двойной щелчок или кнопка открытия).
- В окне списка расширений нажмите меню
Конфигурацияи выберитеСравнить, объединить с конфигурацией из файла. - Укажите второй файл
.cfe. - Дождитесь построения дерева сравнения.
В дереве каждый объект помечен. Изменённые объекты подсвечены, у новых и удалённых — свои значки. Удобнее всего включить отбор, который скрывает совпадающие объекты: на панели окна есть флажок показа только различий. В крупном расширении он сокращает дерево с сотен строк до десятка.
Как посмотреть различия в модуле
Дважды щёлкните по модулю в дереве или вызовите на нём контекстное меню и выберите показ различий в модулях. Откроется окно с двумя колонками кода. Удалённые, добавленные и изменённые строки подсвечены разными цветами.
💡 Длинный модуль удобнее листать по различиям, а не прокруткой: в окне сравнения модулей есть переход к следующему и предыдущему различию.
Сравнение с версией базы данных
Частая ситуация: разработчик поправил расширение в Конфигураторе, но не обновил конфигурацию базы данных. Чтобы увидеть, что именно ждёт применения, используйте Конфигурация → Сравнить конфигурации в меню расширения. В качестве сторон выберите редактируемое расширение и расширение базы данных.
Отчёт о сравнении
Когда изменения нужно показать заказчику или приложить к задаче, сформируйте отчёт прямо из окна сравнения. Команда отчёта есть в меню Действия окна. Отчёт бывает кратким (только список объектов) и подробным (с текстом изменений модулей). Его можно сохранить в текстовый файл или табличный документ.
Подробный отчёт по большому расширению получается длинным. Для письма заказчику хватит краткого, а подробный оставьте для ревьюера.
Внешние 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 и сравнивать версии автоматически.
Типичная схема:
- Исходники расширения хранятся в Git в формате XML-выгрузки Конфигуратора или в формате проекта 1С:EDT.
- Каждая правка идёт отдельной веткой и запросом на слияние.
- Сервер сборки (GitLab CI, Jenkins, TeamCity) по запросу на слияние собирает
.cfe, загружает его в тестовую базу и запускает проверку. - Ревьюер видит различия в веб-интерфейсе 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 в веб-интерфейсе не будет показывать кракозябры в русских комментариях.
Частые вопросы о сравнении расширений
Можно ли сравнить два расширения с разными именами?
Как сравнить расширение в двух разных базах?
.cfe. Затем откройте одну из баз в Конфигураторе и сравните её расширение с файлом из второй. Флаги безопасного режима и активности сверяйте отдельно — их в файле нет.