Сравнение конфигураций — это стандартная задача для любого разработчика 1С, но иногда штатных средств «Сравнить и объединить» недостаточно, особенно если требуется автоматизировать процесс или получить список изменений программно для дальнейшего анализа. Рассмотрим ситуацию, когда нам необходимо выявить все различия между текущей базой и эталонной конфигурацией (например, для переноса доработок в расширения или подготовки к масштабному обновлению).
Проанализируем самый доступный способ — подключение к другой информационной базе через COMConnector. Этот метод позволяет получить доступ к дереву метаданных другой конфигурации без выгрузки файлов. Мы можем создать таблицу значений, заполнить её объектами из текущей базы и базы-источника, а затем сравнить их.
Разберем пример кода, который выполняет такое сравнение:
&НаСервере
Процедура ВыполнитьСравнениеЧерезCOM()
Попытка
ComConnector = Новый COMОбъект("V83.Comconnector");
СтрокаПодключения = "Srvr=ИмяСервера;Ref=ИмяБазы;Usr=Админ;Pwd=Пароль;";
Соединение = ComConnector.Connect(СтрокаПодключения);
Исключение
Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
МассивКлассов = Новый Массив;
МассивКлассов.Добавить("Справочники");
МассивКлассов.Добавить("Документы");
МассивКлассов.Добавить("РегистрыСведений");
// Добавьте остальные классы по необходимости
Для каждого Класс Из МассивКлассов Цикл
// Перебор объектов текущей базы
Для Каждого Объект Из Метаданные[Класс] Цикл
// Логика поиска объекта в COM-соединении
Попытка
ОбъектВторойБазы = Соединение.Метаданные[Класс][Объект.Имя];
Если ОбъектВторойБазы = Неопределено Тогда
Сообщить("Объект " + Объект.Имя + " отсутствует во второй базе");
КонецЕсли;
Исключение
Сообщить("Ошибка при доступе к объекту: " + Объект.Имя);
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Важный нюанс: данный метод позволяет сравнить только наличие объектов и их базовые свойства (имена, синонимы, состав реквизитов). Проверить содержимое программного кода модулей или макетов через COM-соединение напрямую практически невозможно, так как платформа не предоставляет программного доступа к тексту модулей «на лету».
В современных версиях платформы 1С:Предприятие 8.3 появился более элегантный способ — чтение файла конфигурации (.cf) напрямую. Для этого используется объект ОбъектМетаданныхКонфигурация. Посмотрим, как это работает.
Рассмотрим алгоритм действий:
.cf.Метаданные текущей базы.
ПутьКФайлу = "C:\Config\ExternalConfig.cf";
ДвоичныеДанныеCF = Новый ДвоичныеДанные(ПутьКФайлу);
ВнешняяКонфигурация = Новый ОбъектМетаданныхКонфигурация(ДвоичныеДанныеCF);
// Теперь можно обращаться к объектам так же, как к обычным метаданным
Для Каждого Справочник Из ВнешняяКонфигурация.Справочники Цикл
Если Метаданные.Справочники.Найти(Справочник.Имя) = Неопределено Тогда
Сообщить("Новый справочник: " + Справочник.Имя);
КонецЕсли;
КонецЦикла;
Этот метод значительно быстрее COM-соединения, так как не требует запуска второго процесса 1С и авторизации. Однако ограничение по анализу кода модулей сохраняется и здесь.
Если стоит задача «жесткого» сравнения, включая тексты модулей, формы и макеты, то единственным надежным программным способом является использование механизма выгрузки конфигурации в файлы. Выясним причину популярности этого метода: при выгрузке каждый объект превращается в набор текстовых файлов (XML для структуры и .bsl для программного кода).
Для реализации этого метода проанализируем возможности командной строки Конфигуратора. Мы можем запустить процесс выгрузки программно с помощью функции ЗапуститьПриложение.
Параметры командной строки:
/DumpConfigToFiles [ПутьККаталогу] — выгрузка всей конфигурации в XML./CompareCfg — формирование отчета о сравнении двух конфигураций.Пример команды для получения текстового отчета о различиях:
1cv8.exe DESIGNER /F "ПутьКБазе" /CompareCfg "Файл1.cf" "Файл2.cf" -Report "Result.txt"
После выполнения этой команды мы получим файл Result.txt, который можно программно прочитать и распарсить. В нем будут перечислены все измененные объекты, включая модули.
Рассмотрим продвинутый подход для тех, кому нужно быстро проверять изменения в большом количестве баз. После того как конфигурации выгружены в файлы XML, не обязательно сравнивать их построчно. Можно применить механизм хеширования.
Справочник.Контрагенты.xml) рассчитывается хеш-сумма (MD5 или SHA-256).Если хеш файла модуля объекта Справочник.Заказы.МодульОбъекта.bsl не совпадает в двух выгрузках, значит, код был изменен. Это позволяет мгновенно отсеять тысячи неизмененных объектов и сфокусироваться только на доработках.
Если ваша цель — перенести изменения в расширения, как упоминалось в обсуждении, придерживайтесь следующей стратегии:
diff или библиотеками на базе OneScript для формирования детального отчета об изменениях в формате JSON.Выбирая между предложенными методами, ориентируйтесь на глубину анализа: для простого сравнения состава реквизитов достаточно ОбъектМетаданныхКонфигурация, а для полного контроля над кодом — только выгрузка в файлы XML.