Наследование аннотаций
Представьте себе ситуацию, когда над несколькими компонентами системы нужно развесить несколько аннотаций по одному и тому же принципу. Например, объявить много компанейских &Желудей
с одинаковыми &Прозвищами
. Чтобы упростить себе жизнь, можно создать новую аннотацию, в которой скомбинировать несколько других. Например:
&Аннотация("КомпанейскийОбозванныйЖелудь")
&Характер("Компанейский")
&Желудь
&Прозвище("Обозванный")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Имея такую аннотацию, можно применить ее к любому компоненту:
&КомпанейскийОбозванныйЖелудь
Процедура ПриСозданииОбъекта()
КонецПроцедуры
При инициализации контекста этот компонент будет автоматически помечен как компанейский
&Желудь
и с &Прозвищем
"Обозванный".
Можно добавить в нашу новую аннотацию универсальности, объявив в конструкторе новый &Параметр
и доопределив метод ПриРазворачиванииАннотации
:
Перем СохраненноеЗначение;
&Аннотация("КомпанейскийОбозванныйЖелудь")
&Характер("Компанейский")
&Желудь
&Прозвище("Заглушка")
Процедура ПриСозданииОбъекта(Значение)
СохраненноеЗначение = Значение;
КонецПроцедуры
Процедура ПриРазворачиванииАннотации(ОпределениеАннотации, ПодчиненныеАннотации, ТипВладельцаСвойств, Свойство) Экспорт
Аннотация = РаботаСАннотациями.НайтиАннотацию(
ПодчиненныеАннотации,
"Прозвище"
);
РаботаСАннотациями.УстановитьЗначениеПараметраАннотации(
Аннотация,
"Значение",
СохраненноеЗначение
);
КонецПроцедуры
&КомпанейскийОбозванныйЖелудь("Каштан")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Пример кода выше хоть и может вызвать дикое желание записаться на курсы французского языка в Балашихе, сам по себе довольно прост. Значение нового &Параметр
, принятого в конструктор аннотации, сохраняется в переменную СохраненноеЗначение
.
При инициализации поделки происходит "разворачивание" всех имеющихся аннотаций как над свойствами так и над методами. Если в Вашей аннотации объявлен метод ПриРазворачиванииАннотации
, то он будет вызван с параметром ОпределениеАннотации
, содержащей информацию о текущей аннотации и всех подчиненных аннотациях первого уровня.
В примере выше среди подчиненных аннотаций ищется аннотация Прозвище
и ей устанавливается значение из переменной СохраненноеЗначение
. Таким образом для Компонент
будет установлено &Прозвище
"Каштан"
.