Метаданные и их идентификаторы

05.12.20

Разработка - Инструментарий разработчика

Идентификаторы (GUID'ы) метаданных конфигурации. Немного о том, как их получить.

Есть ли проблема

Каждый объект метаданных конфигурации имеет собственный уникальный идентификатор, который невозможно получить простым способом. Платформа 1С не предоставляет методов работы с этими внутренними свойствами, которые иногда все же нужны. Из штатных механизмов платформы для работы с метаданными мы имеем только метод "ПолноеИмя()", который вернет нам почти удобочитаемый идентификатор объекта.

ПолноеИмя = Метаданные.Документы.ЗаказКлиента.ПолноеИмя()
Сообщить(ПолноеИмя); // Выведет "Документ.ЗаказКлиента"

Нужно ли еще что-то? Иногда могут встать такие задачи, хоть и нестандартные:

  • Нужно отследить фактическую замену объекта метаданных. Например, если удалили справочник из конфигурации, но при этом добавили новый с таким же именем.
  • При возникновении ошибок, связанных с кэшем, в них может фигурировать идентификатор метаданных. Для расследования нужно распознать что это за объект.это ужас это просто ужас, Мем Кот который видел ужасные вещи - Рисовач .Ру
  • Для собственного решения по хранению информации о метаданных в конфигурации. Аналог справочника "ИдентификаторыОбъектовМетаданных" из БСП, в котором каждому объекту конфигурации (ну, почти каждому - только верхнеуровневым) соответствует элемент этого справочника по полному имени. По тому самому значению, полученному с помощью "ПолноеИмя()".
  • Или Вам просто интересно узнать, как подобную информацию получить.
  • Другие причины.

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

Путь БСП

Как уже упоминалось выше, в БСП есть справочник "Идентификаторы объектов метаданных", который содержит информацию об объектах метаданных конфигурации.

Обновляется автоматически в процедурах обновления БСП. Также обновление может быть запущено вручную.

Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();

Сопоставление элемента этого справочника с объектом метаданных конфигурации выполняется с помощью поля "ПолноеИмя", в которое записывается результат вызова функции "ПолноеИмя()" для объекта метаданных (см. начало статьи). Вот пример заполнения элемента из демобазы БСП для документа "Заказ клиента".

Кроме этого поля также есть "ЗначениеПустойСсылки", "НоваяСсылка", "ИмяПредопределенныхДанных" и "КлючОбъектаХранилища", но в их назначение погружаться сейчас не будем. Отмечу лишь, что они помогают провести "умное" обновление справочника с учетом переименований и других особенностей:

// Порядок обновления:
// 1. Переименование объектов метаданных (с учетом нижестоящих подсистем).
// 2. Обновление предопределенных идентификаторов (коллекций объектов метаданных).
// 3. Обновление идентификаторов объектов метаданных, которые    имеют ключ  объекта метаданных.
// 4. Обновление идентификаторов объектов метаданных, которые не имеют ключа объекта метаданных.
// 5. В процессе 3 и 4 пометка удаления дублей идентификаторов (по полным именам).
// 6. Добавление новых идентификаторов объектов метаданных.
// 7. Обновление родителей идентификаторов объектов метаданных и запись обновленных.

Подробнее Вы можете посмотреть самостоятельно в процедуре "ОбновитьДанныеСправочника", о которой мы уже говорили ранее.

Главное, что стоит сказать - это отсутствие необходимости сохранять уникальный идентификатор объекта метаданных для этого справочника и механизмов его обновления. Разработчики БСП нашли альтернативный путь и используют его.

Ручная работа

Но представим, что для нашей задачи все-таки нужен уникальный идентификатор объекта метаданных. Как его получить?

Самый простой способ - сделать вручную выгрузку конфигурации в файлы и посмотреть идентификатор самостоятельно. Для платформы 8.3 есть возможность выгружать конфигурацию в XML.

Файлы выгружаются в каталог, там мы и сможем найти нужную для нас информацию. Например, в демобазе БСП есть документ "_ДемоЗаказПокупателя". Идем в каталог с файлами конфигурации, переходим во вложенный каталог "Documents" и находим файл "_ДемоЗаказПокупателя.xml". Вот его содержимое (не все, только самая важная для нас часть):

<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject> <!-- Убрал пространства имен и некоторые другие атрибуты -->
	<Document uuid="4eee25b1-2da6-459b-953b-4c8d519c9bce">
		<InternalInfo>
			<xr:GeneratedType name="DocumentObject._ДемоЗаказПокупателя" category="Object">
				<xr:TypeId>eb4c3baa-9f3f-4988-b1cc-ebb9a21105ca</xr:TypeId>
				<xr:ValueId>bf5eaf96-437c-417c-96bd-5b4e968ab66b</xr:ValueId>
			</xr:GeneratedType>
			<xr:GeneratedType name="DocumentRef._ДемоЗаказПокупателя" category="Ref">
				<xr:TypeId>6e094677-52bb-4e65-8322-5fbd75bbdd8e</xr:TypeId>
				<xr:ValueId>ac0e6277-d79a-4c3d-aa88-9edcdaaeff3a</xr:ValueId>
			</xr:GeneratedType>
			<xr:GeneratedType name="DocumentSelection._ДемоЗаказПокупателя" category="Selection">
				<xr:TypeId>26d4fa62-e00f-4fb9-acaf-44033d6cf1d8</xr:TypeId>
				<xr:ValueId>7a336f96-3af1-4177-923a-579783b96811</xr:ValueId>
			</xr:GeneratedType>
			<xr:GeneratedType name="DocumentList._ДемоЗаказПокупателя" category="List">
				<xr:TypeId>11c10634-2427-4654-8c12-f68386be6e27</xr:TypeId>
				<xr:ValueId>b18e5dd3-3e87-4698-90b5-b79eae1ad923</xr:ValueId>
			</xr:GeneratedType>
			<xr:GeneratedType name="DocumentManager._ДемоЗаказПокупателя" category="Manager">
				<xr:TypeId>dca0d409-e137-46a7-8ca8-6408b204142e</xr:TypeId>
				<xr:ValueId>08f7715a-0036-463e-b649-22a98fb140e0</xr:ValueId>
			</xr:GeneratedType>
		</InternalInfo>	
		<!-- Тут еще много много информации об объекте метаданных -->
	</Document>
</MetaDataObject>

В первом узле, подчиненном "MetaDataObject", мы видим имя вида объекта (в нашем случае "Document", т.е. документ), а также его уникальный идентификатор. Да, в нашей конфигурации у документа "_ДемоЗаказПокупателя" идентификатор объекта метаданных - "4eee25b1-2da6-459b-953b-4c8d519c9bce". На самом деле тут можно узнать не только GUID объекта метаданных, но и другую служебную информацию:

  • Идентификатор различных связанных типов данных (объекта, ссылки, менеджера и др.).
  • Состав объекта (поля, типы и т.д.)
  • И кое-что другое.

Фактически это полная информация об объекте.

Таким же образом можно узнать GUID любого объекта метаданных конфигурации. Но это очень неудобно выполнять вручную каждый раз, когда это значение понадобится, поэтому идем дальше.

Извлекаем из журнала регистрации

Есть еще один необычный способ получения идентификаторов метаданных - это использование файлов журнала регистрации. Да, именно файлов, т.к. штатными средствами прочитать GUID объекта метаданных из них платформа 1С не позволяет.

Есть два формата журнала регистрации:

Например, для SQLite-формата идентификатор объекта метаданных хранится в таблице "MetadataCodes".

В текстовом формате идентификатор метаданных хранится в файле "1Cv8.lgf", который содержит информацию о ссылочных данных журнала. Записи с идентификатором "5" как раз и содержат информацию о метаданных. Вот пример такой записи.

Как именно читать данные из этих источников подробно останавливаться не будем. Но кратко перечислю основные варианты:

  • Для SQLite формата делать запросы через ODBC-драйвер к файлу журнала.
  • Для текстового формата - парсить файл "1Cv8.lgf".

В публикации "Экспорт журнала регистрации. Набор инструментов (приложения + исходный код)" как раз есть информация о парсинге обоих форматов журнала регистрации и открытый исходный код. Также там есть пример конфигурации с внешним источником данных для получения данных журнала регистрации, но уже из внешнего хранилища.

Программные маневры

Предыдущие способы рабочие, но очень неудобные, да и не всегда подходят.

Минусы ручного анализа очевидны:

  • Большие трудозатраты для анализа, не говоря уже о случаях, когда нужно получить идентификаторы всех объектов метаданных.
  • Задача сама по себе требует автоматизации
  • Нет возможности программной работы

Для получения данных из журнала регистрации также есть недостатки:

  • Не все метаданные могли участвовать в событиях журнала, а значит их и не будет в исходных файлах
  • Необходимость парсинга / подключения к файлам журнала, что не всегда возможно для файлов с рабочего окружения

Но есть и третий способ - это программное получение GUID'ов метаданных с помощью программного кода. Для этого нужно выполнить следующую последовательность действий:

  1. Выгружаем конфигурацию в файлы
  2. Парсим основные файлы описания метаданных
  3. Обрабатываем результат
  4. Получаем таблицу метаданных с полями "Полное имя" и "GUID".

Рассмотрим кратко реализацию каждого шага.

Выгружаем и парсим

Для выгрузки конфигурации в файлы из кода встроенного языка платформы 1С запустим конфигуратор в пакетном режиме с указанием параметра "DumpConfigToFiles", который как раз и сделает то, что нам нужно. Вот простейший пример процедуры для этого.

Процедура ВыгрузитьКонфигурациюВКаталог(ИмяСервера, ИмяБазы, ИмяПользователь, ПарольПользователя, КаталогВыгрузи)
	
	КаталогСерверногоПриложения = КаталогПрограммы();
	ПриложениеТолстыйКлиент = КаталогСерверногоПриложения + "1cv8.exe";
	
	КомандаКонфигуратора = """" + ПриложениеТолстыйКлиент + """"
		+ " DESIGNER"
		+ " /S""" + ИмяСервера + "\" + ИмяБазы + """"
		+ " /N""" + ИмяПользователь + """"
		+ " /P""" + ПарольПользователя + """"
		+ " /DumpConfigToFiles """ + КаталогВыгрузи + """"
		+ " ";
		
	РезультатВыполнения = ВыполнитьПриложение(КомандаКонфигуратора);
	Если ЗначениеЗаполнено(РезультатВыполнения.Ошибки) Тогда
		ВызватьИсключение "Не удалось выгрузить конфигурацию в файлы.
			|Подробно:
			|" + РезультатВыполнения.Ошибки;
	КонецЕсли;
	
КонецПроцедуры

Мы формируем команду для запуска конфигуратора в пакетном режиме с указанием адреса информационной базы, а также данных для входа пользователя. Для параметра "DumpConfigToFiles" указывается каталог выгрузки. Вызвать процедуру очень просто, главное не забыть подставить в нее свои корректные параметры.

ИмяСервера = "localhost";
ИмяБазы = "bal_demo";
ИмяПользователь = "Администратор";
ПарольПользователя = "";	
КаталогВыгрузкиКонфигурации = "C:\cfg";
	
ВыгрузитьКонфигурациюВКаталог(
	ИмяСервера,
	ИмяБазы,
	ИмяПользователь,
	ПарольПользователя,
	КаталогВыгрузкиКонфигурации);

Функция "ВыполнитьПриложение" - это еще одна добавленная процедура, которая запускает указанную команду с таймаутом выполнения. Это особенно важно, т.к. при выполнении подобного кода на сервере может произойти зависание сеанса, если с приложением что-то пошло не так.

Подробнее о безопасном запуске приложений из 1С для Windows и Linux шел разговор в публикации "Вы запускаете приложения, но делаете это без уважения". Ниже под спойлером приведу исходный код этой процедуры и всех вспомогательных ее частей.

 
 Код для безопасного запуска приложений

После этого нам нужно выполнить парсинг выгруженных файлов, чтобы сформировать такую таблицу значений.

ТаблицаСИнформациеОМетаданных = Новый ТаблицаЗначений;
ТаблицаСИнформациеОМетаданных.Колонки.Добавить("ПолноеИмяМетаданных");
ТаблицаСИнформациеОМетаданных.Колонки.Добавить("ИдентификаторОбъектаМетаданных");

Для обработки файлов сначала пробегаем в цикле все каталоги верхнего уровня. А уже после в каждом их них парсим файл XML для каждого отдельного объекта метаданных. Вот такой длинный и примитивный листинг кода получился. Процедура-монстр, но зато работает почти всегда (почти).

 
 Процедура "ТаблицаИдентификаторовОбъектовМетаданных"

Теперь у нас есть таблица идентификаторов и мы можем решить поставленную задачу. Например, вывести идентификаторы в сообщении.

// Та самая задача, ради которой стоит все это делать
Для Каждого Запись ИЗ ТаблицаСИнформациеОМетаданных Цикл
	Сообщить(Запись.ПолноеИмяМетаданных);
	Сообщить(Запись.ИдентификаторОбъектаМетаданных);
КонецЦикла;

Конечно, у этого подхода есть большой минус - мы зависим от запуска конфигуратора, а также не малое время выгрузки конфигурации. А если конфигуратор будет занят в этот момент, то мы получим ошибку. С Мем: "продолжаем разговор" - Все шаблоны - Meme-arsenal.comдругой стороны, операции можно выполнять раз в сутки, а результат сохранять в базе (например, в регистр сведений) и обращаться к нему когда необходимо.

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

Стоит ли того

Все зависит от поставленной задачи и интереса к работе платформы 1С. Но если сомневаетесь, то скорее всего все вышеописанное Вам и не нужно.

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

  • Сохранение в системы контроля версий (внезапно!), таких как GIT.
  • Чтение информации о метаданных сторонними приложениями.
  • Задачи кодогенерации.
  • И многое другое.

А Вы используете выгрузку конфигурации в файлы?

Удачи и успехов в делах!

 
 Будьте в курсе!

Для Вас интересны темы по разработке на платформе 1С и связанные темы по разработке, администрированию? Присоединяйтесь в Telegram-канал, где будет появляться информация о моих новых статьях и разработках на Инфостарт, выходу обновлений, а также некоторые материалы по не1Сной тематике (СУБД, мониторинг, C# и кое-что другое).

Часть материалов, не подходящих сюда по темам, будут выходить на сайте. Там же можно ознакомиться с полным списком разработок для 1С. Думаю, что будет интересно.

Другие ссылки

Авторские разработки (все разработки на одной странице)

 
 Другие разработки (бесплатные и за $m)

метаданные идентификаторы adhoc-solution интересное разработка

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    124887    682    389    

732

Infostart PrintWizard - создание и редактирование печатных форм в 1С 8.3

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    7761    24    6    

42

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 руб.

10.11.2023    4273    12    2    

36

SALE! %

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2280 руб.

14.01.2013    178640    1083    0    

861

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99611    239    97    

298

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18386    6    8    

40

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23855    16    15    

33

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28314    3    10    

16
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. karpik666 3775 05.12.20 21:15 Сейчас в теме
Есть гораздо лучше способ, и без парсинга, просто напишите
СтрокаСГУИД = ЗначениеВСтрокуВнутр(Метаданные.Справочники.ВашиМетаданные)

Проверил, возвращает все-таки не тот гуид.
nekit_rdx; YPermitin; +2
4. пользователь 06.12.20 10:36
(1) да я пытался тоже этим способом. К большому сожалению не получилось (:
+
2. user1503726 05.12.20 21:38 Сейчас в теме
Спасибо. Правильно ли я понимаю, что конвертациях 2-3 гуиды элементов справочника метаданных не обязательно полностью совпадают с гуидами метаданных загруженной конфигурации?
Просто потому что в КД это никак не используется?
+
6. пользователь 06.12.20 10:38
(2) в КД в XML вроде бы выгружаются идентификаторы типов, а не метаданных.
Но я могу ошибаться, давно уже не работал с ней, года 3.
user1503726; +1
3. BackinSoda 06.12.20 00:30 Сейчас в теме
На скриншоте "сохранить конфигурацию в файл", а подразумевалось "выгрузить в файлы"
YPermitin; +1
5. пользователь 06.12.20 10:37
(3) верно.

Рука не то подчеркнула) Поправлю.
+
7. BlizD 1025 06.12.20 10:38 Сейчас в теме
Добрый день, Юрий.

Возможно есть еще 1 вариант получения GUID, это с помощью Tool_1CD в файле OBJECTS.xml поле OBJID



Пример вызова Tool_1CD можно посмотреть вот тут Хранилище 1С. Просмотр истории хранилища обработкой (или тут https://github.com/BlizD/HistoryStorage)
artbear; sapervodichka; user1503726; YPermitin; +4
8. BlizD 1025 06.12.20 10:39 Сейчас в теме
(7) Правда не сверял совпадают ли УИДы с тем, что выгружаются по команде "Выгрузить конфигурацию в файлы"
YPermitin; +1
9. пользователь 06.12.20 10:43
(8) интересная идея

Не пробовал и не проверял, но на будущее возьму на вооружение.
+
18. nvv1970 08.01.21 15:57 Сейчас в теме
(9) Вроде так и есть: можно tool_1CD, если конечно файловая база есть))

А еще можно было не обходить все xml и получать uuid, а получить их все из ConfigDumpInfo.xml регуляркой
Вот ПРИМЕР использования гуидов для анализа ИсторииДанных
+
10. user1503726 06.12.20 12:02 Сейчас в теме
Интересно, получается что в качестве конвертации 4 предлагается ЕДТ. Одновременно открытые конфигурации для настройки обмена данными. А виндоус потянет или как в 98, дескрипторов не хватит?
+
11. Brawler 455 06.12.20 20:53 Сейчас в теме
За 10 лет практики работы с 1С, ещё ни разу не потребовалось знать точные уникальные идентификаторы объектов метаданных.
Хотя и базы ломались, и чинить их приходилось, и на уровне SQL восстанавливал конфигурацию порушенную при динамических обновлениях.
Была и практика объединения десятка баз данных, вернее подключения оных к одному хранилищу конфигураций, а во всех базах исторически сложилось так, что как хотели так и добавляли реквизиты, документы, справочники, где сравнением и объединением, где копипастом...
Было ещё то веселье по созданию гибридных конфигураций содержащих допустим один и тот же документ с разными идентификаторами, перегонял данные со всех как бы некорректных документов в новые, попутно конвертировал и справочники бедовые, где-то из реквизита в реквизит одного объекта данные переносились, регистры, значения перечислений..., в общем к каждой базе нужен был свой подход, но метод был один и тот же, создание гибридной конфы, перенос данных (самописная обработка), подключение к хранилищу и подтягивание оттуда нормальной конфы, все лишние объекты и реквизиты при этом ликвидировались и данные уничтожались самой же платформой. Получилось так все базы к единому знаменателю привести, единой кодовой базе. Трудозатраты на поддержку этого зоопарка баз на порядок уменьшились после этого.

Придуманные выше примеры зачем они могут быть нужны немного натянуты.
Но как просветительская функция у статьи думаю на пользу многим пойдёт.
Ведь действительно уникальные идентификаторы есть не только у непосредственно документов хранящихся в базе, но и у метаданных описывающих их тоже есть уникальные идентификаторы помимо человекочитаемых "ПриходнаяНакладная, ЗаказКлиента...".
nekit_rdx; SlavaKron; Daynestro07; triviumfan; Drivingblind; Merkalov; t278; +7
20. Darklight 32 19.01.21 10:20 Сейчас в теме
(11)Вот, столкнулся как раз с такой проблемой. В разных конфигурациях одни и те же метаданные получили разные UUID - и пришла пора сделать из разных конфигураций ИБ одну. Но при сравнении объединении - проблемы не видно - а после - идёт замещение метаданных одноимёнными но с другим UUID и данные в БД очищаются.

Вот, Вы делали гибридную конфигурацию - это правильно. Но Вы её делали вручную - т.е. сами находили такие метаданные, переименовывали - чтобы после объединения конфигураций получить два разных объекта, а потом переносили данные из одного в другой.

А не нет... Вы по-другому делали - копировали данные из копии базы (хотя тогда я не понял - зачем нужна гибридная конфигурация). Но, всё-равно, Вам, как минимум, Вам нужно было найти те метаданные - которые нужно скопировать (не переносить же все данные базы, когда она измеряется десятками и сотнями гигабайт).

Вот, для поиска - как раз и приходится заморачиваться с UUID метаданных - нужно сравнить две конфигурации - и определить у каких одноимённых метаданных разошлись UUID. А далее - произвести, например, когенерацию скрипта - который сделает гибридную конфигурацию и перенесёт данные из одной базы в другую (или из неё же в неё же), причём нужно не только неправильные объекты перенести, а ещё и ссылки на них выправить (на новые) - мне, кажется, это, всё-таки удобнее делать в одной базе (с гибридной конфигурацией, из которой потом удалить некорректные метаданные).

Вот такую универсальную обработку я сейчас хочу сделать для решения такого рода проблем (как раз возникших у меня).
И я буду именно анализировать UUID метаданных - чтобы найти расхождения (а потом ещё и автоматизировано) создавать гибридную конфигурацию.

Замечу - что проблемы в неправильных UUID могут быть не только в корневых метаданных самих объектов (например у вида Документа или Справочника, или Регистра). Они могут быть и у вложенных членов - реквизиты, табличные части (при совпадении UUID у владельцев) - и такие ситуации тоже нужно находить и выправлять - иначе данные могут быть очищены при сравнении объединении (не говоря уже о загрузке) конфигурации - и это даже не будет там показано - лично я не вижу у себя при сравнении, что у меня у метаданных двух конфигураций разные UUID - из всех изменений мне конфигуратор показывает только "Разный порядок" - и проблема выясняется только потом....
+
22. Brawler 455 19.01.21 12:33 Сейчас в теме
(20) Я выявлял отличия самим же конфигуратором, он позволяет сравнивать конфигурации как по именам так и по внутренним идентификаторам, вот последнее и помогает найти косяки.

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

Когда все данные перенес, удалял лишние виды объекты, реквизиты у нормальных объектов, применял (тут важно уже что может длительная реструктуризация идти, лучше заранее версии объектов например в базе почистить, а то когда их миллионы, то реструктуризация затягивается))) а вот после применения этих изменений база уже готова к работе

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

Во вложении кинул обработку, которой перенос делал, может что-то пригодится, прошу не судить строго, это не коммерческий продукт, он свою цель выполнил и мирно валяется в папке с хламом
Прикрепленные файлы:
ПереносДанныхМеждуСтарымиИНовымиРеквизитами.epf
+
23. Darklight 32 19.01.21 17:18 Сейчас в теме
(22)Спасибо за пояснения. Про сопоставление по идентификаторам при сравнении в конфигураторе я и забыл. За обработку тоже спасибо - как раз так и хотел делать
+
12. dracoola 07.12.20 07:00 Сейчас в теме
Возможно, такое и пригодится в работе. Полезная статья. Бывает ошибка при кривом обновлении. Например,накатывают сразу кучу версий за раз, а регистр один был переименован в ***Удалить и на его место пришёл регистр с таким же названием, но другой структурой. Для расследования подобного (если вдруг когда-то понадобится) думаю пригодится.
+
13. Andrefan 07.12.20 09:51 Сейчас в теме
Спасибо за информацию.
Вопрос на засыпку. Есть ли возможность поменять GUID объекта метаданных (Кроме ручной правки в выгруженных файлах конфигурации)?
Кейс: копи-пастом добавили объект БСП в систему. Ставлю БСП в этой системе на поддержку, объекты сопоставились по имени, встали на поддержку, но GUID объекта в рабочей конфигурации остался старый.
+
14. ellavs 1027 07.12.20 10:06 Сейчас в теме
А Вы используете выгрузку конфигурации в файлы?

Использую постоянно для отслеживания изменений (GIT) на тех проектах, где нет хранилища, и даже если на проекте только один программист в виде меня, самоконтроль тоже нужен :) ну и очень помогает, если нужно восстановить какой-то код, который раньше работал, а после правок перестал ))
Fox-trot; +1
15. oleg-x 26 08.12.20 11:30 Сейчас в теме
Насколько я знаю в EDT можно смотреть гуиды без всяких танцев с бубном, но это при условие что конфигурация соответствует условиям работы в EDT.
+
16. fomix 33 06.01.21 12:55 Сейчас в теме
Может я что-то путаю, но получить ГУИД любого ссылочного объекта в 1Сы, делается так: Объект.СсылкаНаОбъект.УникальныйИдентификатор(). По крайней мере, я именно так его и получаю, когда нужно вставить в хардкорд.
+
17. oleg-x 26 06.01.21 21:38 Сейчас в теме
(16) Тут речь про гуиды самих метаданных, а не объектов.
user785234; +1
19. fomix 33 13.01.21 09:55 Сейчас в теме
(17) А что по вашему мнению такое Метаданные, если не объекты?
+
21. Darklight 32 19.01.21 10:22 Сейчас в теме
(19)Под объектами в (17) имелись в виду объекты элементов данных. А под метаданными - объекты элементов конфигурации
А код
Объект.СсылкаНаОбъект.УникальныйИдентификатор()

Получает UUID ссылки на объект - и формально не является идентификатором ни каких объектов вовсе - это часть (подчёркиваю часть) ключа поиска данных в базе данных (сам фактический ключ несколько длиннее) - формально - это данные скрытого поля из которого формируется встроенный реквизит "Ссылка".

А вот такой функции, увы, не существует
Объект.СсылкаНаОбъект.ПолучитьОбъект().Метаданные().УникальныйИдентификатор()


Как и такой
Справочники.Номенклатура.Метаданные().УникальныйИдентификатор()


или такой

Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура").УникальныйИдентификатор()


В последних двух вариантах данные (и ссылка на данные) даже не фигурируют!
+
24. TimurD 6 10.03.21 17:42 Сейчас в теме
Как то один раз спорил с одним Экспертом (обсуждали план счетов в БП, как чего делать и пр.), говорю, что у каждого объекта метаданных есть свой внутренний GUID. Он говорит: нет, гуиды только у ссылок. На вопрос, как конфигуратор понимает, при обновлении типового релиза, что именно этот объект переименовали - ушел от ответа. Типа чЕ я такие вопросы задаю. А они вот они, GUID'ы... ска
user785234; +1
25. oleg-x 26 10.03.21 17:49 Сейчас в теме
(24) Значит такой эксперт :-) Иначе как минимум бы задумался и возможно бы почитал, если лень, отправил бы изучать этот вопрос самого вопрошающего.
+
26. TimurD 6 10.03.21 17:51 Сейчас в теме
(25) Тому за 45 было. А тут молодой чего лишнее болтает, в неудобное положение перед начальниками ставить. Вот так политика закрывает путь к улучшениям.
+
27. Brawler 455 27.04.21 14:41 Сейчас в теме
Так пища для ума.

Тут 1С запилили КД 3.1+ и там есть теперь поддержка аля формирования правил обмена по методике КД 2.0
И вот автору как пища для ума.
Модифицировать обработку MD83Exp.epf для того чтобы она в результирующий XML файл пихала еще и гуиды объектов метаданных и реквизитов.
Потом нужна будет альтернативная обработка загрузки данных в КД 3.1 (взять за основу типовую) чтобы эти гуиды могла всасывать в базу КД 3.1.
Оправдание тому, что такая обработка нужна следующее.
В современном мире в базы мы начали пихать расширения, добавляющие объекты и реквизиты к типовым объектам...
Выгружая же структуру в XML для EDT, приходится выгружать отдельно расширения и основную конфу.
Как это все одним целым (как одну конфигурацию) всосать в КД 3.1 я не разобрался...

Если использовать типовую MD83Exp.epf то она всю структуру базы как единое целое выгружает (то есть с учетом расширений), что очень удобно при пилежке правил обмена в КД 2.0.
КД 3.1 умеет сопоставлять объекты по уникальным идентификаторам.
Актуальность использования КД 3.1 возрастает с учетом придуманного 1С механизма обновления баз данных через копий баз данных, очень актуально для больших баз.
И вот старый добрый MD83Exp.epf (с доработками) + выгруженные в XML для EDT структуры расширений и основной конфы могли бы дать входящие данные для КД 3.1 с уникальными идентификаторами, где потом проще было бы правила пилить для баз с доработками, и потом постепенно при помощи них переносить в копию базы уже обновленную на новый релиз, измененные юзерами данные в старой базе (пока еще рабочей)
+
28. yurowski 33 03.06.22 11:56 Сейчас в теме
Здравствуйте.
У меня ошибка в куске

// Ищем объект метаданных по частям имени из XML.
// Это нужно для получения нормализованного имени
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяТипаМетаданных + "." + ИмяОбъектаМетаданных);
ПолноеИмяМетаданных = ОбъектМетаданных.ПолноеИмя();


Т.к. ИмяТипаМетаданных приходит на английском, а в Метаданные они на русском.
Как можно преобразовать нет мыслей?
+
39. kuzyara 1911 06.02.24 07:58 Сейчас в теме
(28)недавно пробовал
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени("AccumulationRegister.АвансовыеПлатежиИностранцевПоНДФЛ");
отлично отрабатывает, возвращает объект метаданных как и ожидалось

8.3.14+
+
29. Serg2000mr 317 16.03.23 21:56 Сейчас в теме
(0) А можно ли как-то эти метаданные без конфигуратора получить из SQL-базы прямыми запросами?
+
30. oleg-x 26 17.03.23 09:17 Сейчас в теме
(29) Можно. Структура метаданных (насколько помню) храниться в отдельной таблице.
+
31. Serg2000mr 317 17.03.23 09:22 Сейчас в теме
(30) Таблица config с колонками filename и binarydata
Вопрос, как это все расшифровать
+
32. oleg-x 26 17.03.23 09:43 Сейчас в теме
33. Serg2000mr 317 17.03.23 11:08 Сейчас в теме
(32) То что надо, спасибо!
+
34. Serg2000mr 317 17.03.23 18:17 Сейчас в теме
(0) Вот, нашли еще один способ добывать идентификаторы - из самой базы в формате SQL
+
35. Umka23 12 26.08.23 15:23 Сейчас в теме
Откройте конфигуратор. Нажмите Сервис - Параметры - (вкладка ) Запуск 1С:Предприятия. В поле Параметр запуска в нижней части окна впишите /С ЗапуститьОбновлениеИнформационнойБазы нажмите клавишу Tab слева на клавиатуре, затем кнопку Применить в окне программы. Тут же в конфигураторе нажмите кнопку запустить 1С предприятие. Она в Сервис - 1С:Предприятие программа запустится и обновит справочник ИдентификаторыОбъектовМетаданных
Прикрепленные файлы:
+
36. Serg2000mr 317 09.11.23 22:26 Сейчас в теме
(35) В этом справочнике нет ГУИДов
+
37. Serg2000mr 317 11.11.23 22:49 Сейчас в теме
(0) Выгрузка с ключами
/DumpConfigToFiles "c:\ПутьККаталогуВыгрузки" -configDumpInfoOnly 

позволяет выгрузить только файл ConfigDumpInfo.xml, который содержит ГУИДы всего дерева метаданных. Это значительно сократит время выгрузки, особенно на больших конфигурациях типа ERP.
+
38. Serg2000mr 317 13.11.23 04:53 Сейчас в теме
Вот такой код работает гораздо быстрее
&НаСервере
Процедура ТаблицаИдентификаторовОбъектовМетаданных(ПутьКФайлу_configDumpInfo_xml)
	
	хмл = Новый ЧтениеXML;
	хмл.ОткрытьФайл(ПутьКФайлу_configDumpInfo_xml);
	хмл.Прочитать();
	
	Построитель = Новый ПостроительDOM;
	ДокDOM = Построитель.Прочитать(хмл);
	
	Разыменователь = Новый РазыменовательПространствИменDOM(ДокDOM);
	Выражение = ДокDOM.СоздатьВыражениеXPath("/xmlns:ConfigDumpInfo/xmlns:ConfigVersions/xmlns:Metadata", Разыменователь);
	Результат = Выражение.Вычислить(ДокDOM);
	

	ТаблицаСИнформациейОМетаданных = Новый ТаблицаЗначений;
	ТаблицаСИнформациейОМетаданных.Колонки.Добавить("ПолноеИмяМетаданных");
	ТаблицаСИнформациейОМетаданных.Колонки.Добавить("ИдентификаторОбъектаМетаданных");
	
	СоотвИменМета = Новый Соответствие;
	
	Пока Истина Цикл
		Узел = Результат.ПолучитьСледующий();
		Если Узел = Неопределено Тогда
			Прервать;
		КонецЕсли;
		
		ИмяМета = Узел.Атрибуты[0].Значение;
		Если СтрЧислоВхождений(ИмяМета, ".") > 1 Тогда
			Продолжить;
		КонецЕсли;
		
		НоваяСтрока = ТаблицаСИнформациейОМетаданных.Добавить();
		НоваяСтрока.ПолноеИмяМетаданных = ПолучитьИмяМетаданных(СоотвИменМета, ИмяМета);
		НоваяСтрока.ИдентификаторОбъектаМетаданных = Узел.Атрибуты[1].Значение;
		
	КонецЦикла;
	
	ТаблицаСИнформациейОМетаданных.Индексы.Добавить("ПолноеИмяМетаданных");
	
КонецПроцедуры

&НаСервере
Функция ПолучитьИмяМетаданных(СоотвИменМета, ИмяМетаданных) 
	
	ЧастиИмени = СтрРазделить(ИмяМетаданных, ".", Ложь);
	ИмяТипаМетаданныхАнгл = ЧастиИмени[0];
	ИмяОбъектаМетаданных = ЧастиИмени[1];
	
	ИмяТипаМетаДанныхРус = СоотвИменМета[ИмяТипаМетаданныхАнгл];
	Если ИмяТипаМетаДанныхРус = Неопределено Тогда
		ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяМетаданных);
		ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
		ИмяТипаМетаДанныхРус = СтрРазделить(ПолноеИмя, ".", Истина)[0];
		СоотвИменМета.Вставить(ИмяТипаМетаданныхАнгл, ИмяТипаМетаДанныхРус); 
	КонецЕсли;
	
	Возврат ИмяТипаМетаДанныхРус + "." + ИмяОбъектаМетаданных;
	
КонецФункции
Показать
+
Оставьте свое сообщение