Сравнение расширений конфигурации: код, роли и конфликты
Содержание
Два расширения 1С сравнивают в Конфигураторе: одно открывают из списка Конфигурация → Расширения конфигурации, второе подают файлом .cfe через команду сравнения с конфигурацией из файла. Для глубокого анализа кода удобнее выгрузить оба расширения в XML-файлы и сравнить каталоги любым diff-инструментом или через Git.
Такой подход закрывает три типичные задачи: понять, чем новая версия доработки отличается от старой, найти разницу между копиями в двух базах и выяснить, не мешают ли два расширения друг другу. Описание относится к платформе 8.3 и интерфейсу «Такси».
1. Подготовка расширений и файлов к сравнению
Сначала решите, что именно с чем сравниваете. От этого зависит, где брать исходники.
| Ситуация | Что берём | Где взять |
|---|---|---|
| Две версии одной доработки | Два файла .cfe | Выгрузка из баз или от разработчика |
| Расширение в рабочей и тестовой базе | Расширение из базы + файл | Конфигуратор каждой базы |
| Два разных расширения в одной базе | Оба из одной базы | Список расширений Конфигуратора |
| Ревью кода перед выкладкой | XML-выгрузка обоих | Пакетный режим или Конфигуратор |
Как получить файл .cfe
📌 В Конфигураторе: Конфигурация → Расширения конфигурации, выделите расширение, откройте его и в меню окна расширения выберите команду сохранения в файл. Получится файл с расширением .cfe.
📌 Без Конфигуратора, в режиме Предприятия: в типовых конфигурациях на БСП список подключённых расширений открывается в Администрирование → Печатные формы, отчеты и обработки → Расширения. Оттуда расширение можно сохранить в файл. Это удобно, когда доступа к Конфигуратору клиентской базы нет.
Что зафиксировать заранее
Перед сравнением выпишите по каждому расширению:
- 🔹 имя и версию (свойства расширения);
- 🔹 назначение: «Исправление», «Адаптация» или «Дополнение»;
- 🔹 режим совместимости;
- 🔹 флаги «Безопасный режим» и «Защита от опасных действий»;
- 🔹 префикс имён;
- 🔹 версию платформы, в которой расширение собрано.
Расхождение в режиме совместимости или флаге безопасного режима само по себе объясняет многие «загадочные» отличия в поведении. Его видно сразу, без построчного анализа.
Работайте с копией базы. Сравнение ничего не меняет, но рядом с ним лежит команда объединения, и одно случайное нажатие «Выполнить» в рабочей базе превращает анализ в правку.
2. Сравнение расширений штатными средствами Конфигуратора
Штатное окно сравнения — тот же механизм, что для основной конфигурации. Отличие в типе источника: «Расширение конфигурации » вместо «Конфигурации».
Расширение из базы против файла
- Откройте
Конфигурация → Расширения конфигурации. - Выделите первое расширение и откройте его дерево.
- В меню окна расширения выберите сравнение и объединение с конфигурацией из файла.
- Укажите
.cfeвторого расширения. - Изучите дерево различий. Кнопку «Выполнить» не нажимайте: она запускает объединение. Нужен только отчёт — закройте окно без выполнения.
Режим «Сравнить конфигурации»
Через пункт сравнения конфигураций можно выбрать оба источника вручную: слева расширение из базы, справа файл расширения. Это чистый режим анализа, без объединения.
В окне результата:
- 🟢 зелёным и знаком «+» отмечены объекты, которые есть только с одной стороны;
- 🟡 изменённые объекты подсвечены и раскрываются до свойства, модуля, формы;
- 🔍 фильтр «Показывать только различия» убирает совпадающие ветки.
Сопоставление по именам или по идентификаторам
Это главный подводный камень. Каждый объект метаданных имеет внутренний идентификатор (UUID).
- Две версии одного расширения, которые развивались из общего исходника, корректно сравниваются по идентификаторам.
- Два независимо созданных расширения с одинаково названными объектами сравнивайте по именам. Иначе окно покажет, что все объекты удалены и добавлены заново, хотя внутри они почти одинаковы.
Если отчёт показывает «всё удалено, всё добавлено» — переключите правило сопоставления на имена объектов.
Отчёт о сравнении
Из окна сравнения формируется отчёт. Выберите подробный вариант, если нужен текст изменений модулей, или краткий — для списка затронутых объектов. Отчёт можно сохранить в файл и приложить к задаче.
3. Анализ кода и модулей в двух расширениях
Изменённые модули в дереве сравнения открываются двойным щелчком. Конфигуратор показывает два текста рядом с подсветкой вставленных, удалённых и изменённых строк.
На что смотреть в первую очередь
- Аннотации перехватов. В расширениях методы основной конфигурации перехватывают через
&Перед,&После,&Вместои&ИзменениеИКонтроль. Смена&Послена&Вместоменяет поведение сильнее, чем десяток строк кода. - Вызов
ПродолжитьВызов(). В методе с&Вместоон передаёт управление исходному методу. Пропал вызов — исходный код больше не выполняется. - Блоки
#Вставка/#Удалениев методах с&ИзменениеИКонтроль. Сравнивайте не только свои строки, но и окружающий типовой код: он контролируется, и после обновления основной конфигурации расширение может перестать применяться. - Модули форм. Обработчики событий формы в расширении тоже бывают с аннотациями — их легко пропустить, если смотреть только общие модули.
Быстрый список расширений в базе
Когда расширений много, удобно сначала снять их «паспорт» кодом. Выполните в консоли кода или во внешней обработке на сервере:
Расширения = РасширенияКонфигурации.Получить();
Для Каждого Расширение Из Расширения Цикл
Сообщить(СтрШаблон("%1 | версия %2 | назначение %3 | безопасный режим %4",
Расширение.Имя,
Расширение.Версия,
Расширение.Назначение,
Расширение.БезопасныйРежим));
КонецЦикла;
Совпали имя и версия, но поведение разное — значит, кто-то менял расширение без повышения версии. Тогда без сравнения содержимого не обойтись.
Окно сравнения Конфигуратора не показывает логику целиком: оно сравнивает тексты, а не порядок вызовов. Если два перехвата висят на одном методе в разных расширениях, по отдельности они могут выглядеть безобидно.
4. Сравнение ролей и прав доступа в расширениях
Роли в расширении бывают двух видов:
- 🧩 собственные — созданы в расширении, дают права на его объекты и при необходимости на заимствованные;
- 🔗 заимствованные — роли основной конфигурации, в которые расширение добавляет права на свои объекты.
При сравнении роли попадают в дерево как обычные объекты. Изменение прав видно в свойствах роли: раскройте её в окне сравнения и откройте детализацию различий прав. Платформа покажет, какие права на какие объекты добавились или пропали.
Что проверить по ролям
- Есть ли у новых объектов расширения права хотя бы в одной роли. Объект без прав пользователи просто не увидят.
- Не выданы ли лишние права — например, «Удаление» или «Администрирование» в собственной роли.
- Есть ли ограничения доступа на уровне записей (RLS) в заимствованных ролях и совпадают ли тексты ограничений.
- Включён ли в роли признак установки прав для новых объектов. Он влияет на то, получат ли права объекты, добавленные позже.
В типовых конфигурациях роль сама по себе пользователю ничего не даёт: права назначаются через профили групп доступа. Поэтому после сравнения ролей проверьте, включена ли новая роль в нужный профиль в режиме Предприятия.
5. Как найти конфликты и дублирование между расширениями
Это самая практичная часть: два расширения работают по отдельности, а вместе ломают друг друга. Типичные источники проблем — в таблице.
| Признак конфликта | Как обнаружить | Что делать |
|---|---|---|
| Оба расширения перехватывают один метод | Поиск аннотаций по имени метода в обоих XML | Объединить логику в одно расширение или согласовать порядок |
| Одинаковые имена собственных объектов | Сравнение по именам, список «только слева/справа» | Задать разные префиксы имён |
| Оба меняют одну форму | Заимствованная форма в обоих деревьях | Проверить, не удаляет ли одно элементы, на которые опирается другое |
| Разные режимы совместимости | Свойства расширений | Привести к режиму основной конфигурации |
| Контроль свойств заимствованных объектов | Ошибка при применении после обновления | Обновить расширение под новый релиз |
Порядок применения
Платформа применяет расширения с учётом назначения: сначала «Исправление», затем «Адаптация», затем «Дополнение». Внутри одного назначения важен порядок подключения. Когда два перехвата &Вместо висят на одном методе, они выстраиваются в цепочку, и до исходного метода она доходит только через ПродолжитьВызов() в каждом из них.
Если в одном из них ПродолжитьВызов() нет, второе расширение и типовой код молча выпадают из цепочки. Такой конфликт по отдельности в сравнении не виден — ищите его поиском по имени метода сразу в обоих расширениях.
Дублирование доработок
Частая история: исправление вынесли в отдельное расширение, а старое не почистили. В итоге одна и та же правка работает дважды.
- 🔁 Ищите одинаковые блоки кода в обоих расширениях — удобнее всего в XML-выгрузке через поиск по каталогу.
- 🔁 Сравнивайте списки заимствованных объектов: если оба расширения заимствуют один и тот же документ и его модуль объекта, это первый кандидат на дубль.
6. Пакетный режим, XML и сторонние инструменты
Когда сравнение нужно повторять регулярно, руками его делать неудобно.
Сравнение через пакетный режим Конфигуратора
Платформа умеет строить отчёт сравнения без интерфейса, командой /CompareCfg:
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F "D:\Bases\Test" /N "Администратор" /P "" ^
/CompareCfg -FirstConfigurationType ExtensionFile -FirstFile "D:\cmp\old.cfe" ^
-SecondConfigurationType ExtensionFile -SecondFile "D:\cmp\new.cfe" ^
-MappingRule ByObjectNames -ReportType Full -ReportFormat txt -ReportFile "D:\cmp\report.txt" ^
/Out "D:\cmp\log.txt"
Номер платформы в пути подставьте свой. Полный список значений параметров — в справке по командной строке, установленной вместе с платформой.
Выгрузка в XML и сравнение каталогов
Для ревью кода надёжнее работать с файлами:
1cv8.exe DESIGNER /F "D:\Bases\Test" /N "Администратор" /P "" /DumpConfigToFiles "D:\xml\ext_old" -Extension "МоёРасширение"
Ту же выгрузку можно сделать в Конфигураторе: в окне расширения есть команда выгрузки в файлы. Параметр -AllExtensions выгружает все расширения базы сразу.
Получившиеся каталоги сравнивают:
- 🛠 WinMerge, KDiff3, Beyond Compare — визуально, папка против папки;
- 🛠 Git — положите первую выгрузку в репозиторий, закоммитьте, замените файлы второй и выполните
git diff --stat, затемgit diffпо нужным модулям; - 🛠 1С:EDT — импортируйте оба расширения как проекты и используйте сравнение проектов; удобно, если команда уже работает в EDT.
Модули в XML-выгрузке лежат в файлах .bsl — обычный текст. Поиск конфликтующих перехватов сводится к поиску строки &Вместо("ИмяМетода") по двум каталогам.
Когда что выбирать
7. Ошибки, из-за которых сравнение врёт
❌ Сравнение по идентификаторам двух независимых расширений. Весь отчёт состоит из «удалён/добавлен». Лечится правилом сопоставления по именам.
❌ Выполнили объединение вместо сравнения. Окно объединения внешне похоже на окно сравнения. Если изменения уже применились — не сохраняйте конфигурацию расширения и не обновляйте её в базе, закройте без сохранения.
❌ Сравнили файл со старым состоянием базы. Расширение в Конфигураторе отредактировали, но не обновили в базе. Окно сравнения показывает одну картину, пользователи работают с другой.
❌ Смотрели только общие модули. Перехваты обработчиков форм и модулей менеджеров остались вне поля зрения.
❌ Не учли разные версии платформы. Файл, сохранённый более новой платформой, может не открыться в старой. Сравнивайте в платформе с номером не ниже той, в которой собирали оба расширения.