HelpF.pro

Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID

Когда кто-то удаляет данные из базы без проверки ссылок на эти объекты, то везде где этот объект использовался появляется сообщение вида: <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824) .
title
В данной статье я опишу пример быстрого восстановления данных.

Для пользователя:
Скачиваете эту обработку восстановления объектов по GUID :
Для 1С 8.1:
здесь или Скачивать файлы может только зарегистрированный пользователь!
Для 1С 8.2:
Скачивать файлы может только зарегистрированный пользователь!

!!! Новая Версия!!! 8.2 и 8.3 - Скачивать файлы может только зарегистрированный пользователь! Подробное описание: Объект не найден в 1С или про Битые ссылки 1С

и открываете ее в программе:
1. Копируем фразу <Объект не найден... и вставляем в поле Объект не найден, жмем на кнопку GUID -> и получаем 05dbe824-a4c6-11dd-bf56-00145e3710ab
title

2. Если Вы знаете что удалили, то можете сразу нажать кнопку Создать Объект Из GUID - Пункт 4.
3. Если Вы не знаете что удалили, тогда вам нужно поднять архивную копию базы, открыть там обработку и вставить полученный GUID в поле GUID.
далее нажать Ссылку -> и в правом поле отобразится необходимый Вам объект(в моем случае Попов Роман Владимирович).
Открыв его, узнаем что это справочник Сотрудники и всю содержащуюся в справочнике информацию. Возвращаемся в базу, где необходимо восстановить объект и жмем кнопку Создать Объект Из GUID
title
4. Из открывшегося списка выбираем Справочник Сотрудники, в открывшейся форме заполняем все поля данными из архивной базы и жмем OK. Все, данный объект восстановлен.

Для быстрого поиска всех <Объект не найден> используйте Поиск в базе битых ссылок - "объект не найден"



Для программиста:
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х
  ГУИДССЫЛКИ	= СсылкаНаОбъект.УникальныйИдентификатор();    


Для того чтобы преобразовать <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824) в УникальныйИдентификатор (GUID)
Код 1C v 8.х
 	// ГУИДУдОбъкта =  <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824)
	ГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъкта,"<Объект не найден> (","");
	ГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъктаСтр,")","");
	ГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъктаСтр,"0x","");
	ГУИДУдОбъктаСтр = Сред(ГУИДУдОбъктаСтр, Найти(ГУИДУдОбъктаСтр,":")+1, СтрДлина(ГУИДУдОбъктаСтр));
	// Преобразуем GUID
	ГУИД = Сред(ГУИДУдОбъктаСтр,25,8)+"-"+Сред(ГУИДУдОбъктаСтр,21,4)+"-"+Сред(ГУИДУдОбъктаСтр,17,4)+"-"+Сред(ГУИДУдОбъктаСтр,1,4)+"-"+Сред(ГУИДУдОбъктаСтр,5,12);			//и получаем ГУИД = 05dbe824-a4c6-11dd-bf56-00145e3710ab    


Для получения ссылки по уникальному идентификатору, используйте код:
Код 1C v 8.х
  	// ГУИД = 05dbe824-a4c6-11dd-bf56-00145e3710ab  
	// Ссылка будет установлена в переменную СсылкаНаОбъектГуид
	УникальныйИдентификатор = Новый УникальныйИдентификатор(ГУИД)
	// все объекты по которым можно получить ссылку
	Если ПолучитьСсылкуНоМенеджеруОбъекта(Справочники,УникальныйИдентификатор) Тогда
	ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(Документы,УникальныйИдентификатор) Тогда
	ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(ПланыВидовХарактеристик,УникальныйИдентификатор) Тогда
	ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(ПланыСчетов,УникальныйИдентификатор) Тогда
	ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(ПланыОбмена,УникальныйИдентификатор) Тогда
	ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(БизнесПроцессы,УникальныйИдентификатор) Тогда
	ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(Задачи,УникальныйИдентификатор) Тогда
	КонецЕсли;
	
	// ПолучитьСсылкуНоМенеджеруОбъекта()
	Функция ПолучитьСсылкуНоМенеджеруОбъекта(ОбъектыМенеджер,УникальныйИдентификатор)
	Для Каждого Менеджер Из ОбъектыМенеджер Цикл
		СсылкаНаОбъектГуид = Менеджер.ПолучитьСсылку(УникальныйИдентификатор);
		
		Если СсылкаНаОбъектГуид.ПолучитьОбъект() <> Неопределено Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	Возврат Ложь;	
	КонецФункции
   


Создать объект документ или справочник и установить ему свой Уникальный идентификатор
Код 1C v 8.х
 	// ТекGUID = 05dbe824-a4c6-11dd-bf56-00145e3710ab 
 		Попытка
			УникальныйИд = Новый УникальныйИдентификатор(ТекGUID);
		Исключение
			Возврат;
		КонецПопытки;
		КартинкаСпр=БиблиотекаКартинок.Справочник;
		КартинкаДок=БиблиотекаКартинок.Документ;
		СписокВыбора	= Новый СписокЗначений;
		СписокВыбора.Добавить(null,"СПРАВОЧНИКИ");
		Для каждого ЭлементМетаданных Из Метаданные.Справочники Цикл
			Структурка=Новый Структура;
			Структурка.Вставить("Имя",ЭлементМетаданных.Имя);
			Структурка.Вставить("Тип",1);
			СписокВыбора.Добавить(Структурка,ЭлементМетаданных.Синоним,,КартинкаСпр);
		КонецЦикла;
		СписокВыбора.Добавить(null,"ДОКУМЕНТЫ");
		Для каждого ЭлементМетаданных Из Метаданные.Документы Цикл
			Структурка=Новый Структура;
			Структурка.Вставить("Имя",ЭлементМетаданных.Имя);
			Структурка.Вставить("Тип",2);
			СписокВыбора.Добавить(Структурка,ЭлементМетаданных.Синоним,,КартинкаДок);
		КонецЦикла;
		Результат=СписокВыбора.ВыбратьЭлемент("Выберите тип ссылки");
		Если Результат=Неопределено Тогда
			Возврат;
		КонецЕсли;
		Структурка=Результат.Значение;
		Если Структурка=null Тогда
			Возврат;
		КонецЕсли;
		
		НовыйОбъект=Неопределено;
		Если Структурка.Тип=1 Тогда
			Объект=Справочники[Структурка.Имя].СоздатьЭлемент();
			Объект.ОбменДанными.Загрузка=Истина;
			Объект.УстановитьСсылкуНового(Справочники[Структурка.Имя].ПолучитьСсылку(УникальныйИд));
		Иначе
			Объект=Документы[Структурка.Имя].СоздатьДокумент();
			Объект.ОбменДанными.Загрузка=Истина;
			Объект.УстановитьСсылкуНового(Документы[Структурка.Имя].ПолучитьСсылку(УникальныйИд));
		КонецЕсли;
		
		Форма=Объект.ПолучитьФорму();
		Форма.Открыть();
   


Для 1С 7.7 смотрите:
Технология восстановления удаленных объектов или элементов в 1С 7.7

еще можно получить ИдентификаторДокумента при OLE доступе:
Код 1C v 7.x
 Если Док_Источник.ВыбратьДокументы(ВыбНачПериода,ВыбКонПериода) = 1 Тогда
    Пока Док_Источник.ПолучитьДокумент() = 1 Цикл
Объект = БазаОле.ЗначениеВстрокуВнутр(Док_Источник.ТекущийДокумент());
ИдентификаторДокумента = СокрЛП(ПолучитьИД(Объект));

//   Для примера Объект возвращает {"O","0","0","3114","0","0","    258156CB "}, 
//   а ПолучитьИД(объект) = 258156CB
КонецЦикла; 


Еще посмотрите метод:
ЗначениеВСтрокуВнутр(<?>);
Синтаксис:
ЗначениеВСтрокуВнутр(<Объект>)
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
<Объект> - значение объекта агрегатного типа данных которое нужно преобразовать.
Подробнее см. в документации, глава ''Системные процедуры и функции''
Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq8/view/483.html