1. _Vanda_ 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 Ответить
Остальные ответы
Избранное Подписка Сортировка: Древо
3. Caspersky 28.12.16 11:15 Сейчас в теме
(1)Похоже, действительно, на очередной костыль:
запрос СКД подразумевает набор ВСЕХ возможных полей потенциально востребованных при формировании отчета, а что выводить и как группировать, как правило определяет пользователь уже в режиме предприятия ...
т.е., полагаю, Ваша задача легко решается без конфигуратора ...
4. _Vanda_ 29.12.16 09:55 Сейчас в теме
(3)Дело в том, что мне нужно сформировать отчет за 2 периода, соответственно я делаю 2 одинаковых запроса на разные даты,которые связываю затем по партнеру и по номенклатуре. Если я делаю по партнеру,то номенклатуру приходится убрать,т.к. она мешает группировке, т.е. разбивает одну реализацию на несколько строчек, в зависимости от количества номенклатур. А пользователю необходимо формировать как по партнерам, так и по номенклатуре.
2. Ганс 28.12.16 10:11 Сейчас в теме
Я конечно не эксперт в СКД, но почему не использовать варианты отчёта, зачем вторая компоновка?

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

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


Иначе получается что есть две компоновки данных (одна из них похоже указана как основная в отчете), вы для компоновки макета используете компоновщик настроек отчета, который инициализирован основной схемой, а не Схемой1. Из-за этого ошибка, потому что в Отчет.КомпоновщикНастроек - содержит настройки по основной схеме, а не Схеме1.
5. pvvpvv 10 29.12.16 10:04 Сейчас в теме
(0) Вместо

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


напишите

КомпоновщикНастроекСхема = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроекСхема.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
	КомпоновщикНастроекСхема.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Настройки = КомпоновщикНастроекСхема.Настройки;
7. _Vanda_ 09.01.17 11:32 Сейчас в теме
При таком задании настроек перестает работать отбор. Т.е. если в настройках сделать отбор по складу/номенклатуре/и т.д. выдает абсолютно все данные.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Нижний Новгород
зарплата до 120 000 руб.
Полный день

Программист 1С
Волгоград
зарплата от 45 000 руб. до 90 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Консультант-аналитик 1С
Москва
зарплата от 70 000 руб. до 100 000 руб.
Полный день

Программист 1С
Москва
зарплата от 80 000 руб. до 120 000 руб.
Временный (на проект)