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