Сравнение расширений конфигурации: код, роли и конфликты

· 9 мин

Содержание

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

Такой подход закрывает три типичные задачи: понять, чем новая версия доработки отличается от старой, найти разницу между копиями в двух базах и выяснить, не мешают ли два расширения друг другу. Описание относится к платформе 8.3 и интерфейсу «Такси».

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

Сначала решите, что именно с чем сравниваете. От этого зависит, где брать исходники.

СитуацияЧто берёмГде взять
Две версии одной доработкиДва файла .cfeВыгрузка из баз или от разработчика
Расширение в рабочей и тестовой базеРасширение из базы + файлКонфигуратор каждой базы
Два разных расширения в одной базеОба из одной базыСписок расширений Конфигуратора
Ревью кода перед выкладкойXML-выгрузка обоихПакетный режим или Конфигуратор

Как получить файл .cfe

📌 В Конфигураторе: Конфигурация → Расширения конфигурации, выделите расширение, откройте его и в меню окна расширения выберите команду сохранения в файл. Получится файл с расширением .cfe.

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

Что зафиксировать заранее

Перед сравнением выпишите по каждому расширению:

  • 🔹 имя и версию (свойства расширения);
  • 🔹 назначение: «Исправление», «Адаптация» или «Дополнение»;
  • 🔹 режим совместимости;
  • 🔹 флаги «Безопасный режим» и «Защита от опасных действий»;
  • 🔹 префикс имён;
  • 🔹 версию платформы, в которой расширение собрано.

Расхождение в режиме совместимости или флаге безопасного режима само по себе объясняет многие «загадочные» отличия в поведении. Его видно сразу, без построчного анализа.

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

2. Сравнение расширений штатными средствами Конфигуратора

Штатное окно сравнения — тот же механизм, что для основной конфигурации. Отличие в типе источника: «Расширение конфигурации » вместо «Конфигурации».

Расширение из базы против файла

  1. Откройте Конфигурация → Расширения конфигурации.
  2. Выделите первое расширение и откройте его дерево.
  3. В меню окна расширения выберите сравнение и объединение с конфигурацией из файла.
  4. Укажите .cfe второго расширения.
  5. Изучите дерево различий. Кнопку «Выполнить» не нажимайте: она запускает объединение. Нужен только отчёт — закройте окно без выполнения.

Режим «Сравнить конфигурации»

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

В окне результата:

  • 🟢 зелёным и знаком «+» отмечены объекты, которые есть только с одной стороны;
  • 🟡 изменённые объекты подсвечены и раскрываются до свойства, модуля, формы;
  • 🔍 фильтр «Показывать только различия» убирает совпадающие ветки.

Сопоставление по именам или по идентификаторам

Это главный подводный камень. Каждый объект метаданных имеет внутренний идентификатор (UUID).

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

Если отчёт показывает «всё удалено, всё добавлено» — переключите правило сопоставления на имена объектов.

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

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

3. Анализ кода и модулей в двух расширениях

Изменённые модули в дереве сравнения открываются двойным щелчком. Конфигуратор показывает два текста рядом с подсветкой вставленных, удалённых и изменённых строк.

На что смотреть в первую очередь

  1. Аннотации перехватов. В расширениях методы основной конфигурации перехватывают через &Перед, &После, &Вместо и &ИзменениеИКонтроль. Смена &После на &Вместо меняет поведение сильнее, чем десяток строк кода.
  2. Вызов ПродолжитьВызов(). В методе с &Вместо он передаёт управление исходному методу. Пропал вызов — исходный код больше не выполняется.
  3. Блоки #Вставка / #Удаление в методах с &ИзменениеИКонтроль. Сравнивайте не только свои строки, но и окружающий типовой код: он контролируется, и после обновления основной конфигурации расширение может перестать применяться.
  4. Модули форм. Обработчики событий формы в расширении тоже бывают с аннотациями — их легко пропустить, если смотреть только общие модули.

Быстрый список расширений в базе

Когда расширений много, удобно сначала снять их «паспорт» кодом. Выполните в консоли кода или во внешней обработке на сервере:

Расширения = РасширенияКонфигурации.Получить();
Для Каждого Расширение Из Расширения Цикл
    Сообщить(СтрШаблон("%1 | версия %2 | назначение %3 | безопасный режим %4",
        Расширение.Имя,
        Расширение.Версия,
        Расширение.Назначение,
        Расширение.БезопасныйРежим));
КонецЦикла;

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

Окно сравнения Конфигуратора не показывает логику целиком: оно сравнивает тексты, а не порядок вызовов. Если два перехвата висят на одном методе в разных расширениях, по отдельности они могут выглядеть безобидно.

4. Сравнение ролей и прав доступа в расширениях

Роли в расширении бывают двух видов:

  • 🧩 собственные — созданы в расширении, дают права на его объекты и при необходимости на заимствованные;
  • 🔗 заимствованные — роли основной конфигурации, в которые расширение добавляет права на свои объекты.

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

Что проверить по ролям

  1. Есть ли у новых объектов расширения права хотя бы в одной роли. Объект без прав пользователи просто не увидят.
  2. Не выданы ли лишние права — например, «Удаление» или «Администрирование» в собственной роли.
  3. Есть ли ограничения доступа на уровне записей (RLS) в заимствованных ролях и совпадают ли тексты ограничений.
  4. Включён ли в роли признак установки прав для новых объектов. Он влияет на то, получат ли права объекты, добавленные позже.

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

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. Ошибки, из-за которых сравнение врёт

❌ Сравнение по идентификаторам двух независимых расширений. Весь отчёт состоит из «удалён/добавлен». Лечится правилом сопоставления по именам.

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

❌ Сравнили файл со старым состоянием базы. Расширение в Конфигураторе отредактировали, но не обновили в базе. Окно сравнения показывает одну картину, пользователи работают с другой.

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

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

Можно ли сравнить расширение с основной конфигурацией?
Прямого сравнения «расширение против основной конфигурации» нет: это разные сущности. Смотрите список заимствованных объектов и их модули в дереве расширения — там видно, что именно перехвачено.
Почему в отчёте сравнения роль помечена изменённой, а прав не видно?
Разница может быть в свойствах роли или в тексте ограничения доступа к записям. Откройте детализацию различий прав и проверьте шаблоны и ограничения.
Нужен ли монопольный доступ для сравнения?
Нет. Сравнение только читает метаданные. Монопольный режим нужен позже, если решите обновить расширение в базе со сменой структуры данных.
Как сравнить расширение из хранилища?
Подключите расширение к хранилищу в Конфигураторе, получите нужную версию и сравните её с текущей или выгрузите версию в файл и сравните с другим .cfe.
Сохраняется ли в .cfe информация о том, активно ли расширение?
Нет. Признак «Активно» и порядок подключения хранятся в базе, а не в файле. Проверяйте их в списке расширений конкретной базы.