Исправление идентификаторов метаданных в конфигурации 1С

27.08.24

Разработка - Механизмы платформы 1С

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

Введение

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

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

 

Идентификаторы метаданных в 1С

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

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

 

Как появляются проблемы с идентификаторами метаданных

Несоответствие идентификаторов может произойти в нескольких случаях:

  • Если разработчик выполняет копирование метаданных из другой конфигурации, используя простое копирование и вставку (Ctrl+C, Ctrl+V), внутренние идентификаторы не переносятся. Вместо этого создаются новые идентификаторы для каждого объекта метаданных. Это часто происходит, когда разработчик ленится ждать и избегает выполнения длительных операций сохранения конфигурации в файл и последующего сравнения или объединения с целевой конфигурацией.
  • Если метаданные переносятся с использованием функции сравнения и объединения конфигураций, и установлен флаг "Режим копирования", то внутренние идентификаторы метаданных также переносятся и остаются равными оригинальным. 

Проблема усугубляется тем, что в конфигураторе 1С идентификаторы не отображаются, а метаданные визуально выглядят идентично — переносятся и структура, и типы, и тексты модулей. Это создает ложное впечатление, что все работает корректно. Однако несоответствие идентификаторов — это как мина замедленного действия, которая может в будущем вызвать серьезные проблемы, такие как потеря данных при обновлении конфигурации.

Также различия в идентификаторах можно увидеть, если запустить режим простого сравнения конфигураций (отдельный режим без возможности объединения) и снять галку "Устанавливать соответствия по именам...". Или выполнить сравнение с конфигурацией БД. Эти методы помогают выявить и исправить проблемы заранее.

 

Методы сравнения метаданных в зависимости от операции

Операция Метод сравнения
Сравнение/объединение с файлом Сначала по имени, затем по идентификатору
Сравнение/объединение с конфигурацией хранилища По идентификаторам
Сравнение/объединение с конфигурацией БД По идентификаторам
Сравнение/объединение с конфигурацией поставщика По идентификаторам, с учетом запомненных ранее соответствий
Сравнение (без объединения - есть такая отдельная операция :-Ж ) Любой режим по идентификаторам или по именам (см скрин ниже)

 

Исправление идентификаторов метаданных

Итак, как исправить неверные идентификаторы в вашей конфигурации? 

Допустим, у нас есть рабочая база с верными идентификаторами, и база разработки с неверными идентификаторами

 
 Если разработка введется в базе не подключенной к хранилищу, тут все просто:
  1. Выгружаем конфигурацию из базы с правильными идентификаторами (как правило, рабочая база) в файл правильный.cf
  2. Сохраняем конфигурацию разработки в файл неправильный.cf
  3. Загружаем полностью конфигурацию из файла правильный.cf через меню "конфигурация-загрузить конфигурацию из файла", тем самым полностью перетираем нашу конфигурацию разработки.
  4. Через операцию Сравнения/объединения с файлом возвращаем все наши доработки в текущую конфигурацию

 

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

В таком случае маневр кроется в том, что нам надо "затолкать" конфигурацию с верными идентификаторами в конфигурацию базы данных нашей базы разработки. Тут 2 путя:

или

 
 если нам нельзя или не дадут копию рабочей базы для разработки, но могут дать только конфигурацию рабочей БД, назовем ее правильный.cf
  1. Отключаемся от хранилища разработки
  2. Загружаем полностью конфигурацию из файла правильный.cf через меню "конфигурация-загрузить конфигурацию из файла", тем самым полностью перетираем нашу конфигурацию разработки
  3. Обновляем конфигурацию БД (F7)
  4. Подключаемся заново к хранилищу разработки, но не обновляем конфигурацию БД
  5. Захватываем объекты с неверными идентификаторами, чтобы была возможность удалить и создать новые метаданные или их реквизиты/измерения итд (или все сразу, вместе с корнем, если вы можете себе это позволить :-Ж )
  6. Запускаем сравнение/объединение с конфигурацией БД: меню "Конфигурация-Конфигурация БД-Сравнить/объединить с конфигурацией БД"
  7. Включаем опцию "Разрешать удалять объекты" в настройках сравнения
  8. И сразу видим расхождения в одноименных метаданных. 
    (на месте замков должны быть чекбоксы, но мне лень делать другой скрин)
  9. Верные объекты отмечаем для добавления, а неверные — для удаления.
  10. Выполняем операцию объединения
  11. Помещаем изменения в хранилище. При этом в истории хранилища вы увидите что одни объекты удалились, а другие создались.

или

 
 если нам дадут копию рабочей базы для разработки
  1. Заменяем базу разработки копией рабочей базы. Не забывая, естественно, поместит доработки в хранилище или в отдельный файл.
  2. Подключаемся заново к хранилищу разработки, но не обновляем конфигурацию БД
  3. Захватываем объекты с неверными идентификаторами, чтобы была возможность удалить и создать новые метаданные, или их реквизиты/измерения итд (или все сразу, вместе с корнем, если вы можете себе это позволить :-Ж )
  4. Запускаем сравнение/объединение с конфигурацией БД: меню "Конфигурация-Конфигурация БД-Сравнить/объединить с конфигурацией БД"
  5. Включаем опцию "Разрешать удалять объекты" в настройках сравнения.
  6. И сразу видим расхождения в одноименных метаданных. 

    (на месте замков должны быть чекбоксы, но мне лень делать другой скрин)
  7. Верные объекты отмечаем для добавления, а неверные — для удаления.
  8. Выполняем операцию объединения
  9. Помещаем изменения в хранилище. При этом в истории хранилища вы увидите что одни объекты удалились, а другие создались.

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

 

Вместо итога

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

Всем бобра :-)

Платформа Метаданные Уникальные идентификаторы метаданных Конфигурация

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7424    bayselonarrend    20    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5938    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    17644    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11216    dsdred    44    

130

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23752    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18821    human_new    27    

80

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    14726    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. PerlAmutor 155 28.08.24 06:42 Сейчас в теме
Частичная загрузка из XML работает с подключенными к хранилищу конфигурациями, можно через неё попробовать сделать. Но сначала проделать это на базе разработки для того, чтобы убедиться, что все корректно. Частичную выгрузку/загрузку можно попробовать сделать через ИР. Я так исправлял идентификаторы предопределенных данных плана счетов.
2. Andronovy 31 28.08.24 07:51 Сейчас в теме
Допустим, у нас есть рабочая база с не верными идентификаторами, и хранилище с конфигурацией поставщика, например БП. Идентификаторы поставщика считаем эталонными. Рабочая обновляется через cf, выпускаемый из сборочной базы через поставку. Сборочная база к хранилищу не подключена, в неё переносят только нужное для релиза. И иногда через копипаст.

Итого: в конфигурации рабочей базы идентификаторы метаданных не соответствуют идентификаторам в хранилище, например Регистр Хозрасчётный.

Как можно уровнять идентификаторы рабочей и поставщика в хранилище без потери данных?
Можно ли подменить гуид хозрасчётного в рабочей базе, если известен правильный гутд поставщика? Как?
3. rozer 311 28.08.24 08:54 Сейчас в теме

Если метаданные переносятся с использованием функции сравнения и объединения конфигураций, и установлен флаг "Режим копирования", то внутренние идентификаторы метаданных также переносятся и остаются равными оригинальным.


в доке немного не так от слова совсем...


По умолчанию при объединении конфигурации объекты, отсутствующие в основной конфигурации, добавляются в нее с теми идентификаторами, которые существуют у них в загружаемой конфигурации.
Установка флажка Режим копирования объектов... позволяет выполнять добавление новых объектов по правилам, существовавшим в предыдущих версиях платформы: при добавлении объектов, отсутствующих в основной конфигурации, для них всегда генерируются новые идентификаторы.
При нажатии кнопки ОК производится повторное сравнение с учетом выбранной настройки.
Olenevod; +1 Ответить
4. rozer 311 28.08.24 09:34 Сейчас в теме
оставлю тут для полноты повествования это https://its.1c.ru/db/metod8dev/content/2291/hdoc
5. acces969 362 28.08.24 11:00 Сейчас в теме
Ни разу не было такого, чтобы очищались таблицы БД при загрузке/сравнении конфигурации. И на старых платформах, и на новых. Вот дублирование реквизитов, даже с типовыми конфигурациями - постоянно.
6. kuzyara 2090 28.08.24 12:51 Сейчас в теме
Совет: Перед применением изменений в рабочей базе выполняйте сравнение/объединение с конфигурацией базы данных. Этот шаг поможет выявить и исправить возможные расхождения в идентификаторах метаданных
с идентификаторами предопределённых элементов не поможет)

Была задача, дублировались предопределённые элементы при сравнении/объединении, написал тест для этого в своё время:
# language: ru
Функционал: Проверка предопределённых переключателей функциональности
	Как программист
	Я хочу запретить вручную создавать предопределённые элементы в релизном хранилище
	Чтобы при сравнении-объединении не дублировались элементы справочника

Сценарий: Получить идентификаторы предопределённых из release и master и сравнить их
    Когда Выполнить шелл скрипт получения предопределённых элементов
	Тогда Проверить идентичность идентификаторов
Показать
реализация
//Когда Выполнить шелл скрипт получения предопределённых элементов
//@ВыполнитьШеллСкриптПолученияПредопределённыхЭлементов()
Процедура ВыполнитьШеллСкриптПолученияПредопределённыхЭлементов() Экспорт
	КаталогПроекта = Лев(Ванесса.КаталогФич, Найти(Ванесса.КаталогФич, "\features")-1);
	
	СоздатьКаталог(КаталогПроекта + "\temp");
	УдалитьФайлы(КаталогПроекта + "\temp\release");
	
	//КаталогВременных = КаталогПроекта + "temp";
	ТекстКоманды = СтрШаблон("""C:\Program Files\Git\bin\bash.exe"" --cd=""%1"" -i -c ""git archive -o ./temp/release.zip origin/release ./src/cf/*/Predefined.xml""", КаталогПроекта);
	ЗапуститьПриложение(ТекстКоманды, КаталогПроекта, Истина);
	
	// появились файлы xml
	КаталогRelease = Новый Файл(КаталогПроекта + "\temp\release.zip");
	КаталогMaster = Новый Файл(КаталогПроекта + "\src\cf");
	
	Если НЕ КаталогRelease.Существует() Тогда
		ВызватьИсключение "Отсутствует каталог " + КаталогRelease.ПолноеИмя;
	КонецЕсли;
	
	// в версии 8.3.23 при попытке разархивировать пустой архив
	// возникает ошибка
	Попытка
		Архив = Новый ЧтениеZipФайла(КаталогRelease.ПолноеИмя); 
		Архив.ИзвлечьВсе(КаталогПроекта + "\temp\release",
		РежимВосстановленияПутейФайловZIP.Восстанавливать);
	Исключение
	КонецПопытки;

КонецПроцедуры

//Тогда Проверить идентичность идентификаторов
//@ПроверитьИдентичностьИдентификаторов()
Процедура ПроверитьИдентичностьИдентификаторов() Экспорт
	КаталогПроекта = Лев(Ванесса.КаталогФич, Найти(Ванесса.КаталогФич, "\features")-1);

	// появились файлы xml
	КаталогRelease = КаталогПроекта + "\temp\release";
	КаталогMaster = КаталогПроекта;
	
	ТаблицаПредопределённыхRelease = РаспарситьПредопределённые(КаталогRelease);
	ТаблицПредопределённыхMaster = РаспарситьПредопределённые(КаталогMaster);
	
	ТекстОшибки = "";
	Для Каждого ЭлементRelease Из ТаблицаПредопределённыхRelease Цикл
		Отбор = Новый Структура;
		Отбор.Вставить("ИмяФайла", ЭлементRelease.ИмяФайла);
		Отбор.Вставить("ИмяПредопределенныхДанных", ЭлементRelease.ИмяПредопределенныхДанных);
		Найденные = ТаблицПредопределённыхMaster.НайтиСтроки(Отбор);
		Если Найденные.Количество() <> 0 Тогда
			ЭлементMaster = Найденные[0];
			// сравним гуид в релизном и гуид в мастере
			Если ЭлементMaster.ИдентификаторМетаданных <> ЭлементRelease.ИдентификаторМетаданных Тогда
				 ТекстОшибки = ТекстОшибки
					+ ЭлементRelease.ИмяФайла +
					" - " + ЭлементRelease.ИмяПредопределенныхДанных
					+ ", ожидали " + ЭлементMaster.ИдентификаторМетаданных
					+ ", а получили " + ЭлементRelease.ИдентификаторМетаданных + Символы.ПС;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ВызватьИсключение "Различаются идентификаторы предопределённых переключателей функциональности для релизного и мастера:
			| См. подробнее: https://wiki.rossko.ru/pages/viewpage.action?pageId=66363995 
			|" + ТекстОшибки;
	КонецЕсли;
КонецПроцедуры

// Парсинг Predefined.xml
//
// Пример входных данных:
//
//<?xml version="1.0" encoding="UTF-8"?>
//<PredefinedData xmlns="http://v8.1c.ru/8.3/xcf/predef" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CatalogPredefinedItems" version="2.6">
//	<Item id="c3ff4689-a1a3-430c-a51a-9244829f88f0">
//		<Name>АКласс</Name>
//		<Co de>000000001</Co de>
//		<Description>A - класс</Description>
//		<IsFolder>false</IsFolder>
//	</Item>
//
Функция РаспарситьПредопределённые(Каталог)
	тз = новый таблицазначений;
	тз.колонки.добавить("ИмяПредопределенныхДанных");
	тз.колонки.добавить("ИдентификаторМетаданных");
	тз.колонки.добавить("ИмяФайла");
	
	тз.Индексы.Добавить("ИмяПредопределенныхДанных");
	
	МассивФайлов = НайтиФайлы(Каталог + "\src\cf", "Predefined.xml", Истина);
	Для Каждого ТекФайл Из МассивФайлов Цикл
		ПутьФайла = Сред(ТекФайл.ПолноеИмя, СтрНайти(ТекФайл.ПолноеИмя, "\src\cf"));
		Парсер = Новый ЧтениеXML;
	    Парсер.ОткрытьФайл(ТекФайл.ПолноеИмя);
		Пока Парсер.Прочитать() Цикл
			Если 
	            Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И Парсер.Имя = "Item"
	        Тогда
	            Название = Парсер.ЗначениеАтрибута("id");
	            Если Название <> Неопределено Тогда
	                //Сообщить("== " + Название + " ==");
					Парсер.Прочитать();
					Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И Парсер.Имя = "Name" тогда
						Парсер.Прочитать();
	                    Если Парсер.ТипУзла = ТипУзлаXML.Текст Тогда
	                        //Сообщить(Парсер.Значение);
							НоваяСтрока = тз.ДОбавить();
							НоваяСтрока.ИдентификаторМетаданных = Название;
							НоваяСтрока.ИмяПредопределенныхДанных = Парсер.значение;
							НоваяСтрока.ИмяФайла = ПутьФайла;
	                    КонецЕсли;                
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	Возврат ТЗ;
КонецФункции
Показать
Olenevod; +1 Ответить
12. Olenevod 33 31.08.24 14:59 Сейчас в теме
7. пользователь 28.08.24 12:58
Сообщение было скрыто модератором.
...
8. kalyaka 1105 28.08.24 13:31 Сейчас в теме
Общий вывод такой: если идентификаторы разъехались, то единственный вариант исправления - удалить прежний объект метаданных и восстановить новый путем объединения конфигураций.

Непонятно только для чего в ЕДТ предлагается сделать замену идентификатора, если при этом рушится валидность конфигурации.
9. Xershi 1555 28.08.24 23:35 Сейчас в теме
(8) была похожая ситуация. Франч накатывал обновления без обновления конфигурации поставщика. Так релизов 10. Итог моя база разработки не могла обновиться с рабочей через хранилище.
Накатил на базу для разработки 10 релизов как положено и затем рабочая база нормально подключилас6к хранилищу и дальше уже пошло как положено.
10. RustIG 1747 29.08.24 09:41 Сейчас в теме
(9)
Накатил на базу для разработки 10 релизов как положено

на какой платформе такое было?
я недавно расширение с одного релиза БП на другой релиз БП не смог поставить - куча таблиц вдогонку вместе с расширением хранится, при установке на другой релиз БП конфликты с таблицами начались - ошибка СУБД...Пришлось сначала релиз БП обновить до совпадения, и сразу расширение село как надо.
Платформа 8.3.24.1624, при обновлении БП пришлось еще развернуть платформу 8.3.25.1374.

Раньше подобного поведения не замечал - ранее я мог расширения копировать и переносить на другие релизы конфигурации.
11. Xershi 1555 29.08.24 12:50 Сейчас в теме
(10) я же написал проблема не в платформе, а в кривом франче, ему видите так удобнее обновлять...
В интернете встречал статью что не только мой так грешит...
Но в общем то нам больше работы с другой стороны.
Ну я метаданные в расширение стараюсь не гнать максимум константы, где режим позволяет и регистры сведений.
А на 25 релизе есть косяк с тии. Статью планирую выпустить, руки не дошли сезон картошки пока.
Оставьте свое сообщение