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