Как программно сравнить две конфигурации 1С и получить список измененных объектов

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Сравнение конфигураций — это стандартная задача для любого разработчика 1С, но иногда штатных средств «Сравнить и объединить» недостаточно, особенно если требуется автоматизировать процесс или получить список изменений программно для дальнейшего анализа. Рассмотрим ситуацию, когда нам необходимо выявить все различия между текущей базой и эталонной конфигурацией (например, для переноса доработок в расширения или подготовки к масштабному обновлению).

Способ 1. Использование COM-соединения для сравнения структуры метаданных

Проанализируем самый доступный способ — подключение к другой информационной базе через COMConnector. Этот метод позволяет получить доступ к дереву метаданных другой конфигурации без выгрузки файлов. Мы можем создать таблицу значений, заполнить её объектами из текущей базы и базы-источника, а затем сравнить их.

Разберем пример кода, который выполняет такое сравнение:


&НаСервере
Процедура ВыполнитьСравнениеЧерезCOM()
    Попытка
        ComConnector = Новый COMОбъект("V83.Comconnector");
        СтрокаПодключения = "Srvr=ИмяСервера;Ref=ИмяБазы;Usr=Админ;Pwd=Пароль;";
        Соединение = ComConnector.Connect(СтрокаПодключения);
    Исключение
        Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    МассивКлассов = Новый Массив;
    МассивКлассов.Добавить("Справочники");
    МассивКлассов.Добавить("Документы");
    МассивКлассов.Добавить("РегистрыСведений");
    // Добавьте остальные классы по необходимости

    Для каждого Класс Из МассивКлассов Цикл
        // Перебор объектов текущей базы
        Для Каждого Объект Из Метаданные[Класс] Цикл
            // Логика поиска объекта в COM-соединении
            Попытка
                ОбъектВторойБазы = Соединение.Метаданные[Класс][Объект.Имя];
                Если ОбъектВторойБазы = Неопределено Тогда
                    Сообщить("Объект " + Объект.Имя + " отсутствует во второй базе");
                КонецЕсли;
            Исключение
                Сообщить("Ошибка при доступе к объекту: " + Объект.Имя);
            КонецПопытки;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Важный нюанс: данный метод позволяет сравнить только наличие объектов и их базовые свойства (имена, синонимы, состав реквизитов). Проверить содержимое программного кода модулей или макетов через COM-соединение напрямую практически невозможно, так как платформа не предоставляет программного доступа к тексту модулей «на лету».

Способ 2. Использование объекта ОбъектМетаданныхКонфигурация

В современных версиях платформы 1С:Предприятие 8.3 появился более элегантный способ — чтение файла конфигурации (.cf) напрямую. Для этого используется объект ОбъектМетаданныхКонфигурация. Посмотрим, как это работает.

Рассмотрим алгоритм действий:

  1. Выгружаем конфигурацию второй базы в файл .cf.
  2. В основной базе создаем объект метаданных из этого файла.
  3. Сравниваем полученный объект со свойством Метаданные текущей базы.

ПутьКФайлу = "C:\Config\ExternalConfig.cf";
ДвоичныеДанныеCF = Новый ДвоичныеДанные(ПутьКФайлу);
ВнешняяКонфигурация = Новый ОбъектМетаданныхКонфигурация(ДвоичныеДанныеCF);

// Теперь можно обращаться к объектам так же, как к обычным метаданным
Для Каждого Справочник Из ВнешняяКонфигурация.Справочники Цикл
    Если Метаданные.Справочники.Найти(Справочник.Имя) = Неопределено Тогда
        Сообщить("Новый справочник: " + Справочник.Имя);
    КонецЕсли;
КонецЦикла;

Этот метод значительно быстрее COM-соединения, так как не требует запуска второго процесса 1С и авторизации. Однако ограничение по анализу кода модулей сохраняется и здесь.

Способ 3. Выгрузка в файлы XML и построчное сравнение

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

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

Параметры командной строки:

Пример команды для получения текстового отчета о различиях:

1cv8.exe DESIGNER /F "ПутьКБазе" /CompareCfg "Файл1.cf" "Файл2.cf" -Report "Result.txt"

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

Способ 4. Оптимизация через использование контрольных сумм (Hashing)

Рассмотрим продвинутый подход для тех, кому нужно быстро проверять изменения в большом количестве баз. После того как конфигурации выгружены в файлы XML, не обязательно сравнивать их построчно. Можно применить механизм хеширования.

  1. Для каждого файла выгрузки (например, Справочник.Контрагенты.xml) рассчитывается хеш-сумма (MD5 или SHA-256).
  2. Хеши сохраняются в таблицу или базу данных.
  3. При сравнении сопоставляются только хеши.

Если хеш файла модуля объекта Справочник.Заказы.МодульОбъекта.bsl не совпадает в двух выгрузках, значит, код был изменен. Это позволяет мгновенно отсеять тысячи неизмененных объектов и сфокусироваться только на доработках.

Рекомендации по реализации задачи переноса доработок

Если ваша цель — перенести изменения в расширения, как упоминалось в обсуждении, придерживайтесь следующей стратегии:

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

← На главную