Исключения поиска ссылок. Возвращает исключения при поиске мест использования объектов.
// Возвращает исключения при поиске мест использования объектов.
//
// Возвращаемое значение:
// Соответствие - исключения поиска ссылок в разрезе объектов метаданных:
// * Ключ - ОбъектМетаданных - объект метаданных, для которого применяются исключения.
// * Значение - Строка, Массив - описание исключенных реквизитов.
// Если "*", то исключены все реквизиты объекта метаданных.
// Если массив строк, то содержит относительные имена исключенных реквизитов.
//
Функция ИсключенияПоискаСсылок() Экспорт
ИсключенияПоискаИнтеграция = Новый Массив;
ИнтеграцияПодсистемБСП.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаИнтеграция);
ИсключенияПоиска = Новый Массив;
ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоиска);
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИсключенияПоиска, ИсключенияПоискаИнтеграция);
Результат = Новый Соответствие;
Для Каждого ИсключениеПоиска Из ИсключенияПоиска Цикл
// Определение полного имени реквизита и объекта метаданных - носителя реквизита.
Если ТипЗнч(ИсключениеПоиска) = Тип("Строка") Тогда
ПолноеИмя = ИсключениеПоиска;
МассивПодстрок = СтрРазделить(ПолноеИмя, ".");
КоличествоПодстрок = МассивПодстрок.Количество();
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(МассивПодстрок[0] + "." + МассивПодстрок[1]);
Иначе
ОбъектМетаданных = ИсключениеПоиска;
ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
МассивПодстрок = СтрРазделить(ПолноеИмя, ".");
КоличествоПодстрок = МассивПодстрок.Количество();
Если КоличествоПодстрок > 2 Тогда
Пока Истина Цикл
Родитель = ОбъектМетаданных.Родитель();
Если ТипЗнч(Родитель) = Тип("ОбъектМетаданныхКонфигурация") Тогда
Прервать;
Иначе
ОбъектМетаданных = Родитель;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
// Регистрация.
Если КоличествоПодстрок < 4 Тогда
Результат.Вставить(ОбъектМетаданных, "*");
Иначе
ПутиКРеквизитам = Результат.Получить(ОбъектМетаданных);
Если ПутиКРеквизитам = "*" Тогда
Продолжить; // Весь объект метаданных уже исключен.
ИначеЕсли ПутиКРеквизитам = Неопределено Тогда
ПутиКРеквизитам = Новый Массив;
Результат.Вставить(ОбъектМетаданных, ПутиКРеквизитам);
КонецЕсли;
// Формат реквизита:
// "<ВидОМ>.<ИмяОМ>.<ТипРеквизитаИлиТЧ>.<ИмяРеквизитаИлиТЧ>[.<ТипРеквизита>.<ИмяРеквизитаТЧ>]".
// Примеры:
// "РегистрСведений.ВерсииОбъектов.Реквизит.АвторВерсии",
// "Документ._ДемоЗаказПокупателя.ТабличнаяЧасть.СчетаНаОплату.Реквизит.Счет",
// "ПланВидовРасчета._ДемоОсновныеНачисления.СтандартнаяТабличнаяЧасть.БазовыеВидыРасчета.СтандартныйРеквизит.ВидРасчета".
// Относительный путь к реквизиту должен получиться таким, чтобы его можно было использовать в условиях запроса:
// "<ИмяРеквизитаИлиТЧ>[.<ИмяРеквизитаТЧ>]".
Если КоличествоПодстрок = 4 Тогда
ОтносительныйПутьКРеквизиту = МассивПодстрок[3];
Иначе
ОтносительныйПутьКРеквизиту = МассивПодстрок[3] + "." + МассивПодстрок[5];
КонецЕсли;
ПутиКРеквизитам.Добавить(ОтносительныйПутьКРеквизиту);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)