Началось все как всегда с малого.
Освоили мы расширения, и стали их применять везде и всюду... сначала делались какие-то мелкие доработки, потом пошли изменения в составе реквизитов объектов конфигурации, потом мы доросли до собственных объектов расширений со всевозможными ссылками друг на друга.
И все было бы хорошо, если бы эти объекты не стали плодиться как... ну дальше понятно все )
И вот однажды понадобилось нам изменить объекты за период. Ну способ то известный: Администрирование - Обслуживание - Корректировка данных - Групповое изменение реквизитов.
А не тут то было. Не видит обработка типы наших объектов. Не видит по причине отсутствия таковых в ТипВсеСсылки().
Пришлось взять напильник и... все описание взято из реально работающего расширения, в котором присутствуют 2 новых объекта метаданных:
1. Перечисление.ПРП_СтатусыПропусков
2. Справочник ПРП_РеестрПропусков с реквизитом статус с типом - ПеречислениеСсылка.ПРП_СтатусыПропусков
Что и как было сделано:
1. в расширение была "затянута" основная форма обработки ГрупповоеИзменениеРеквизитов,
и добавлен реквизит этой формы: РеквизитыОбъекта (таблица значений).
В этой таблице был изменен тип колонки Значение на Произвольный.
2. в модуль формы были добавлены 4 функции, обрабатывающие типы значений:
&НаСервереБезКонтекста
&Вместо("ВидОбъектаПоТипу")
Функция ПРП_ВидОбъектаПоТипу(Тип)
Если Тип = Тип("СправочникСсылка.ПРП_РеестрПропусков") Тогда
Возврат "Справочник";
ИначеЕсли Тип = Тип("ПеречислениеСсылка.ПРП_СтатусыПропусков") Тогда
Возврат "Перечисление";
Иначе
Возврат ПродолжитьВызов(Тип);
КонецЕсли;
КонецФункции
&НаСервереБезКонтекста
&Вместо("ЭтоСсылка")
Функция ПРП_ЭтоСсылка(Тип)
Возврат Тип <> Тип("Неопределено")
И (Справочники.ТипВсеСсылки().СодержитТип(Тип)
ИЛИ Документы.ТипВсеСсылки().СодержитТип(Тип)
ИЛИ Перечисления.ТипВсеСсылки().СодержитТип(Тип)
ИЛИ ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип)
ИЛИ ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип)
ИЛИ ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип)
ИЛИ БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип)
ИЛИ БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип)
ИЛИ Задачи.ТипВсеСсылки().СодержитТип(Тип)
Или Тип = Тип("СправочникСсылка.ПРП_РеестрПропусков") //прп++
Или Тип = Тип("ПеречислениеСсылка.ПРП_СтатусыПропусков") //прп++
ИЛИ ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип));
КонецФункции
&НаСервереБезКонтекста
&Вместо("ЗначениеСсылочногоТипа")
Функция ПРП_ЗначениеСсылочногоТипа(Значение)
Возврат Значение <> Неопределено И ПРП_ЭтоСсылка(ТипЗнч(Значение));
КонецФункции
СтроковоеПредставлениеТипа()
&НаСервереБезКонтекста
&Вместо("СтроковоеПредставлениеТипа")
Функция ПРП_СтроковоеПредставлениеТипа(Тип)
Представление = "";
Если ПРП_ЭтоСсылка(Тип) Тогда
ПолноеИмя = Метаданные.НайтиПоТипу(Тип).ПолноеИмя();
ИмяОбъекта = СтрРазделить(ПолноеИмя, ".")[1];
Если Тип = Тип("СправочникСсылка.ПРП_РеестрПропусков") Тогда
Представление = "СправочникСсылка";
ИначеЕсли Тип = Тип("ПеречислениеСсылка.ПРП_СтатусыПропусков") Тогда
Представление = "ПеречислениеСсылка";
Иначе
Возврат ПродолжитьВызов(Тип);
КонецЕсли;
Результат = ?(Представление = "", Представление, Представление + "." + ИмяОбъекта);
Возврат Результат;
Иначе
Возврат ПродолжитьВызов(Тип);
КонецЕсли;
КонецФункции
В которых, как не сложно догадаться, и прописаны типы объектов из нашего расширения. Все функции были добавлены с типом вызова &Вместо.
3. Кроме того, в модуле объекта все той же обработки были изменены еще две функции
&Вместо("ВидОбъектаПоТипу")
Функция ПРП_ВидОбъектаПоТипу(Тип)
Если Тип = Тип("СправочникСсылка.ПРП_РеестрПропусков") Тогда
Возврат "Справочник";
ИначеЕсли Тип = Тип("ПеречислениеСсылка.ПРП_СтатусыПропусков") Тогда
Возврат "Перечисление";
Иначе
Возврат ПродолжитьВызов(Тип);
КонецЕсли;
КонецФункции
&Вместо("ЗначениеСсылочногоТипа")
Функция ПРП_ЗначениеСсылочногоТипа(Значение)
Если Значение = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("СправочникСсылка.ПРП_РеестрПропусков")
Или ТипЗнч(Значение) = Тип("ПеречислениеСсылка.ПРП_СтатусыПропусков")
Тогда
Возврат Истина;
Иначе
Возврат ПродолжитьВызов(Значение);
КонецЕсли;
КонецФункции
И здесь функции были добавлены с типом вызова &Вместо.
Больше никаких изменений не потребовалось, и обработка "увидела" наши объекты.
Причем если у вас несколько расширений, то можно сделать это в каждом из них, для собственных объектов этих самых расширений. И оно будет работать... проверено.
Все это делалось на КА-2.4, не проверял, но думаю что на УТ11 и ERP2 тоже будет работать