Есть справочник "купоны", у которого есть реквизит в котором хранится отбор номенклатуры применимый для купона (реквизит типа ПостроительОтчета.Отбор)
Нужно для номенклатуры определить какие купоны для нее доступны.

Сейчас это сделано через перебор справочника "Купоны" и выполнение запроса с установленным отбором, занимает значительное время. Как можно ускорить этот процесс, поделитесь идеями.

Сейчас код такой:

```1c
    Функция ПроверитьКупоны(СписокНоменклатура)Экспорт
    СписокКупонов = Новый СписокЗначений;
    Выборка = Справочники.Купоны.Выбрать();

    Пока Выборка.Следующий() Цикл

    Построитель = Новый ПостроительОтчета;
    Построитель.Текст = Справочники.Купоны.ПолучитьТекстЗапроса();
    СтруктураНастроекПостроителя= Выборка.СохраненныеНастройкиПостроителя.Получить();

    Если СтруктураНастроекПостроителя = Неопределено Тогда Продолжить; КонецЕсли;

    ТаблицаОтбораТоваров = СтруктураНастроекПостроителя.ТаблицаОтбораТоваров;

    Если ТаблицаОтбораТоваров <> Неопределено Тогда
    Б_ПроцедурыОбменаССайтом.ЗаполнитьОтборПоТаблицеЗначений(Построитель.Отбор, ТаблицаОтбораТоваров);

    СтрокаТаблицы = Построитель.Отбор.Добавить("Ссылка", ", "Ссылка");
    СтрокаТаблицы.ВидСравнения = ВидСравнения.ВСписке;
    СтрокаТаблицы.Использование = Истина;
    СтрокаТаблицы.Значение = СписокНоменклатура;
    Иначе
    Продолжить;
    КонецЕсли;

    Построитель.Выполнить();

    Если НЕ Построитель.Результат.Пустой() Тогда
    СписокКупонов.Добавить(Выборка.Ссылка);
    КонецЕсли;
    КонецЦикла;

    Возврат СписокКупонов;
    КонецФункции
```
---
СКД, объединение те же проблемы. Сегменты номенклатуры УТ 11 динамически формируются по регл.заданию тоже с отборами и хранятся в базе. Почему именно купоны?
---
Думаю, что лучше оставить так как есть. Если выполняется часто и долго, то можно закэшировать, хотя тоже может выйти боком
---
Сейчас это сделано через

через ж.....

Если я правильно понял, то лучше только заново нормально написать.

А понял я следующее: В купоне есть правила отбора для номенклатуры. Например есть номенклатура.Вид = "Товар" тогда купон действует для номенклатуры.

Так вот пока всех купонов не получить и не применить все отборы, то истины не узнать.
---
Да все правильно поняли.
А в чем "ж....."
---
1000 купонов = 1000 запросов к базе?
---
Да, получается так, я не понимаю как уйти от этого. Писать парсер отбора, запихивать каждый отдельный запрос с отбором в общий запрос, только если так?
---
Не лучшая идея. Думаю пока план запроса построится, быстрее запросы в цикле пройдут. Да и оперативной памяти сожрет немененно
---
Думаю, что лучше оставить так как есть. Если выполняется часто и долго, то можно закэшировать, хотя тоже может выйти боком
---
Вероятно перебор справочника купоны, программное добавление в СКД очередного запроса и после окончания цикла выполняем формируем СКД и выгружаем. Как можно добавить
https://its.1c.ru/db/pubcomplexreports#content:174:hdoc

что то вроде
Листинг 3.53. Процедура программной установки схемы компоновки

```1c
    СКД = Новый СхемаКомпоновкиДанных;
    ИД = СКД.ИсточникиДанных.Добавить();
    ИД.Имя = "ИсточникДанных";
    ИД.ТипИсточникаДанных = "Local";

    СписокКупонов = Новый СписокЗначений;
    Выборка = Справочники.Купоны.Выбрать();
    Ном = Ном+1;
    Пока Выборка.Следующий() Цикл

    НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    НаборДанных.Имя = "НаборДанных"+Ном;
    НаборДанных.Запрос = Купоны.ПолучитьТекстЗапроса();
    НаборДанных.ИсточникДанных = "ИсточникДанных";
    КонецЦикла
```
---
Применять отборы по принципу Фильтр = Отбор1(и)Отбор2 или Фильтр = Отбор1(или)Отбор2?
Сейчас каждый запрос отдельно получает собственный список и добавляет в общий - т.е. ИЛИ.
Если цель объединение запросов в один, то имхо, каждый запрос пишем во временную таблицу, затем объединяем.
Если же задача стояла изначально так, что каждая номенклатура имеет один купон (т.е. при построении запросов по очереди, начиная с момента, когда номенклатура добавлена, остальные отборы перестают работать, в любом случае выполняется отдельно каждый запрос и проверяется есть ли каждая номенклатура в итоговом списке).

Для каждой отдельной позиции истина - это момент, когда она добавлена в итоговый список. До конца мы не узнаем, сколько их всего.
---
СКД, объединение те же проблемы. Сегменты номенклатуры УТ 11 динамически формируются по регл.заданию тоже с отборами и хранятся в базе. Почему именно купоны?
---
Нужно подумать над регламетным. возможно действительно это выход. Спасибо
---
Инвертировать условия запроса в купоне вы все равно не сможете, но у вас появится возможность получить информацию о том, в какие купоны входит конкретная позиция.