helpf.pro
Регистрация
 +14 
Распечатать

Поиск в базе битых ссылок - объект не найден

В статье Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID мы обсуждали как востановить битые ссылки!
А вот как найти в базе все битые ссылки, которые имеют вид типа "<Объект не найден> (137:8b270030482898d011daad3cc45fc830)"?

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



Для программиста:
Код 1C v 8.х
 Процедура КнопкаВыполнитьНажатие(Кнопка)
	
	ИспользоватьОграничение = ЗначениеЗаполнено(ОграничениеТипов);
	РезультатПоиска.Очистить();
	Для Каждого ОбъектыМетаданных Из КоллекцияОбъектов Цикл
		Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
			Состояние(ОбъектМетаданных.ПолноеИмя());
			ПроверитьОбъектНаБитыеСсылки(ОбъектМетаданных);
		КонецЦикла;
	КонецЦикла;
	Для Каждого ОбъектыМетаданных Из КоллекцияРегистров Цикл
		Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
			Состояние(ОбъектМетаданных.ПолноеИмя());
			ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных);
		КонецЦикла;
	КонецЦикла;
	//Анализ последовательностей
	
	//ПроверитьОбъектНаБитыеСсылки(Метаданные.Справочники.СотрудникиОрганизаций);
	
КонецПроцедуры

Процедура ВывестиДанные(ТекстЗапроса)
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Попытка 
		РезультатЗапроса = Запрос.Выполнить();
		Если Не РезультатЗапроса.Пустой() Тогда
			ТЗ = РезультатЗапроса.Выгрузить();
			Для Каждого Стр Из ТЗ Цикл
				ОбработкаПрерыванияПользователя();
				Строка = РезультатПоиска.Добавить();
				ЗаполнитьЗначенияСвойств(Строка, Стр);
			КонецЦикла;
		КонецЕсли;
	Исключение
		Сообщить(ИнформацияОбОшибке().Описание + " " + ИнформацияОбОшибке().Причина);
	КонецПопытки;
	
КонецПроцедуры

Процедура ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных)
	
	ИмяТаблицы = ОбъектМетаданных.ПолноеИмя();
	Если Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда
		Если ОбъектМетаданных.РежимЗаписи = НезависимыйРежимЗаписи Тогда
			//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Измерения, ИмяТаблицы);
			//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Ресурсы, ИмяТаблицы);
			//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
			Возврат;
		КонецЕсли;
		АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
	КонецЕсли;
	АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Измерения, ИмяТаблицы);
	АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
	
	АнализРегистратораРегистра(ОбъектМетаданных, ИмяТаблицы);
	
	Если Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда
		//Для рег. бухгалтерии анализ субконто
		
	КонецЕсли;
	Если Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда
		//Для регистров расчета доп. анализ
	КонецЕсли;

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

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

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

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

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

Функция ПолучитьСписокРегистраторов(ОбъектМетаданных)
	
	МассивРегистраторов = Новый Массив;
	МенеджерОбъект = ПолучитьМенеджерОбъекта(ОбъектМетаданных);
	Если МенеджерОбъект <> Неопределено Тогда
		НаборЗаписей = МенеджерОбъект.СоздатьНаборЗаписей();
		ЭлементОтбора = НаборЗаписей.Отбор.Регистратор;
		МассивРегистраторов = ЭлементОтбора.ТипЗначения.Типы();
	КонецЕсли;
	Возврат МассивРегистраторов;
	
КонецФункции

Функция ПолучитьМенеджерОбъекта(ОбъектМетаданных)
	
	Перем МенеджерОбъекта;
	Если Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда
		МенеджерОбъекта = РегистрыБухгалтерии[ОбъектМетаданных.Имя];
	ИначеЕсли Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда
		МенеджерОбъекта = РегистрыНакопления[ОбъектМетаданных.Имя];
	ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда
		МенеджерОбъекта = РегистрыСведений[ОбъектМетаданных.Имя];
	ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда
		МенеджерОбъекта = РегистрыРасчета[ОбъектМетаданных.Имя];
	КонецЕсли;
	Возврат МенеджерОбъекта;
	
КонецФункции

Функция ПоискПоТипу(ИмяТипа)
	
	Результат = Ложь;
	Если ИспользоватьОграничение Тогда
		МассивСтрок = ОграничениеТипов.НайтиСтроки(Новый Структура("ТипДанных", ИмяТипа));
		Если ЗначениеЗаполнено(МассивСтрок) Тогда
			Результат = Истина;
		КонецЕсли;
	КонецЕсли;
	Возврат Результат;
	
КонецФункции

Процедура ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
	
	Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект, 
			|	""" + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник, 
			|	Об.Регистратор КАК ОбъектИсточник,
			| 	" + ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита) + " 
			|ИЗ 
			|	" + ИмяТаблицы + " КАК Об
			|ГДЕ " + ДобавитьУсловия(ИмяРеквизита, ТипРеквизита);
	ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), "", Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + Текст;	
	
КонецПроцедуры

Процедура ДобавитьВЗапросОбъект(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
	
	Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект, 
			|	""" + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник, 
			|	Об.Ссылка КАК ОбъектИсточник,
			| 	" + ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита) + " 
			|ИЗ 
			|	" + ИмяТаблицы + " КАК Об
			|ГДЕ " + ДобавитьУсловия(ИмяРеквизита, ТипРеквизита);
	ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), "", Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + Текст;
	
КонецПроцедуры

Функция ДобавитьУсловия(ИмяРеквизита, ТипРеквизита)
	
	мдОбъекта = Метаданные.НайтиПоТипу(ТипРеквизита);
	ИмяТаблицы = мдОбъекта.ПолноеИмя();
	ПроверкаНаПустыеЗначения = " Об." + ИмяРеквизита + " ССЫЛКА " + ИмяТаблицы;
	ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И ВЫРАЗИТЬ(Об." + ИмяРеквизита + " КАК " + ИмяТаблицы + ").Ссылка есть null";
	Если Не Метаданные.Перечисления.Содержит(мдОбъекта) Тогда
		ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И Об." + ИмяРеквизита + " <> Значение(" + ИмяТаблицы + ".ПустаяСсылка)";
	КонецЕсли;
	Возврат ПроверкаНаПустыеЗначения;
	
КонецФункции

Функция ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита)
	
	ОбъектТипа = Метаданные.НайтиПоТипу(ТипРеквизита);
	ИмяТаблицы = ОбъектТипа.ПолноеИмя();
	ОписаниеТипа = """" + ИмяТаблицы + """ КАК ТипДанных";	
	Возврат ОписаниеТипа;
	
КонецФункции

Процедура ОграничениеТиповТипДанныхНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	Перем ЭлементСписка;
	СтандартнаяОбработка = Ложь;
	Строка = ЭлементыФормы.ОграничениеТипов.ТекущиеДанные;
	Если Не ПустаяСтрока(Строка.ТипДанных) Тогда
		ЭлементСписка = СписокТипов.НайтиПоЗначению(Строка.ТипДанных);
	КонецЕсли;
	ВыбранныйЭлемент = СписокТипов.ВыбратьЭлемент( , ЭлементСписка);
	Если ВыбранныйЭлемент <> Неопределено Тогда
		Строка.ТипДанных = ВыбранныйЭлемент.Значение;
	КонецЕсли;
	
КонецПроцедуры

РеквизитыИсключения = Новый Массив;

ТабличныеЧастиИсключения = Новый Массив;

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

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

КоллекцияОбъектов = Новый Массив;
КоллекцияОбъектов.Добавить(Метаданные.ПланыОбмена);
КоллекцияОбъектов.Добавить(Метаданные.Справочники);
КоллекцияОбъектов.Добавить(Метаданные.Документы);
КоллекцияОбъектов.Добавить(Метаданные.ПланыВидовХарактеристик);
КоллекцияОбъектов.Добавить(Метаданные.ПланыСчетов);
КоллекцияОбъектов.Добавить(Метаданные.ПланыВидовРасчета);
КоллекцияОбъектов.Добавить(Метаданные.БизнесПроцессы);
КоллекцияОбъектов.Добавить(Метаданные.Задачи);

КоллекцияРегистров = Новый Массив;
КоллекцияРегистров.Добавить(Метаданные.РегистрыСведений);
КоллекцияРегистров.Добавить(Метаданные.РегистрыНакопления);
КоллекцияРегистров.Добавить(Метаданные.РегистрыБухгалтерии);
КоллекцияРегистров.Добавить(Метаданные.РегистрыРасчета);
   
Разместил:   Версии: | 8.x | 8.2 УП |  Дата:   Прочитано: 67806
 +14 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 53
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1C: Enterprise Development Tools 52
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче
Посмотреть все результаты поиска похожих
Комментарии
jeiranyan
19.04.2023 18:34Комментарий: 6
jeiranyan

Добрый вечер, а как переконвертировать обработку?

ilnazio
15.07.2021 12:44Комментарий: 5
ilnazio

Есть ли такая же обработка для 8.3?

Jonsony
25.09.2013 12:05Комментарий: 4
Jonsony
Shvapsss, тестирование и исправление БД с удалением ссылок
E_Migachev
24.09.2013 17:57Комментарий: 3
E_Migachev
MaxD1975, Переуонвиртируйте ее для 8.2 открыв в конфигураторе.
Shvapsss, она удаляет только объект, никакие движения не трогает.
MaxD1975
24.09.2013 12:09Комментарий: 2
MaxD1975
А для 8.2 есть такая?
Shvapsss
12.09.2013 09:13Комментарий: 1
Shvapsss
Обработка не работает.

Удалил объект номенклатуры, все движения с ним остались и соответственно высвечиваются битой ссылкой.
Обработка не находит.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!