Skip to content

Группировка компонентов по алиасу

Представьте себе компанию панков. Каждый из них уникален, каждый - личность. Но при этом у них есть и что-то общее - все они панки. К каждому можно обратиться как: "Эй, ты, панк!", и он не только отзовется громогласным "Хой!", но возможно даже предложит Вам пива.

Попробуем описать нашу небольшую и дружную компанию:

bsl
&Желудь
&Прозвище("Панк")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
bsl
&Желудь
&Прозвище("Панк")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
bsl
&Желудь
&Прозвище("Панк")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
bsl
&Желудь
&Прозвище("Панк")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Чудесная компания собралась, неправда ли? Что же мы можем сделать с этими красавцами? Получить их как пачку желудей! В этом нам поможет метод Поделка.НайтиЖелуди():

bsl
Панки = Поделка.НайтиЖелуди("Панк");

Ожидаем.Что(Панки).ИмеетТип("Массив");
Ожидаем.Что(Панки.Количество()).Равно(4);

Для Каждого Панк Из Панки Цикл
    Панк.Хой();
КонецЦикла;

Этот бэнд можно получить не только императивно, через НайтиЖелуди, но и внедрить в качестве зависимости. Для указания того, что мы ждем массив из панков, а не какого-то конкретного, у аннотации &Пластилин есть параметр Тип, который может принимать значения всех &ПрилепляемаяКоллекция, в частности Массив:

bsl
Процедура ПриСозданииОбъекта(&Пластилин(Значение = "Панк", Тип = "Массив") Панки)
    Для Каждого Панк Из Панки Цикл
        Панк.Хой();
    КонецЦикла;
КонецПроцедуры

Аналогичный параметр (третий) есть и у метода НайтиЖелуди:

bsl
Панки = Поделка.НайтиЖелуди("Панк", , "Массив");

По умолчанию, через &Пластилин внедряется единичный Желудь, а метод НайтиЖелуди возвращает Массив.

Помимо единичного желудя и массива, РокБэнд можно получить в виде соответствия ("Соответствие"), где ключом будет имя панка жёлудя, а значением - сам жёлудь, и в виде таблицы значений ("ТаблицаЗначений"), в каждой строке которой будет содержаться Имя, ОпределениеЖелудя и сам Желудь.

И вообще, загляните в документацию библиотеки autumn-collections, там много вкусных типов!

И даже больше, РокБэнд можно получить своим собственным способом, для этого нужно создать у себя свой уникальный СобирательПанков.os, в котором нужно определить два метода, один который получает на входе панка и его описание, а второй который возвращает собранную банду

bsl
// СобирательПанков.os

Перем Банда;

// Тут нам на вход приходит очередной панк
Процедура Добавить(Панк, ОпределениеПанка) Экспорт

    Для Каждого РольИИсполнитель Из Банда Цикл

        Если Не ЗначениеЗаполнено(РольИИсполнитель.Значение) Тогда

            Банда.Вставить(РольИИсполнитель.Ключ, Желудь);
            Прервать;

        КонецЕсли;

    КонецЦикла;

	Коллекция.Добавить(ОпределениеЖелудя.Имя());

КонецПроцедуры

// А тут нам надо вернуть собранную банду
Функция Получить() Экспорт
	Возврат Новый ФиксированнаяСтруктура(Банда);
КонецФункции

&ПрилепляемаяКоллекция("СобирательПанков")
Процедура ПриСозданииОбъекта()

    Банда = Новый Структура(
        "Гитарист, Барабанщик, БасГитарист, Вокалист"
    );

КонецПроцедуры

Теперь нам вернётся целая собранная группа:

bsl

Панки = Поделка.НайтиЖелуди("Панк", , "СобирательПанков");

// > Панки.Гитарист
// > Панки.Барабанщик
// > Панки.БасГитарист
// > Панки.Вокалист