Есть справочник "купоны", у которого есть реквизит в котором хранится отбор номенклатуры применимый для купона (реквизит типа ПостроительОтчета.Отбор)
Нужно для номенклатуры определить какие купоны для нее доступны.
Сейчас это сделано через перебор справочника "Купоны" и выполнение запроса с установленным отбором, занимает значительное время. Как можно ускорить этот процесс, поделитесь идеями.
Сейчас код такой:
Функция ПроверитьКупоны(СписокНоменклатура)Экспорт
СписокКупонов = Новый СписокЗначений;
Выборка = Справочники.Купоны.Выбрать();
Пока Выборка.Следующий() Цикл
Построитель = Новый ПостроительОтчета;
Построитель.Текст = Справочники.Купоны.ПолучитьТекстЗапроса();
СтруктураНастроекПостроителя= Выборка.СохраненныеНастройкиПостроителя.Получить();
Если СтруктураНастроекПостроителя = Неопределено Тогда Продолжить; КонецЕсли;
ТаблицаОтбораТоваров = СтруктураНастроекПостроителя.ТаблицаОтбораТоваров;
Если ТаблицаОтбораТоваров <> Неопределено Тогда
Б_ПроцедурыОбменаССайтом.ЗаполнитьОтборПоТаблицеЗначений(Построитель.Отбор, ТаблицаОтбораТоваров);
СтрокаТаблицы = Построитель.Отбор.Добавить("Ссылка", "", "Ссылка");
СтрокаТаблицы.ВидСравнения = ВидСравнения.ВСписке;
СтрокаТаблицы.Использование = Истина;
СтрокаТаблицы.Значение = СписокНоменклатура;
Иначе
Продолжить;
КонецЕсли;
Построитель.Выполнить();
Если НЕ Построитель.Результат.Пустой() Тогда
СписокКупонов.Добавить(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат СписокКупонов;
КонецФункции
СКД, объединение те же проблемы. Сегменты номенклатуры УТ 11 динамически формируются по регл.заданию тоже с отборами и хранятся в базе. Почему именно купоны?
(6) Да, получается так, я не понимаю как уйти от этого. Писать парсер отбора, запихивать каждый отдельный запрос с отбором в общий запрос, только если так?
Вероятно перебор справочника купоны, программное добавление в СКД очередного запроса и после окончания цикла выполняем формируем СКД и выгружаем. Как можно добавить
https://its.1c.ru/db/pubcomplexreports#content:174:hdoc
что то вроде
Листинг 3.53. Процедура программной установки схемы компоновки
СКД = Новый СхемаКомпоновкиДанных;
ИД = СКД.ИсточникиДанных.Добавить();
ИД.Имя = "ИсточникДанных";
ИД.ТипИсточникаДанных = "Local";
СписокКупонов = Новый СписокЗначений;
Выборка = Справочники.Купоны.Выбрать();
Ном = Ном+1;
Пока Выборка.Следующий() Цикл
НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных"+Ном;
НаборДанных.Запрос = Купоны.ПолучитьТекстЗапроса();
НаборДанных.ИсточникДанных = "ИсточникДанных";
КонецЦикла
Применять отборы по принципу Фильтр = Отбор1(и)Отбор2 или Фильтр = Отбор1(или)Отбор2?
Сейчас каждый запрос отдельно получает собственный список и добавляет в общий - т.е. ИЛИ.
Если цель объединение запросов в один, то имхо, каждый запрос пишем во временную таблицу, затем объединяем.
Если же задача стояла изначально так, что каждая номенклатура имеет один купон (т.е. при построении запросов по очереди, начиная с момента, когда номенклатура добавлена, остальные отборы перестают работать, в любом случае выполняется отдельно каждый запрос и проверяется есть ли каждая номенклатура в итоговом списке).
Для каждой отдельной позиции истина - это момент, когда она добавлена в итоговый список. До конца мы не узнаем, сколько их всего.
СКД, объединение те же проблемы. Сегменты номенклатуры УТ 11 динамически формируются по регл.заданию тоже с отборами и хранятся в базе. Почему именно купоны?
Инвертировать условия запроса в купоне вы все равно не сможете, но у вас появится возможность получить информацию о том, в какие купоны входит конкретная позиция.