Как найти различия между двумя объектами 1С — в метаданных, формах и данных
Содержание
Два объекта метаданных 1С проще всего сравнить в конфигураторе: Конфигурация → Сравнить, объединить с конфигурацией из файла... или Конфигурация → Сравнить конфигурации..., затем в дереве отчёта открыть нужный объект и посмотреть различия в модулях и формах. Если нужно сравнить не код, а данные — два элемента справочника или два документа, — штатной кнопки нет, и здесь выручает короткая обработка или консоль кода.
Выбор инструмента зависит от того, что именно вы сравниваете: конфигурацию целиком, отдельный объект, форму, модуль или значения реквизитов в базе. Ниже — каждый вариант с порогом применимости и подводными камнями.
Что именно сравниваем: метаданные, код или данные
Под «сравнением объектов 1С» на практике понимают три разные задачи. Инструменты для них не пересекаются, поэтому сначала определите свою.
| Задача | Пример | Чем сравнивать |
|---|---|---|
| 🧩 Метаданные и код | Чем справочник «Номенклатура» в рабочей базе отличается от типового | Конфигуратор, выгрузка в XML + diff, EDT |
| 🖼 Формы | Что доработчик поменял в форме документа | Сравнение форм в конфигураторе, XML формы |
| 📄 Данные | Почему два документа с одинаковой суммой проводятся по-разному | Консоль кода, обработка, сериализация в XML |
Если вопрос звучит как «что изменили в конфигурации после доработки», вам нужен первый вариант. Если «почему у этого контрагента работает, а у этого нет» — третий.
Штатное сравнение конфигураций и объектов в конфигураторе
Конфигуратор умеет сравнивать основную конфигурацию, конфигурацию базы данных, конфигурацию поставщика, файл .cf и расширения. Сравнение одного объекта — это то же сравнение конфигураций, отфильтрованное по нужной ветке дерева.
Как запустить сравнение
- Откройте базу в конфигураторе и откройте конфигурацию:
Конфигурация → Открыть конфигурацию. - Выберите режим:
Конфигурация → Сравнить конфигурации...— сравнение основной конфигурации с конфигурацией БД, поставщика или файлом;Конфигурация → Сравнить, объединить с конфигурацией из файла...— если эталон лежит в.cf.
- В окне сравнения включите отбор «Показывать только отличия», чтобы скрыть совпадающие объекты.
- Найдите в дереве нужный объект и раскройте его до уровня реквизитов, форм и модулей.
- Из контекстного меню на модуле откройте показ различий — откроется окно с двумя текстами и подсветкой изменённых строк.
Режим «Сравнить, объединить» не меняет конфигурацию, пока вы не нажмёте «Выполнить». Закройте окно кнопкой отмены, если вам нужен только просмотр, а не объединение.
Отчёт о сравнении
В окне сравнения есть команда формирования отчёта. Отчёт бывает кратким (только список изменённых объектов) и подробным (с текстами различий в модулях). Его удобно сохранить в .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 полезно:
- Сравнивать модуль формы отдельно от XML — он читается как обычный код.
- В diff-утилите включить игнорирование пробелов и переводов строк.
- Искать по имени элемента, а не листать файл целиком.
Командный интерфейс и роли
Видимость команд в разделах и права ролей тоже хранятся в метаданных. Если пользователь «не видит кнопку» в одной базе и видит в другой, сравните не только форму, но и командный интерфейс подсистемы и права роли на объект. В дереве сравнения роли — отдельная ветка Общие → Роли.
Сравнение данных: два элемента справочника или два документа
Здесь штатного окна нет. Задача типичная: два документа выглядят одинаково, а проводки разные. Нужно найти реквизит, который отличается.
Сравнение через сериализацию в 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 — в справке конфигуратора по параметрам командной строки. Там же описано, как ограничить сравнение отдельными объектами.
Сборка из нескольких шагов
Типовая схема регулярной проверки:
- Ночью выгрузить конфигурацию рабочей базы в файлы.
- Закоммитить выгрузку в Git.
- Утром посмотреть
git diffза сутки — это и есть список изменений, сделанных в конфигураторе мимо хранилища.
Для этой схемы есть готовые инструменты на OneScript (например, gitsync для переноса истории хранилища в Git). Они сами вызывают пакетный режим и раскладывают выгрузку по коммитам.
Запускайте выгрузку на копии базы или в нерабочее время: на большой конфигурации она занимает заметное время и нагружает сервер, а лог /Out проверяйте после каждого запуска.
Ошибки при сравнении, которые сбивают с толку
Большая часть «странных» результатов сравнения объясняется настройками, а не реальными различиями.
Ещё одна частая ошибка — сравнение основной конфигурации с конфигурацией базы данных, когда нужна конфигурация поставщика. Разница между основной конфигурацией и конфигурацией БД — это только то, что не применено через «Обновить конфигурацию базы данных». Чтобы увидеть ваши доработки относительно типовой, сравнивайте основную конфигурацию с конфигурацией поставщика.