Построитель отчета по нескольким отборам

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

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

Сейчас код такой:
Функция ПроверитьКупоны(СписокНоменклатура)Экспорт
	СписокКупонов = Новый СписокЗначений;
	Выборка = Справочники.Купоны.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		Построитель 				= Новый ПостроительОтчета;
		Построитель.Текст 			= Справочники.Купоны.ПолучитьТекстЗапроса();
		СтруктураНастроекПостроителя= Выборка.СохраненныеНастройкиПостроителя.Получить();
		
		Если СтруктураНастроекПостроителя = Неопределено Тогда Продолжить; КонецЕсли;
		
		ТаблицаОтбораТоваров  		= СтруктураНастроекПостроителя.ТаблицаОтбораТоваров;
		
		Если ТаблицаОтбораТоваров <> Неопределено Тогда 
			Б_ПроцедурыОбменаССайтом.ЗаполнитьОтборПоТаблицеЗначений(Построитель.Отбор, ТаблицаОтбораТоваров);
			
			СтрокаТаблицы 				= Построитель.Отбор.Добавить("Ссылка", "", "Ссылка");	
			СтрокаТаблицы.ВидСравнения 	= ВидСравнения.ВСписке;
			СтрокаТаблицы.Использование	= Истина;
			СтрокаТаблицы.Значение 		= СписокНоменклатура;
		Иначе
			Продолжить;
		КонецЕсли;
		
		Построитель.Выполнить();  
		
		Если НЕ Построитель.Результат.Пустой()  Тогда
			СписокКупонов.Добавить(Выборка.Ссылка);	
		КонецЕсли; 
	КонецЦикла; 
	
	Возврат СписокКупонов;
КонецФункции
Показать
По теме из базы знаний
Найденные решения
9. acanta 17.10.18 15:59 Сейчас в теме
СКД, объединение те же проблемы. Сегменты номенклатуры УТ 11 динамически формируются по регл.заданию тоже с отборами и хранятся в базе. Почему именно купоны?
10. dandykry 10 17.10.18 16:05 Сейчас в теме
(7) Думаю, что лучше оставить так как есть. Если выполняется часто и долго, то можно закэшировать, хотя тоже может выйти боком
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. dandykry 10 17.10.18 15:24 Сейчас в теме
(1)
Сейчас это сделано через


через ж.....

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

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

Так вот пока всех купонов не получить и не применить все отборы, то истины не узнать.
5. kloze 17.10.18 15:43 Сейчас в теме
(3) Да все правильно поняли.
А в чем "ж....."
6. dandykry 10 17.10.18 15:49 Сейчас в теме
(5) 1000 купонов = 1000 запросов к базе?
7. kloze 17.10.18 15:51 Сейчас в теме
(6) Да, получается так, я не понимаю как уйти от этого. Писать парсер отбора, запихивать каждый отдельный запрос с отбором в общий запрос, только если так?
8. dandykry 10 17.10.18 15:57 Сейчас в теме
(7) Не лучшая идея. Думаю пока план запроса построится, быстрее запросы в цикле пройдут. Да и оперативной памяти сожрет немененно
10. dandykry 10 17.10.18 16:05 Сейчас в теме
(7) Думаю, что лучше оставить так как есть. Если выполняется часто и долго, то можно закэшировать, хотя тоже может выйти боком
2. acanta 17.10.18 15:04 Сейчас в теме
Вероятно перебор справочника купоны, программное добавление в СКД очередного запроса и после окончания цикла выполняем формируем СКД и выгружаем. Как можно добавить
https://its.1c.ru/db/pubcomplexreports#content:174:hdoc

что то вроде
Листинг 3.53. Процедура программной установки схемы компоновки
СКД = Новый СхемаКомпоновкиДанных;
ИД = СКД.ИсточникиДанных.Добавить();
ИД.Имя = "ИсточникДанных";
ИД.ТипИсточникаДанных = "Local";
 
 СписокКупонов = Новый СписокЗначений;
    Выборка = Справочники.Купоны.Выбрать();
    Ном = Ном+1;
    Пока Выборка.Следующий() Цикл


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

Для каждой отдельной позиции истина - это момент, когда она добавлена в итоговый список. До конца мы не узнаем, сколько их всего.
9. acanta 17.10.18 15:59 Сейчас в теме
СКД, объединение те же проблемы. Сегменты номенклатуры УТ 11 динамически формируются по регл.заданию тоже с отборами и хранятся в базе. Почему именно купоны?
11. kloze 17.10.18 16:09 Сейчас в теме
(9) Нужно подумать над регламетным. возможно действительно это выход. Спасибо
12. acanta 17.10.18 16:11 Сейчас в теме
Инвертировать условия запроса в купоне вы все равно не сможете, но у вас появится возможность получить информацию о том, в какие купоны входит конкретная позиция.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот