|
42 | 42 | ); |
43 | 43 | КонецЕсли; |
44 | 44 |
|
45 | | - ПрилепляемаяЧастица = Новый ПрилепляемаяЧастица(ТипЧастицы, ИмяЧастицы, Аннотация); |
| 45 | + ПрилепляемаяЧастица = Новый ПрилепляемаяЧастица(ТипЧастицы, ИмяЧастицы, Аннотация, Неопределено, ИмяСвойства); |
46 | 46 |
|
47 | 47 | АннотацияТабакерка = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Табакерка"); |
48 | 48 | Если АннотацияТабакерка <> Неопределено Тогда |
49 | 49 | ТипЧастицы = ТипыПрилепляемыхЧастиц.Табакерка(); |
50 | 50 | Аннотация = АннотацияТабакерка; |
51 | 51 | БазоваяПрилепляемаяЧастица = ПрилепляемаяЧастица; |
52 | 52 |
|
53 | | - ПрилепляемаяЧастица = Новый ПрилепляемаяЧастица(ТипЧастицы, ИмяЧастицы, Аннотация, БазоваяПрилепляемаяЧастица); |
| 53 | + ПрилепляемаяЧастица = Новый ПрилепляемаяЧастица(ТипЧастицы, ИмяЧастицы, Аннотация, БазоваяПрилепляемаяЧастица, ИмяСвойства); |
54 | 54 | КонецЕсли; |
55 | 55 |
|
56 | 56 | Возврат ПрилепляемаяЧастица; |
|
66 | 66 | Аннотация = ДанныеОПрилепляемойЧастице.Аннотация(); |
67 | 67 | БазоваяПрилепляемаяЧастица = ДанныеОПрилепляемойЧастице.БазоваяПрилепляемаяЧастица(); |
68 | 68 |
|
| 69 | + // Имя частицы может быть задано вложенной аннотацией (например &Пластилин(&Деталька("Ключ"))). |
| 70 | + // Резолвим её в конкретное значение; для литералов возвращается само значение. |
| 71 | + ИмяЧастицы = РазрешитьЗначение(ИмяЧастицы, ДанныеОПрилепляемойЧастице.ИмяСвойства()); |
| 72 | + |
69 | 73 | Если ТипЧастицы = ТипыПрилепляемыхЧастиц.Табакерка() Тогда |
70 | 74 | ПрилепляемаяЧастица = Новый Табакерка(ЭтотОбъект, БазоваяПрилепляемаяЧастица); |
71 | 75 | ИначеЕсли ТипЧастицы = ТипыПрилепляемыхЧастиц.Желудь() Тогда |
72 | 76 |
|
73 | | - ТипЖелудя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( |
| 77 | + ТипЖелудя = РазрешитьЗначение(РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( |
74 | 78 | Аннотация, |
75 | 79 | "Тип", |
76 | 80 | "Желудь" |
77 | | - ); |
| 81 | + )); |
78 | 82 |
|
79 | 83 | Если ПрилепляемыеЧастицы = Неопределено Тогда |
80 | 84 | ПараметрыАннотации = РаботаСАннотациями.ПолучитьПараметрыАннотации(Аннотация, "Блестяшка"); |
81 | 85 | ПрилепляемыеЧастицы = Новый Массив; |
82 | 86 | Для Каждого ПараметрБлестяшка Из ПараметрыАннотации Цикл |
83 | | - ПрилепляемыеЧастицы.Добавить(ПараметрБлестяшка.Значение); |
| 87 | + ПрилепляемыеЧастицы.Добавить(РазрешитьЗначение(ПараметрБлестяшка.Значение)); |
84 | 88 | КонецЦикла; |
85 | 89 | КонецЕсли; |
86 | 90 |
|
|
94 | 98 |
|
95 | 99 | ИначеЕсли ТипЧастицы = ТипыПрилепляемыхЧастиц.Деталька() Тогда |
96 | 100 |
|
97 | | - ЗначениеПоУмолчанию = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( |
98 | | - Аннотация, |
99 | | - "ЗначениеПоУмолчанию", |
| 101 | + ЗначениеПоУмолчанию = РазрешитьЗначение(РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( |
| 102 | + Аннотация, |
| 103 | + "ЗначениеПоУмолчанию", |
100 | 104 | Неопределено, |
101 | 105 | Истина |
102 | | - ); |
| 106 | + )); |
103 | 107 |
|
104 | 108 | ПрилепляемаяЧастица = Поделка.НайтиДетальку(ИмяЧастицы, ЗначениеПоУмолчанию); |
105 | 109 | Иначе |
|
110 | 114 |
|
111 | 115 | КонецФункции |
112 | 116 |
|
| 117 | +// Разрешить значение параметра аннотации. |
| 118 | +// |
| 119 | +// Если значение является вложенной аннотацией (например &Деталька("Ключ") или &Пластилин("ИмяЖелудя")), |
| 120 | +// оно трактуется как описание частицы: аннотация прилепляется штатным механизмом, а результат её |
| 121 | +// прилепления возвращается как значение. Литералы возвращаются без изменений. |
| 122 | +// |
| 123 | +// Механизм общий и рекурсивный: НайтиПрилепляемуюЧастицу сам прогоняет имя, блестяшки и значение |
| 124 | +// по умолчанию через РазрешитьЗначение, поэтому вложенность произвольной глубины разрешается сама собой. |
| 125 | +// |
| 126 | +// Параметры: |
| 127 | +// Значение - Произвольный - Значение параметра аннотации (литерал или вложенная аннотация). |
| 128 | +// ИмяПоУмолчанию - Строка - Имя частицы по умолчанию для вложенной аннотации без явного значения. |
| 129 | +// |
| 130 | +// Возвращаемое значение: |
| 131 | +// Произвольный - Разрешённое значение. |
| 132 | +// |
| 133 | +Функция РазрешитьЗначение(Знач Значение, Знач ИмяПоУмолчанию = "") |
| 134 | + |
| 135 | + Если НЕ РаботаСАннотациями.ЭтоАннотация(Значение) Тогда |
| 136 | + Возврат Значение; |
| 137 | + КонецЕсли; |
| 138 | + |
| 139 | + ПсевдоСвойство = Новый Структура("Имя, Аннотации", ИмяПоУмолчанию, ТаблицаИзОднойАннотации(Значение)); |
| 140 | + ДанныеОЧастице = ДанныеОПрилепляемойЧастице(ПсевдоСвойство); |
| 141 | + |
| 142 | + Возврат НайтиПрилепляемуюЧастицу(ДанныеОЧастице); |
| 143 | + |
| 144 | +КонецФункции |
| 145 | + |
| 146 | +// Построить таблицу аннотаций из одной вложенной аннотации-значения. |
| 147 | +// |
| 148 | +// Параметры: |
| 149 | +// Аннотация - СтрокаТаблицыЗначений - Вложенная аннотация с колонками Имя и Параметры. |
| 150 | +// |
| 151 | +// Возвращаемое значение: |
| 152 | +// ТаблицаЗначений - Таблица аннотаций с единственной строкой. |
| 153 | +// |
| 154 | +Функция ТаблицаИзОднойАннотации(Аннотация) |
| 155 | + |
| 156 | + Таблица = Новый ТаблицаЗначений; |
| 157 | + Таблица.Колонки.Добавить("Имя"); |
| 158 | + Таблица.Колонки.Добавить("Параметры"); |
| 159 | + |
| 160 | + Строка = Таблица.Добавить(); |
| 161 | + Строка.Имя = Аннотация.Имя; |
| 162 | + Строка.Параметры = Аннотация.Параметры; |
| 163 | + |
| 164 | + Возврат Таблица; |
| 165 | + |
| 166 | +КонецФункции |
| 167 | + |
113 | 168 | Процедура ПриСозданииОбъекта(пПоделка, пУправляющийПрилепляемымиКоллекциями) |
114 | 169 | Поделка = пПоделка; |
115 | 170 | УправляющийПрилепляемымиКоллекциями = пУправляющийПрилепляемымиКоллекциями; |
|
0 commit comments