Можно ли программно сравнить две конфигурации
Коллеги, друзья по общему делу, подскажите пожалуйста.
Можно ли программно сравнить две конфигурации ?
Для собственных нужд нужно получить список объектов которые имеют разницу между двумя конфигурациями.
Ниже простой код, который поднимает все имена объектов из основной конфигурации.
Хочу доработать и получить , примерно то что есть на скрине, но не так круто, а просто в каком то простом виде,
типа объект изменен в сравнении с загружаемой конфигурацией.
По идее надо по указанному пути открыть файл второй конфигурации и как то сравнить все объекты.
возможно ли такое?
Можно ли программно сравнить две конфигурации ?
Для собственных нужд нужно получить список объектов которые имеют разницу между двумя конфигурациями.
Ниже простой код, который поднимает все имена объектов из основной конфигурации.
Хочу доработать и получить , примерно то что есть на скрине, но не так круто, а просто в каком то простом виде,
типа объект изменен в сравнении с загружаемой конфигурацией.
По идее надо по указанному пути открыть файл второй конфигурации и как то сравнить все объекты.
возможно ли такое?
МассивКлассовМетаданных = Новый Массив;
МассивКлассовМетаданных.Добавить("Подсистемы");
МассивКлассовМетаданных.Добавить("Общиемодули");
МассивКлассовМетаданных.Добавить("Роли");
МассивКлассовМетаданных.Добавить("ОбщиеРеквизиты");
МассивКлассовМетаданных.Добавить("ПланыОбмена");
МассивКлассовМетаданных.Добавить("КритерииОтбора");
МассивКлассовМетаданных.Добавить("ПодпискиНаСобытия");
МассивКлассовМетаданных.Добавить("РегламентныеЗадания");
МассивКлассовМетаданных.Добавить("ФункциональныеОпции");
МассивКлассовМетаданных.Добавить("ПараметрыФункциональныхОпций");
МассивКлассовМетаданных.Добавить("ОпределяемыеТипы");
МассивКлассовМетаданных.Добавить("ХранилищаНастроек");
МассивКлассовМетаданных.Добавить("ОбщиеФормы");
МассивКлассовМетаданных.Добавить("ОбщиеКоманды");
МассивКлассовМетаданных.Добавить("ГруппыКоманд");
МассивКлассовМетаданных.Добавить("ОбщиеМакеты");
МассивКлассовМетаданных.Добавить("ОбщиеКартинки");
//МассивКлассовМетаданных.Добавить("XDTO-Пакеты");
//МассивКлассовМетаданных.Добавить("Web-сервисы");
//МассивКлассовМетаданных.Добавить("HTTP-сервисы");
//МассивКлассовМетаданных.Добавить("WS-ссылки");
МассивКлассовМетаданных.Добавить("Сервисыинтеграции");
МассивКлассовМетаданных.Добавить("ЭлементыСтиля");
МассивКлассовМетаданных.Добавить("Стили");
МассивКлассовМетаданных.Добавить("Языки");
МассивКлассовМетаданных.Добавить("Константы");
МассивКлассовМетаданных.Добавить("Справочники");
МассивКлассовМетаданных.Добавить("Документы");
МассивКлассовМетаданных.Добавить("ЖурналыДокументов");
МассивКлассовМетаданных.Добавить("Перечисления");
МассивКлассовМетаданных.Добавить("Отчеты");
МассивКлассовМетаданных.Добавить("Обработки");
МассивКлассовМетаданных.Добавить("ПланыВидовХарактеристик");
МассивКлассовМетаданных.Добавить("РегистрыСведений");
МассивКлассовМетаданных.Добавить("РегистрыНакопления");
МассивКлассовМетаданных.Добавить("БизнесПроцессы");
МассивКлассовМетаданных.Добавить("Задачи");
Для каждого КлассМетаданных Из МассивКлассовМетаданных Цикл
Для Каждого ОбъектМетаданных Из Метаданные[КлассМетаданных] Цикл
Сообщить(КлассМетаданных+" , "+ОбъектМетаданных.Имя+" , "+ОбъектМетаданных.ЕстьИзмененияРасширениямиКонфигурации() );
КонецЦикла;
КонецЦикла;
ПоказатьПрикрепленные файлы:

По теме из базы знаний
- Всякие полезности
- История развития 1С:Торговли, что изменилось в архитектуре учета торговых и складских операций за 15 лет
- Конфигурация Flowcon: Набор инструментов для управления задачами, проектами и бизнесом в 1С
- Конструктор сравнения таблиц значения, в том числе из внешней базы
- Использование внешних программных средств при обновлении конфигураций 1С
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
1я обработина через COM-подключение подключается ко второй базе и тащит в первую имена объектов метаданных метаданных формируя таблицу из двух колонок
Справочник Контрагенты
Документ Реализация
....
Потом этот же алгоритм проходит с объектами первой базы.
Обе таблицы параметром в запрос: полное соединение, есть null покажет все различия.
Справочник Контрагенты
Документ Реализация
....
Потом этот же алгоритм проходит с объектами первой базы.
Обе таблицы параметром в запрос: полное соединение, есть null покажет все различия.
(9)
накидал код который ходит к другой базе по COM
вот пока не совсем представляю как по выбранному объекту это может быть любой объект не обязательно документ или справочник
как то получить информацию есть ли разница между объектами
таблицы ,реквизиты ,модуль объекта ,модуль менеджера ,состав нужно все сравнить
если это общий модуль то все флажки
если роль то права
и т да по каждому объекту все что он включает в себя
вот пример кода
накидал код который ходит к другой базе по 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 = Истина;
КонецЕсли;
КонецЦикла;
Объект.ТЗметаданные.Сортировать("ОбъектБаз Возр");
КонецЕсли;
КонецПроцедуры
ПоказатьПрикрепленные файлы:

(11) Сейчас можно намного проще получить доступ к объектам конфигурации
Конфигурация = Новый ОбъектМетаданныхКонфигурация(Новый ДвоичныеДанные(ПутьККонфигурации));
ПутьККонфигурации - путь к файлу cf
В результате, в переменной Конфигурация будет расположен объект, аналогичный свойству глобального контекста Метаданные.
Конфигурация = Новый ОбъектМетаданныхКонфигурация(Новый ДвоичныеДанные(ПутьККонфигурации));
ПутьККонфигурации - путь к файлу cf
В результате, в переменной Конфигурация будет расположен объект, аналогичный свойству глобального контекста Метаданные.
(12) Я не подозревал, что стоит задача продублировать штатный механизм сравнения конфигураций. Предложенным мной методом можно сравнить только по именам элементов метаданных (объектов, реквизитов, etc).
Выгрузить программно текст модуля в текст не получится (нет функционала).
Сравнить внутри запроса код (текст) или макет не представляется возможным. Нужна обработка кодом.
Выгрузить программно текст модуля в текст не получится (нет функционала).
Сравнить внутри запроса код (текст) или макет не представляется возможным. Нужна обработка кодом.
(12) а можно уточнить, с какой целью такое жёсткое сравнение?
у меня есть похожая задача. но, как по мне, если кто-то менял код, форму либо макеты в конфигурации - то, накрывая всё это новой конфигурацией, мы ничего не потеряем. а по одной конфигурации изменения можно и глазками посмотреть.
у меня цель - иметь возможность обновлять конфигурации баз через загрузку новой конфигурации.
и вот тут есть кардинальный нюанс - конфигурации могут быть идентичны по всем именам, но могут различаться внутренние идентификаторы объектов метаданных и их реквизитов. в результате обновление через загрузку теряет данные базы.
выгрузка конфигурации в файлы и парсинг этих файлов позволяет сравнить идентификаторы объектов метаданных. до реквизитов с наскоку добраться не получилось. время нужно на изучение.
у меня есть похожая задача. но, как по мне, если кто-то менял код, форму либо макеты в конфигурации - то, накрывая всё это новой конфигурацией, мы ничего не потеряем. а по одной конфигурации изменения можно и глазками посмотреть.
у меня цель - иметь возможность обновлять конфигурации баз через загрузку новой конфигурации.
и вот тут есть кардинальный нюанс - конфигурации могут быть идентичны по всем именам, но могут различаться внутренние идентификаторы объектов метаданных и их реквизитов. в результате обновление через загрузку теряет данные базы.
выгрузка конфигурации в файлы и парсинг этих файлов позволяет сравнить идентификаторы объектов метаданных. до реквизитов с наскоку добраться не получилось. время нужно на изучение.
(16)
есть конфигурация исписанная. т е менялись штатные объекты например документ.ЗаказКлиента
менялся как штатный код так и на самой форме новые объекты - добавлены страницы кнопки и т д
( если накатывать новую версию все это пропадает )
стоит задача унести все изменения доработки в расширение
каждый измененный объект вернуть в девственное состояние дистрибутива
что бы была возможность сделать переход на следующий релиз - но при этом не потерять наработки
накатить первое обновление затем следующее и дойти до последних релизов
при этом как было сказано нельзя потерять сделанные наработки
объекты документы справочники уже все перенесены в расширение
т е сейчас если будет произведен переход на следующую версию - формы и справочники - в части доработок останутся живыми
т к все по ним уже в расширении
вот такая задача
есть конфигурация исписанная. т е менялись штатные объекты например документ.ЗаказКлиента
менялся как штатный код так и на самой форме новые объекты - добавлены страницы кнопки и т д
( если накатывать новую версию все это пропадает )
стоит задача унести все изменения доработки в расширение
каждый измененный объект вернуть в девственное состояние дистрибутива
что бы была возможность сделать переход на следующий релиз - но при этом не потерять наработки
накатить первое обновление затем следующее и дойти до последних релизов
при этом как было сказано нельзя потерять сделанные наработки
объекты документы справочники уже все перенесены в расширение
т е сейчас если будет произведен переход на следующую версию - формы и справочники - в части доработок останутся живыми
т к все по ним уже в расширении
вот такая задача
(17) как по мне - в данном случае нет смысла в автоматизации. при сравнении -объединении с тем же релизом конфигурации можно просто глядя на изменения, пытаться перенести их в расширение. если на форме изменение чисто интерфейсное и с кодом не связано - то это неважно. вот с макетами сложнее. я пытаюсь сравнивать автоматически, потому что у меня баз около сотни и мне нужно быть уверенным, что никто ничего лишнего или не тем способом никуда не воткнул )
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот