Отчет с двумя схемами компоновки данных

1. Оля Валитова (Ольга Валитова) 28.12.16 09:40 Сейчас в теме
Добрый день!
Делаю отчет на СКД с 2мя схемами компоновки данных. Отличаются тем, что в одной можно сделать отбор по номенклатуре,а в другой нет, т.к. группируется по контрагенту и номенклатура не выводится. На форме есть флажок, по которому определяю какую схему использовать. Соответственно, в одной схеме есть поле номенклатура,а в другой нет. И когда флаг=ложь, выдает ошибку, что поле номенклатура не найдена. Проблема, как я поняла, в том что не обновляется сама структура отчета. Не знаю как исправить данную ошибку.
	Выборка = Запрос.Выполнить().Выбрать();
		
		Пока Выборка.Следующий() Цикл
				Стр = ТЗ.Добавить();
				ЗаполнитьЗначенияСвойств(Стр,Выборка);
		КонецЦикла;
		
		
	Если ТЗ.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;	
	 
    ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
	
	Если Отчет.ПоНоменклатуре=Ложь Тогда
	СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных1");
	Иначе
	СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	Конецесли;
				
				
	Период_1="С "+Строка(Формат( Отчет.Период1.ДатаНачала,"ДФ=dd.MM.yy"))+ " по "+Строка(Формат(Отчет.Период1.ДатаОкончания,"ДФ=dd.MM.yy"));
	Период_2="С "+Строка(Формат( Отчет.Период2.ДатаНачала,"ДФ=dd.MM.yy"))+ " по "+Строка(Формат(Отчет.Период2.ДатаОкончания,"ДФ=dd.MM.yy"));
	Поле1=СхемаКомпоновкиДанных.НаборыДанных.ТЗ.Поля.найти("Период1");
	Поле1.Заголовок=Период_1;
	Поле2=СхемаКомпоновкиДанных.НаборыДанных.ТЗ.Поля.найти("Период2");
	Поле2.Заголовок=Период_2;

	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки);

	ВнешниеНаборы = Новый Структура;
	
	ВнешниеНаборы.Вставить("ТЗ",ТЗ);

	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,ВнешниеНаборы);
	ПроцессорВывода = Новый      ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

	ПроцессорВывода.УстановитьДокумент(Результат);
		
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	СкомпоноватьРезультат();
...Показать Скрыть


В ОсновнаяСхемаКомпоновкиДанных1 в наборе данных нет поля номенклатура, а в ОсновнаяСхемаКомпоновкиДанных есть.
Найденные решения
2. Антон Гвоздикин (Ганс) 28.12.16 10:11 Сейчас в теме
Я конечно не эксперт в СКД, но почему не использовать варианты отчёта, зачем вторая компоновка?

А так вам не хватает строчки: КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
корум; +1 Ответить 1
Остальные ответы
2. Антон Гвоздикин (Ганс) 28.12.16 10:11 Сейчас в теме
Я конечно не эксперт в СКД, но почему не использовать варианты отчёта, зачем вторая компоновка?

А так вам не хватает строчки: КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
корум; +1 Ответить 1
3. Леонид Бугерчук (Caspersky) 28.12.16 11:15 Сейчас в теме
(1)Похоже, действительно, на очередной костыль:
запрос СКД подразумевает набор ВСЕХ возможных полей потенциально востребованных при формировании отчета, а что выводить и как группировать, как правило определяет пользователь уже в режиме предприятия ...
т.е., полагаю, Ваша задача легко решается без конфигуратора ...
4. Оля Валитова (Ольга Валитова) 29.12.16 09:55 Сейчас в теме
(3)Дело в том, что мне нужно сформировать отчет за 2 периода, соответственно я делаю 2 одинаковых запроса на разные даты,которые связываю затем по партнеру и по номенклатуре. Если я делаю по партнеру,то номенклатуру приходится убрать,т.к. она мешает группировке, т.е. разбивает одну реализацию на несколько строчек, в зависимости от количества номенклатур. А пользователю необходимо формировать как по партнерам, так и по номенклатуре.
5. Владимир Полевик (pvvpvv) 10 29.12.16 10:04 Сейчас в теме
(0) Вместо

Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();


напишите

КомпоновщикНастроекСхема = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроекСхема.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
	КомпоновщикНастроекСхема.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Настройки = КомпоновщикНастроекСхема.Настройки;
6. Антон Локтионов (Anton64) 135 29.12.16 10:09 Сейчас в теме
Если у Вас не редактируются отборы на форме, тогда в (2) всё правильно написали:
замените
 МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки);

на
 МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,СхемаКомпоновкиДанных.НастройкиПоУмолчанию);


Иначе получается что есть две компоновки данных (одна из них похоже указана как основная в отчете), вы для компоновки макета используете компоновщик настроек отчета, который инициализирован основной схемой, а не Схемой1. Из-за этого ошибка, потому что в Отчет.КомпоновщикНастроек - содержит настройки по основной схеме, а не Схеме1.
Ольга Валитова; +1 Ответить
7. Оля Валитова (Ольга Валитова) 09.01.17 11:32 Сейчас в теме
При таком задании настроек перестает работать отбор. Т.е. если в настройках сделать отбор по складу/номенклатуре/и т.д. выдает абсолютно все данные.
Оставьте свое сообщение