21 января 2022 г.

1СОшибка Для объекта метаданных "Документ.ЗаявкаНаРасходованиеСредств" не найден идентификатор в справочнике "Идентификаторы объектов метаданных"

В справочнике ИдентификаторыОбъектовМетаданных некоторые элементы имеют знаки вопроса в реквизитах и помечены на удаление. Может выскакивать ошибка "{ОбщийМодуль.ОбщегоНазначения.Модуль(2646)}: Ошибка при выполнении функции ОбщегоНазначения.ИдентификаторОбъектаМетаданных(). Для объекта метаданных "Документ.ЗаявкаНаРасходованиеСредств" не найден идентификатор в справочнике "Идентификаторы объектов метаданных"."

Рекомендации простые:

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


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




Листинг для ПрофилейГруппДоступа:

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

&НаКлиенте
Процедура Загрузить(Команда)
	ЗагрузитьНаСервере();
КонецПроцедуры

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

&НаКлиенте
Процедура ЗаменитьРеквизиты(Команда)
	ЗаменитьРеквизитыНаСервере();
КонецПроцедуры


Листинг для НастройкиХозяйственныхОпераций:

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

&НаКлиенте
Процедура Загрузить(Команда)
	ЗагрузитьНаСервере();
КонецПроцедуры

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

&НаКлиенте
Процедура ЗаменитьРеквизиты(Команда)
	ЗаменитьРеквизитыНаСервере();
КонецПроцедуры

Комментариев нет:

Отправить комментарий