Получаю такой отбор номенклатуры ИсточникДанных.ХранилищеНастроекКомпоновкиДанных.Получить().ОтборПоНоменклатуре.Отбор
Мне нужно получить всю номенклатуру по этому отбору, не могу понять как это сделать.
---
внутри этого цикла, если эта коллекция больше одного элемента:
Для каждого эл из КоллекцияЭлементовОтбораКомпоновкиДанных Цикл
                ...
 КонецЦикла;

отладчиком пользуйтесь , смотрите что элемент эл содержит и присваивайте значение в зависимости от вашего условия отбора.
---
Описывал это в статье тут
см. функцию ПолучитьСсылкиПоОтбору() в свернутом блоке
---
не работает
Пробую вот так

```1c
    Массив = ПолучитьСсылкиПоОтбору(ВыборкаДетальныеЗаписи.СкидкаНаценка.ХранилищеНастроекКомпоновкиДанных.Получить().ОтборПоНоменклатуре.Отбор, "Справочник.Номенклатура");
```
---
"не работает"
А поподробнее?
Возникает ошибка, возвращается пустой массив или что-то еще?
---
Какой состав полей передается в отборе? Совпадает ли он с составом полей в справочнике Номенклатура?
---
ОтборПоНоменклатуре - это отбор по одной номенклатуре, например скидка действует для номенклатуры "Номенклатура".
и так для каждой скидки. Скидки я получил запросом, в обходе выборки результата запроса делаю:

КоллекцияЭлементовОтбораКомпоновкиДанных
   = Выборка.Ссылка.ХранилищеНастроекКомпоновкиДанных.Получить().ОтборПоНоменклатуре.Отбор.Элементы;

далее обрабатываете эту коллекцию, получаем номенклатуру - это правое значение
и записываем например в таб.значений.
---
Мне нужно вывести скидку (если она есть), для каждого элемента номенклатуры. Я думал что можно этот отбор поместить в запрос как-то.
---
я вам это и написал. Запросом я получил все действующие скидки. Если есть скидка , значит смотрим какой отбор установлен. Если ОтборПоНоменклатуре, тогда актуален тот код что я выложил в общих чертах. Если у Вас НоменклатураВСписке тогда это уже другое дело.
---
я понимаю, но левое значение может быть не просто номенклатура, а к примеру Номенклатура.Марка
---
ну отладчиком смотрите что содержит элемент коллекции и анализируйте.
---
номенклатура всегда в правом значении.
---
дак вот именно что там будет не ссылки на конкретные элементы номенклатуры, а всего-лишь параметр отбора

Например:
Отбор такой: Все элементы номенклатуры с маркой YAMAHA

Левое значение Номенклатура.Марка
Правое значение YAMAHA
---
и дальше собираете эти марки в массив или ТЗ.
и делаете запрос к номенклатуре у которой марка в &Марка

Но ничто не мешает собирать номенклатуру так как я выше написал.
---
Там отбор можно сделать по чему угодно, не только по марке, и что 100 массивов создавать?
---
от вас зависит. к чему гадать. Вы сами то задачу понимаете?
---
Я понимаю
Задача - Показывать в справочнике "номенклатура" показывать скидку для каждого элемента номенклатуры
---
ну вот , упоминается номенклатура, а не марка. Марка это другой справочник.
---
Вы похоже не совсем поняли, марка это другой справочник, но марка это реквизит элемента номенклатуры. По нему можно сделать отбор, то есть установить скидки на определенные марки номенклатуры. И скида будет только у элементов номенклатуры с этой маркой.
---
номенклатура - это верхний уровень для марки и т.п. что Вас затрудняет написать условие и отбирать эту саму номенклатуру?
---
Вот что написал, где я должен отбирать номенклатуру?

Функция
```1c
    Процедура ПоказатьНаСервере()
    ТаблицаНоменклатура.Очистить();

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    | Таблица.СкидкаНаценка КАК СкидкаНаценка
    |ИЗ
    | РегистрСведений.ДействиеСкидокНаценок.СрезПоследних(&ТекущаяДата, Источник = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)) КАК Таблица
    |ГДЕ
    | Таблица.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДействияСкидок.Действует)";
    Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ИсточникДанных = ВыборкаДетальныеЗаписи.СкидкаНаценка;
    Если ИсточникДанных.ВариантОтбораНоменклатуры = Перечисления.ВариантыОтбораНоменклатурыДляРасчетаСкидокНаценок.ОтборКомпоновкиДанных Тогда
    стр = ТаблицаНоменклатура.Добавить();
    стр.Скидки = ВыборкаДетальныеЗаписи.СкидкаНаценка;
    Скидка = ВыборкаДетальныеЗаписи.СкидкаНаценка;
    КоллекцияЭлементовОтбораКомпоновкиДанных = ВыборкаДетальныеЗаписи.СкидкаНаценка.ХранилищеНастроекКомпоновкиДанных.Получить().ОтборПоНоменклатуре.Отбор.Элементы;
    Для каждого эл из КоллекцияЭлементовОтбораКомпоновкиДанных Цикл
    стр.ЛевоеЗначение = эл.ЛевоеЗначение;
    Стр.ПравоеЗначение = эл.ПравоеЗначение;

    ЛевоеЗначение = эл.ЛевоеЗначение;
    ПравоеЗначение = эл.ПравоеЗначение;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;

    ЗапросНом = Новый Запрос;
    ЗапросНом.Текст =
    "ВЫБРАТЬ
    | Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Марка = &ПравоеЗначение";
    ЗапросНом.УстановитьПараметр("ЛевоеЗначение", ЛевоеЗначение);
    ЗапросНом.УстановитьПараметр("ПравоеЗначение", ПравоеЗначение);

    РезультатЗапроса = ЗапросНом.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();

    Пока Выборка.Следующий() Цикл
    стр = Таблица.Добавить();
    стр.Номенклатура = Выборка.Ссылка;
    стр.Скидка = Скидка;
    КонецЦикла;

    КонецПроцедуры
```
---
внутри этого цикла, если эта коллекция больше одного элемента:
Для каждого эл из КоллекцияЭлементовОтбораКомпоновкиДанных Цикл
                ...
 КонецЦикла;

отладчиком пользуйтесь , смотрите что элемент эл содержит и присваивайте значение в зависимости от вашего условия отбора.
---
Может как-то так:

```1c
    Для каждого ЭлементОтбора Из ИсточникДанных.ХранилищеНастроекКомпоновкиДанных.Получить().ОтборПоНоменклатуре.Отбор Цикл
    Если ЭлементОтбора.Имя="....." Тогда

    Для Каждого ЭлементЗначение Из ЭлементОтбора.ПравоеЗначение Цикл

    КонецЦикла;

    КонецЕсли;
    КонецЦикла;
```