Можно ли программно сравнить две конфигурации

1. yurazyuraz 04.12.21 01:02 Сейчас в теме
Коллеги, друзья по общему делу, подскажите пожалуйста.

Можно ли программно сравнить две конфигурации ?
Для собственных нужд нужно получить список объектов которые имеют разницу между двумя конфигурациями.
Ниже простой код, который поднимает все имена объектов из основной конфигурации.
Хочу доработать и получить , примерно то что есть на скрине, но не так круто, а просто в каком то простом виде,
типа объект изменен в сравнении с загружаемой конфигурацией.
По идее надо по указанному пути открыть файл второй конфигурации и как то сравнить все объекты.

возможно ли такое?

МассивКлассовМетаданных = Новый Массив;

МассивКлассовМетаданных.Добавить("Подсистемы");
МассивКлассовМетаданных.Добавить("Общиемодули");
МассивКлассовМетаданных.Добавить("Роли");
МассивКлассовМетаданных.Добавить("ОбщиеРеквизиты");
МассивКлассовМетаданных.Добавить("ПланыОбмена");
МассивКлассовМетаданных.Добавить("КритерииОтбора");
МассивКлассовМетаданных.Добавить("ПодпискиНаСобытия");
МассивКлассовМетаданных.Добавить("РегламентныеЗадания");
МассивКлассовМетаданных.Добавить("ФункциональныеОпции");
МассивКлассовМетаданных.Добавить("ПараметрыФункциональныхОпций");
МассивКлассовМетаданных.Добавить("ОпределяемыеТипы");
МассивКлассовМетаданных.Добавить("ХранилищаНастроек");
МассивКлассовМетаданных.Добавить("ОбщиеФормы");
МассивКлассовМетаданных.Добавить("ОбщиеКоманды");
МассивКлассовМетаданных.Добавить("ГруппыКоманд");
МассивКлассовМетаданных.Добавить("ОбщиеМакеты");
МассивКлассовМетаданных.Добавить("ОбщиеКартинки");
//МассивКлассовМетаданных.Добавить("XDTO-Пакеты");
//МассивКлассовМетаданных.Добавить("Web-сервисы");
//МассивКлассовМетаданных.Добавить("HTTP-сервисы");
//МассивКлассовМетаданных.Добавить("WS-ссылки");
МассивКлассовМетаданных.Добавить("Сервисыинтеграции");
МассивКлассовМетаданных.Добавить("ЭлементыСтиля");
МассивКлассовМетаданных.Добавить("Стили");
МассивКлассовМетаданных.Добавить("Языки");
МассивКлассовМетаданных.Добавить("Константы");
МассивКлассовМетаданных.Добавить("Справочники");
МассивКлассовМетаданных.Добавить("Документы");
МассивКлассовМетаданных.Добавить("ЖурналыДокументов");
МассивКлассовМетаданных.Добавить("Перечисления");
МассивКлассовМетаданных.Добавить("Отчеты");
МассивКлассовМетаданных.Добавить("Обработки");
МассивКлассовМетаданных.Добавить("ПланыВидовХарактеристик");
МассивКлассовМетаданных.Добавить("РегистрыСведений");
МассивКлассовМетаданных.Добавить("РегистрыНакопления");
МассивКлассовМетаданных.Добавить("БизнесПроцессы");
МассивКлассовМетаданных.Добавить("Задачи");

Для каждого КлассМетаданных Из МассивКлассовМетаданных Цикл 

     Для Каждого ОбъектМетаданных Из Метаданные[КлассМетаданных] Цикл
          Сообщить(КлассМетаданных+" , "+ОбъектМетаданных.Имя+" , "+ОбъектМетаданных.ЕстьИзмененияРасширениямиКонфигурации() );


     КонецЦикла;
КонецЦикла;
Показать
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. yurazyuraz 04.12.21 01:23 Сейчас в теме
погрузившись слегка в тему увидел один из вариантов
1 открыть первую конфигурацию и выгрузить в xml в первый каталог
2 затем отрыть вторую и так же выгрузить во второй каталог
3 затем сравнить два каталога по файлам
4. VladimirB 17 04.12.21 08:49 Сейчас в теме
(2)
3. Сравнить два каталога по файлам

После этого можно воспользоваться программами подобной WinMerge " https winmerge org"
или Araxis Merge
user1671936; yurazyuraz; +2 Ответить
6. yurazyuraz 04.12.21 11:52 Сейчас в теме
(4) Именно ее вчера поставил
3. Evgenia060882 87 04.12.21 05:14 Сейчас в теме
Можно из второй выгрузить .cf и через сравнить\объединить сравнить с первой базой
5. dehro 7 04.12.21 10:00 Сейчас в теме
1я обработина через COM-подключение подключается ко второй базе и тащит в первую имена объектов метаданных метаданных формируя таблицу из двух колонок

Справочник Контрагенты
Документ Реализация
....

Потом этот же алгоритм проходит с объектами первой базы.

Обе таблицы параметром в запрос: полное соединение, есть null покажет все различия.
user1671936; yurazyuraz; +2 Ответить
7. yurazyuraz 04.12.21 11:54 Сейчас в теме
8. yurazyuraz 04.12.21 18:15 Сейчас в теме
(5) а есть где то примеры кода,
сравнение через запрос , а такой способ сравнит все признаки все вложенные по объекту данные ?
как соединиться по COM представляю
9. dehro 7 04.12.21 23:05 Сейчас в теме
(8) А что именно хочешь сравнивать? Объекты, реквизиты, табличные части?
Вроде как простой механизм. Завтра накидаю пример.
yurazyuraz; +1 Ответить
10. yurazyuraz 05.12.21 01:14 Сейчас в теме
(9)

Допустим Объект хоть чем то отличается - то нужно получить информацию
т е по любому объекту нужно сравнить все.
11. yurazyuraz 05.12.21 01:23 Сейчас в теме
(9)

накидал код который ходит к другой базе по COM
вот пока не совсем представляю как по выбранному объекту это может быть любой объект не обязательно документ или справочник

как то получить информацию есть ли разница между объектами
таблицы ,реквизиты ,модуль объекта ,модуль менеджера ,состав нужно все сравнить
если это общий модуль то все флажки
если роль то права
и т да по каждому объекту все что он включает в себя


вот пример кода


&НаСервере
Процедура cmd_СравнениеМетаданныхНаСервере()
	
	Рез = Ложь;
	Попытка   
		ComConnector = Новый COMОбъект("V83.Comconnector");
		СтрокаПодключения = "Srvr="+Объект.Сервер+";Ref="+БазаСравнение2+";Usr="+ЛогинСравнения2+";Pwd="+ПарольСравнение2+";";
		Соединение = ComConnector.Connect(СтрокаПодключения);
		Рез = Истина;
	Исключение
		Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
		//ОбъектОбработки().Соединение = Неопределено;
	КонецПопытки;
	Если Рез = Истина тогда
		///
		МассивКлассовМетаданных = Новый Массив;
		
		МассивКлассовМетаданных.Добавить("Подсистемы");
		МассивКлассовМетаданных.Добавить("Общиемодули");
		МассивКлассовМетаданных.Добавить("Роли");
		МассивКлассовМетаданных.Добавить("ОбщиеРеквизиты");
		МассивКлассовМетаданных.Добавить("ПланыОбмена");
		МассивКлассовМетаданных.Добавить("КритерииОтбора");
		МассивКлассовМетаданных.Добавить("ПодпискиНаСобытия");
		МассивКлассовМетаданных.Добавить("РегламентныеЗадания");
		МассивКлассовМетаданных.Добавить("ФункциональныеОпции");
		МассивКлассовМетаданных.Добавить("ПараметрыФункциональныхОпций");
		МассивКлассовМетаданных.Добавить("ОпределяемыеТипы");
		МассивКлассовМетаданных.Добавить("ХранилищаНастроек");
		МассивКлассовМетаданных.Добавить("ОбщиеФормы");
		МассивКлассовМетаданных.Добавить("ОбщиеКоманды");
		МассивКлассовМетаданных.Добавить("ГруппыКоманд");
		МассивКлассовМетаданных.Добавить("ОбщиеМакеты");
		МассивКлассовМетаданных.Добавить("ОбщиеКартинки");
		МассивКлассовМетаданных.Добавить("ПакетыXDTO");
		МассивКлассовМетаданных.Добавить("Webсервисы");
		МассивКлассовМетаданных.Добавить("HTTPсервисы");
		МассивКлассовМетаданных.Добавить("WSссылки");
		МассивКлассовМетаданных.Добавить("Сервисыинтеграции");
		МассивКлассовМетаданных.Добавить("ЭлементыСтиля");
		МассивКлассовМетаданных.Добавить("Стили");
		МассивКлассовМетаданных.Добавить("Языки");
		МассивКлассовМетаданных.Добавить("Константы");
		МассивКлассовМетаданных.Добавить("Справочники");
		МассивКлассовМетаданных.Добавить("Документы");
		МассивКлассовМетаданных.Добавить("ЖурналыДокументов");
		МассивКлассовМетаданных.Добавить("Перечисления");
		МассивКлассовМетаданных.Добавить("Отчеты");
		МассивКлассовМетаданных.Добавить("Обработки");
		МассивКлассовМетаданных.Добавить("ПланыВидовХарактеристик");
		МассивКлассовМетаданных.Добавить("РегистрыСведений");
		МассивКлассовМетаданных.Добавить("РегистрыНакопления");
		МассивКлассовМетаданных.Добавить("БизнесПроцессы");
		МассивКлассовМетаданных.Добавить("Задачи");
		
		Для каждого КлассМетаданных Из МассивКлассовМетаданных Цикл 
			Для Каждого ОбъектМетаданных Из Метаданные[КлассМетаданных] Цикл
				//  Сообщить(КлассМетаданных+" , "+ОбъектМетаданных.Имя+" , "+ОбъектМетаданных.ЕстьИзмененияРасширениямиКонфигурации() );
				ТЗМД = Объект.ТЗметаданные.Добавить();  
				ТЗМД.ОбъектБаза1 = КлассМетаданных+"."+ОбъектМетаданных.Имя;
				ТЗМД.ЕстьВРасширении = ОбъектМетаданных.ЕстьИзмененияРасширениямиКонфигурации();
				ТЗМД.ОбъектБаз = КлассМетаданных;
			КонецЦикла;
		КонецЦикла;
		
		Для каждого КлассМетаданных Из МассивКлассовМетаданных Цикл 
			Для каждого МДок из Соединение.Метаданные[КлассМетаданных] Цикл
				НайденнаяСтрока = Объект.ТЗметаданные.НайтиСтроки(   НОВЫЙ Структура("ОбъектБаза1", КлассМетаданных+"."+МДок.Имя)) ; 
				Если НайденнаяСтрока.Количество() = 1  Тогда
					ТЗмд = НайденнаяСтрока[0];
					ТЗмд.ОбъектБаза2 =КлассМетаданных+"."+МДок.Имя;
					//Строка.ДокументБазыКорреспондентаСиноним = МДок.Synonym;
				Иначе
					ТЗмд =  Объект.ТЗметаданные.Добавить();
					ТЗмд.ОбъектБаза2 =КлассМетаданных+"."+МДок.Имя;
					ТЗмд.НетВБазе1 =Истина;
					ТЗмд.ОбъектБаз = КлассМетаданных;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
		Для каждого ТЗМД Из Объект.ТЗметаданные Цикл 
			Если ЗначениеЗаполнено(ТЗМД.ОбъектБаза1) и  НЕ ЗначениеЗаполнено(ТЗМД.ОбъектБаза2) тогда
				ТЗМД.НетВБазе2 = Истина;
			КонецЕсли;			
		КонецЦикла;
		
		Объект.ТЗметаданные.Сортировать("ОбъектБаз Возр");
		
	КонецЕсли;		
КонецПроцедуры

Показать
Прикрепленные файлы:
15. vadim1011985 102 05.12.21 14:33 Сейчас в теме
(11) Сейчас можно намного проще получить доступ к объектам конфигурации

Конфигурация = Новый ОбъектМетаданныхКонфигурация(Новый ДвоичныеДанные(ПутьККонфигурации));

ПутьККонфигурации - путь к файлу cf

В результате, в переменной Конфигурация будет расположен объект, аналогичный свойству глобального контекста Метаданные.
12. yurazyuraz 05.12.21 10:15 Сейчас в теме
(9). Обязательно код модуля коды формы , саму форму. Макеты

Под кодом подразумевается программный код.
14. dehro 7 05.12.21 14:33 Сейчас в теме
(12) Я не подозревал, что стоит задача продублировать штатный механизм сравнения конфигураций. Предложенным мной методом можно сравнить только по именам элементов метаданных (объектов, реквизитов, etc).

Выгрузить программно текст модуля в текст не получится (нет функционала).

Сравнить внутри запроса код (текст) или макет не представляется возможным. Нужна обработка кодом.
16. GPL 3 06.12.21 12:26 Сейчас в теме
(12) а можно уточнить, с какой целью такое жёсткое сравнение?
у меня есть похожая задача. но, как по мне, если кто-то менял код, форму либо макеты в конфигурации - то, накрывая всё это новой конфигурацией, мы ничего не потеряем. а по одной конфигурации изменения можно и глазками посмотреть.
у меня цель - иметь возможность обновлять конфигурации баз через загрузку новой конфигурации.
и вот тут есть кардинальный нюанс - конфигурации могут быть идентичны по всем именам, но могут различаться внутренние идентификаторы объектов метаданных и их реквизитов. в результате обновление через загрузку теряет данные базы.
выгрузка конфигурации в файлы и парсинг этих файлов позволяет сравнить идентификаторы объектов метаданных. до реквизитов с наскоку добраться не получилось. время нужно на изучение.
17. yurazyuraz 13.12.21 22:03 Сейчас в теме
(16)
есть конфигурация исписанная. т е менялись штатные объекты например документ.ЗаказКлиента
менялся как штатный код так и на самой форме новые объекты - добавлены страницы кнопки и т д
( если накатывать новую версию все это пропадает )

стоит задача унести все изменения доработки в расширение
каждый измененный объект вернуть в девственное состояние дистрибутива
что бы была возможность сделать переход на следующий релиз - но при этом не потерять наработки

накатить первое обновление затем следующее и дойти до последних релизов
при этом как было сказано нельзя потерять сделанные наработки
объекты документы справочники уже все перенесены в расширение
т е сейчас если будет произведен переход на следующую версию - формы и справочники - в части доработок останутся живыми
т к все по ним уже в расширении

вот такая задача
18. GPL 3 14.12.21 10:46 Сейчас в теме
(17) как по мне - в данном случае нет смысла в автоматизации. при сравнении -объединении с тем же релизом конфигурации можно просто глядя на изменения, пытаться перенести их в расширение. если на форме изменение чисто интерфейсное и с кодом не связано - то это неважно. вот с макетами сложнее. я пытаюсь сравнивать автоматически, потому что у меня баз около сотни и мне нужно быть уверенным, что никто ничего лишнего или не тем способом никуда не воткнул )
13. ImHunter 331 05.12.21 12:53 Сейчас в теме
(1) На мотив (3), можно также сформировать отчеты по конфигурациям (Конфигурация/Отчет по конфигурации) и сравнить результаты штатным сравнением.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот