Как найти различия между двумя объектами 1С — в метаданных, формах и данных

· 10 мин

Содержание

Два объекта метаданных 1С проще всего сравнить в конфигураторе: Конфигурация → Сравнить, объединить с конфигурацией из файла... или Конфигурация → Сравнить конфигурации..., затем в дереве отчёта открыть нужный объект и посмотреть различия в модулях и формах. Если нужно сравнить не код, а данные — два элемента справочника или два документа, — штатной кнопки нет, и здесь выручает короткая обработка или консоль кода.

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

Что именно сравниваем: метаданные, код или данные

Под «сравнением объектов 1С» на практике понимают три разные задачи. Инструменты для них не пересекаются, поэтому сначала определите свою.

ЗадачаПримерЧем сравнивать
🧩 Метаданные и кодЧем справочник «Номенклатура» в рабочей базе отличается от типовогоКонфигуратор, выгрузка в XML + diff, EDT
🖼 ФормыЧто доработчик поменял в форме документаСравнение форм в конфигураторе, XML формы
📄 ДанныеПочему два документа с одинаковой суммой проводятся по-разномуКонсоль кода, обработка, сериализация в XML

Если вопрос звучит как «что изменили в конфигурации после доработки», вам нужен первый вариант. Если «почему у этого контрагента работает, а у этого нет» — третий.

Штатное сравнение конфигураций и объектов в конфигураторе

Конфигуратор умеет сравнивать основную конфигурацию, конфигурацию базы данных, конфигурацию поставщика, файл .cf и расширения. Сравнение одного объекта — это то же сравнение конфигураций, отфильтрованное по нужной ветке дерева.

Как запустить сравнение

  1. Откройте базу в конфигураторе и откройте конфигурацию: Конфигурация → Открыть конфигурацию.
  2. Выберите режим:
    • Конфигурация → Сравнить конфигурации... — сравнение основной конфигурации с конфигурацией БД, поставщика или файлом;
    • Конфигурация → Сравнить, объединить с конфигурацией из файла... — если эталон лежит в .cf.
  3. В окне сравнения включите отбор «Показывать только отличия», чтобы скрыть совпадающие объекты.
  4. Найдите в дереве нужный объект и раскройте его до уровня реквизитов, форм и модулей.
  5. Из контекстного меню на модуле откройте показ различий — откроется окно с двумя текстами и подсветкой изменённых строк.

Режим «Сравнить, объединить» не меняет конфигурацию, пока вы не нажмёте «Выполнить». Закройте окно кнопкой отмены, если вам нужен только просмотр, а не объединение.

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

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

Правило сопоставления объектов

Сравнение по умолчанию идёт по внутренним идентификаторам объектов. Если объект в одной конфигурации удалили и создали заново с тем же именем, конфигуратор покажет два разных объекта: один «удалён», другой «добавлен». В таком случае переключите сопоставление на имена объектов — его выбирают при запуске сравнения.

При сравнении с файлом .cf от другого поставщика, без общей истории, сопоставление по идентификаторам почти ничего не найдёт. Сравнивайте по именам.

Модули крупным планом: консоль кода и внешние diff-утилиты

Встроенное окно различий справляется с одним-двумя модулями. Когда изменений сотни строк или нужно сравнить общий модуль из трёх баз, удобнее выгрузить тексты и открыть их внешней утилитой.

Выгрузка конфигурации в файлы

Конфигуратор выгружает всю конфигурацию в иерархию XML-файлов и модулей .bsl:

Конфигурация → Выгрузить конфигурацию в файлы...

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

УтилитаСильная сторонаОграничение
WinMergeБесплатная, сравнение папок, подсветка строкТолько Windows
KDiff3Трёхстороннее сравнение (база, ваша, поставщика)Интерфейс устаревший
MeldСравнение каталогов, работает в LinuxМедленнее на больших выгрузках
Beyond CompareПравила фильтрации, сравнение по маске файловПлатная лицензия
VS CodeБыстрый просмотр двух файлов, расширение для BSLСравнение папок — через расширения

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

Когда нужна консоль кода

Консоль кода — внешняя обработка, которая выполняет произвольный код на встроенном языке в режиме 1С:Предприятие. Для сравнения метаданных она полезна, когда в конфигуратор не пускают, а ответить на вопрос «какие реквизиты есть у объекта в этой базе» нужно.

// Список реквизитов справочника в текущей базе
МД = Метаданные.Справочники.Номенклатура;
Для Каждого Реквизит Из МД.Реквизиты Цикл
    Сообщить(СтрШаблон("%1 — %2", Реквизит.Имя, Реквизит.Тип));
КонецЦикла;

Выполните код в двух базах, сохраните вывод в текстовые файлы и сравните их diff-утилитой. Так быстро находится реквизит, который добавили в одной базе и забыли в другой.

Сравнение объектов 1С в EDT и Git

В 1С:Enterprise Development Tools конфигурация хранится как проект в файлах, поэтому сравнение объектов становится обычной работой с системой контроля версий.

Что умеет EDT

  • 🔍 Сравнение файла объекта с предыдущим коммитом или другой веткой — из контекстного меню объекта в навигаторе, раздел сравнения.
  • 🕘 Сравнение с локальной историей — EDT хранит промежуточные версии файлов до коммита.
  • 🔀 Сравнение и объединение конфигурации проекта с другой конфигурацией или .cf — аналог режима конфигуратора, но с выбором изменений прямо в редакторе.

Сравнение через Git без EDT

Если проект лежит в Git, различия между ветками по одному объекту показывает команда:

git diff main..feature/discount -- src/Catalogs/Номенклатура/

Для списка изменённых объектов без текста различий:

git diff --stat main..feature/discount -- src/

Формат выгрузки конфигуратора и формат проекта EDT различаются. Не сравнивайте выгрузку из конфигуратора с папкой src проекта EDT напрямую — различий будет тысячи, и почти все ложные. Приведите обе стороны к одному формату: импортируйте конфигурацию в EDT или выгрузите обе из конфигуратора.

Хранилище конфигурации

Если команда работает через хранилище, у каждой версии есть история. В окне хранилища можно сравнить версию объекта с текущей конфигурацией или две версии между собой. Это самый быстрый ответ на вопрос «кто и когда поменял этот модуль».

Различия в формах и интерфейсах

Формы — самая неудобная часть сравнения. Управляемая форма состоит из дерева элементов, реквизитов, команд и модуля, и текстовый diff XML-файла формы читается плохо.

В конфигураторе

Раскройте форму в дереве сравнения и откройте сравнение формы из контекстного меню. Откроется окно, где отдельно видны:

  • 📐 элементы формы — добавленные, удалённые, перемещённые;
  • 🗃 реквизиты формы;
  • ⚙️ команды;
  • 📝 модуль формы.

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

В XML

Форма в выгрузке — файл Form.xml в папке формы и модуль Module.bsl рядом. Перед сравнением XML полезно:

  1. Сравнивать модуль формы отдельно от XML — он читается как обычный код.
  2. В diff-утилите включить игнорирование пробелов и переводов строк.
  3. Искать по имени элемента, а не листать файл целиком.

Командный интерфейс и роли

Видимость команд в разделах и права ролей тоже хранятся в метаданных. Если пользователь «не видит кнопку» в одной базе и видит в другой, сравните не только форму, но и командный интерфейс подсистемы и права роли на объект. В дереве сравнения роли — отдельная ветка Общие → Роли.

Сравнение данных: два элемента справочника или два документа

Здесь штатного окна нет. Задача типичная: два документа выглядят одинаково, а проводки разные. Нужно найти реквизит, который отличается.

Сравнение через сериализацию в XML

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

Функция ОбъектВXML(Ссылка)
    Объект = Ссылка.ПолучитьОбъект();
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(Запись, Объект);
    Возврат Запись.Закрыть();
КонецФункции

Выполните функцию на сервере для обеих ссылок, сохраните результаты в два файла и сравните diff-утилитой. Различия в полях Ref и Number ожидаемы — их пропускайте.

Сравнение реквизитов кодом

Если нужен только список отличающихся реквизитов шапки, без XML:

Функция РазличияШапки(Ссылка1, Ссылка2)
    Различия = Новый Массив;
    МД = Ссылка1.Метаданные();
    Для Каждого Реквизит Из МД.Реквизиты Цикл
        Имя = Реквизит.Имя;
        Если Ссылка1[Имя] <> Ссылка2[Имя] Тогда
            Различия.Добавить(СтрШаблон("%1: %2 | %3", Имя, Ссылка1[Имя], Ссылка2[Имя]));
        КонецЕсли;
    КонецЦикла;
    Возврат Различия;
КонецФункции

Функция читает реквизиты через ссылку, без получения объекта целиком. Табличные части она не сравнивает: для них нужен отдельный цикл по МД.ТабличныеЧасти с проверкой количества строк и значений в каждой строке.

Ссылочные реквизиты сравниваются по ссылке, а не по представлению. Два разных элемента «Основной склад» с одинаковым названием код покажет как различие — и правильно сделает: часто причина проблемы именно в дубле.

Запрос вместо кода

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

Автоматизация и пакетное сравнение

Когда сравнивать нужно регулярно — после каждого обновления или перед каждой сборкой, — ручная работа в конфигураторе не годится.

Пакетный режим конфигуратора

Конфигуратор запускается из командной строки и выгружает конфигурацию в файлы без открытия интерфейса:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F "D:\Bases\Work" /N "Админ" /P "пароль" /DumpConfigToFiles "D:\Dump\Work" /Out "D:\Dump\log.txt"

Подставьте свой номер платформы, путь к базе и учётные данные. Для серверной базы вместо /F используется /S "сервер\база".

Сравнение без выгрузки делает команда /CompareCfg. Она строит тот же отчёт о сравнении, что и интерактивный режим:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F "D:\Bases\Work" /N "Админ" /P "пароль" ^
 /CompareCfg -FirstConfigurationType MainConfiguration ^
 -SecondConfigurationType File -SecondFile "D:\Typical\1Cv8.cf" ^
 -ReportType Full -ReportFormat txt -ReportFile "D:\Dump\compare.txt"

Полный список параметров /CompareCfg — в справке конфигуратора по параметрам командной строки. Там же описано, как ограничить сравнение отдельными объектами.

Сборка из нескольких шагов

Типовая схема регулярной проверки:

  1. Ночью выгрузить конфигурацию рабочей базы в файлы.
  2. Закоммитить выгрузку в Git.
  3. Утром посмотреть git diff за сутки — это и есть список изменений, сделанных в конфигураторе мимо хранилища.

Для этой схемы есть готовые инструменты на OneScript (например, gitsync для переноса истории хранилища в Git). Они сами вызывают пакетный режим и раскладывают выгрузку по коммитам.

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

Ошибки при сравнении, которые сбивают с толку

Большая часть «странных» результатов сравнения объясняется настройками, а не реальными различиями.

Диагностика: выберите симптом

Ещё одна частая ошибка — сравнение основной конфигурации с конфигурацией базы данных, когда нужна конфигурация поставщика. Разница между основной конфигурацией и конфигурацией БД — это только то, что не применено через «Обновить конфигурацию базы данных». Чтобы увидеть ваши доработки относительно типовой, сравнивайте основную конфигурацию с конфигурацией поставщика.

Частые вопросы

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