СКД. Как передать тз как параметр в запрос?

1. mrChOP93 96 21.05.18 08:23 Сейчас в теме
Есть внешняя тз, как добавить ее в скд разобрался, как связать с запросом в скд разобрался, но проблема в том, что после связи надо еще раз свернуть получившийся результат и часть полей просуммировать. Собственно, как это сделать, или как передать внешнюю тз в запрос в скд? Вариант с запросом в модуле объекта и дальнейшей передачей результата в скд рассматривал, просто интересно, можно ли без особых танцев с бубном передать внешнюю тз в запрос.
По теме из базы знаний
Найденные решения
5. VmvLer 21.05.18 09:19 Сейчас в теме
(1) пока нельзя тз передать в запрос СКД без извращений.

посему
Вариант с запросом в модуле объекта и дальнейшей передачей результата в скд рассматривал
это единственный способ, который активно используют в современных конфигурациях.

Откройте навороченные отчеты в ЗУП или УТ и в схеме компоновки в качестве источника увидите некий "скелет", который задает поля, а затем в общих модулях при компоновке этот каркас обрастает "мясом" реального запроса.

Для простых тз я тоже делаю примерно так


Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_Периоды_ПолучитьТекстВставки(ПармВставки)
	
	ТзПериоды = ПармВставки.ТзПериоды;
	Если НЕ ТзПериоды.Количество() Тогда
		ТекстИсключения =  "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
		ВызватьИсключение ТекстИсключения;
	КонецЕсли;
	// ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"} 
	
	// Для гарантиии, что в пакете не будет дублей периодов свернем исходную тз по всем колонкам
	мКолонки = Новый Массив;
	Для каждого тКолонка Из ТзПериоды.Колонки Цикл
	   мКолонки.Добавить(тКолонка.Имя);
	КонецЦикла;
	СтрокаИменКолонок = СтрСоединить(мКолонки, ",");
	ТзПериодыУник = ТзПериоды.Скопировать();
	ТзПериодыУник.Свернуть(СтрокаИменКолонок);
	ТзПериодыУник.Сортировать("ДатаНачала,ДатаОкончания");
	
	// Текст первой секции и пример второй из запроса-объединения в СКД. 
	// Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
	// Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
	// формируются динамически в этом методе. Недоступный &ПараметрПериоды служит для поиска секции
	// шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
	//  
    //  |.... голова пакетов запроса
	//  |
	//  |ВЫБРАТЬ
	//  |	ДАТАВРЕМЯ(1, 1, 1) КАК ДатаНачала,
	//  |	ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
	//  |	0 КАК ДнейПериода,
	//  |	0 КАК ДнейРабочих
	//  |ПОМЕСТИТЬ ВтПериоды
	//  |ГДЕ
	//  |	&ПараметрПериоды
	//	|
	//	|ОБЪЕДИНИТЬ ВСЕ
	//	|
	//  |ВЫБРАТЬ 
	//  |	ДАТАВРЕМЯ(2017, 11, 1),
	//  |	ДАТАВРЕМЯ(2017, 11, 30, 23, 59, 59),
	//  |	30,
	//  |	22";
	
	ЗапросТекстВставка = "";
	ЗапросТекстШаблон1 = "
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ 
	|	ДАТАВРЕМЯ(%1, %2, %3),
	|	ДАТАВРЕМЯ(%4, %5, %6, %7, %8, %9),";
	ЗапросТекстШаблон2 = "
	|	%1,
	|	%2";
	
	мУжеОбработано = Новый Массив; // Для контроля дублей интервалов, если есть даты начала и окончания в один день, но разное время
	Для каждого СтрокаТз Из ТзПериодыУник Цикл
		
		НачалоДняДатаНчл = НачалоДня(СтрокаТз.ДатаНачала);
		НачалоДняДатаОкн = НачалоДня(СтрокаТз.ДатаОкончания);
		КлючИнтервала = Формат(НачалоДняДатаНчл, "ДЛФ=Д")+"_"+Формат(НачалоДняДатаОкн, "ДЛФ=Д");
		
		Если мУжеОбработано.Найти(КлючИнтервала) = Неопределено Тогда
			мУжеОбработано.Добавить(КлючИнтервала);
		Иначе	
			Продолжить; // Уже был такой интервал по дате начала и окончания без учета времени
		КонецЕсли;
		
		ПараметрыЗамены1  = Новый Структура;
		ПараметрыЗамены1.Вставить("_1", Формат(Год  (НачалоДняДатаНчл), "ЧГ="));
		ПараметрыЗамены1.Вставить("_2", Формат(Месяц(НачалоДняДатаНчл), "ЧГ="));
		ПараметрыЗамены1.Вставить("_3", Формат(День (НачалоДняДатаНчл), "ЧГ="));
		ПараметрыЗамены1.Вставить("_4", Формат(Год  (НачалоДняДатаОкн), "ЧГ="));
		ПараметрыЗамены1.Вставить("_5", Формат(Месяц(НачалоДняДатаОкн), "ЧГ="));
		ПараметрыЗамены1.Вставить("_6", Формат(День (НачалоДняДатаОкн), "ЧГ="));
		ПараметрыЗамены1.Вставить("_7", "23");
		ПараметрыЗамены1.Вставить("_8", "59");
		ПараметрыЗамены1.Вставить("_9", "59");

		ПараметрыЗамены2  = Новый Структура;
		ПараметрыЗамены2.Вставить("_1", Формат(СтрокаТз.ДнейПериода, "ЧГ="));
		ПараметрыЗамены2.Вставить("_2", Формат(СтрокаТз.ДнейРабочих, "ЧГ="));
	
		ЗапросТекстСекция1 = СтрШаблон(ЗапросТекстШаблон1, 
		ПараметрыЗамены1._1,
		ПараметрыЗамены1._2,
		ПараметрыЗамены1._3,
		ПараметрыЗамены1._4,
		ПараметрыЗамены1._5,
		ПараметрыЗамены1._6, 
		ПараметрыЗамены1._7,
		ПараметрыЗамены1._8,
		ПараметрыЗамены1._9); 
		
		ЗапросТекстСекция2 = СтрШаблон(ЗапросТекстШаблон2, 
		ПараметрыЗамены2._1,
		ПараметрыЗамены2._2); 
		
		ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция1 + ЗапросТекстСекция2;
		
	КонецЦикла;
	
	Возврат ЗапросТекстВставка;	
	
КонецФункции

Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_ОстаткиНаДатаК_П­олучитьТекстВставки(ПармВставки)
	
	ТзПериоды = ПармВставки.ТзПериоды;
	Если НЕ ТзПериоды.Количество() Тогда
		ТекстИсключения =  "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
		ВызватьИсключение ТекстИсключения;
	КонецЕсли;
	// ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"} 
	
	ИмяКолонкиГраницыПериода = "ДатаОкончания";
	ТзПериодыДатаК = ТзПериоды.Скопировать(, ИмяКолонкиГраницыПериода);
	ТзПериодыДатаК.Свернуть(ИмяКолонкиГраницыПериода);
	ТзПериодыДатаК.Сортировать(ИмяКолонкиГраницыПериода);
	
	// Текст первой секции и пример второй из запроса-объединения в СКД. 
	// Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
	// Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
	// формируются динамически в этом методе. Недоступный &ПараметрОстатки служит для поиска секции
	// шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
	//
	// Обратите внимание, что 
	//  - в качестве поля ДатаОкончания - выступает конец дня,
	//  - в качестве параметра остатков - выступает начало следующего дня, что аналогично 
	// ДОБАВИТЬКДАТЕ(&ДатаОкончания, СЕКУНДА, 1), но избавляет запрос от лишнего вычисления. 
	//  
	//  |
	//  |.... тут может быть выборка вложенных полей	
	//  |	ПОМЕСТИТЬ ВтОстатки
    //  |.... тут может быть соединение с другими таблицами
	//  |
	//  |ВЫБРАТЬ 
	//  |	ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
	//  |	СбТвОстатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
	//  |	СбТвОстатки.ВидЗапасов КАК ВидЗапасов,
	//  |	СбТвОстатки.КоличествоОстаток КАК КоличествоОстаток,
	//  |	СбТвОстатки.СтоимостьОстаток КАК СтоимостьОстаток
	//  |	ИЗ
	//  |	    РегистрНакопления.СебестоимостьТоваров.Остатки(, ЛОЖЬ) КАК СбТвОстатки
	//  |	ГДЕ
	//  |		&ПараметрОстатки
	//	|
	//	|ОБЪЕДИНИТЬ ВСЕ
	//	|
	//  |ВЫБРАТЬ 
	//  |	ДАТАВРЕМЯ(2017, 7, 31, 23, 59, 59),
	//  |	СбТвОстатки.АналитикаУчетаНоменклатуры,
	//  |	СбТвОстатки.ВидЗапасов,
	//  |	СбТвОстатки.КоличествоОстаток,
	//  |	СбТвОстатки.СтоимостьОстаток
	//  |ИЗ
	//  |	РегистрНакопления.СебестоимостьТоваров.Остатки(
	//  |			ДАТАВРЕМЯ(2017, 8, 1),
	//  |			АналитикаУчетаНоменклатуры В
	//  |					(ВЫБРАТЬ
	//  |						ВтАналитикаУчетаНоменклатуры.КлючАналитики
	//  |					ИЗ
	//  |						ВтАналитикаУчетаНоменклатуры)
	//  |				И ВидЗапасов В
	//  |					(ВЫБРАТЬ
	//  |						ВтВидыЗапасов.ВидЗапасов
	//  |					ИЗ
	//  |						ВтВидыЗапасов)) КАК СбТвОстатки";
	
	ЗапросТекстВставка = "";
	ЗапросТекстШаблон  = "
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ 
	|	ДАТАВРЕМЯ(%1, %2, %3, %4, %5, %6),
	|	СбТвОстатки.АналитикаУчетаНоменклатуры,
	|	СбТвОстатки.ВидЗапасов,
	|	СбТвОстатки.КоличествоОстаток,
	|	СбТвОстатки.СтоимостьОстаток
	|ИЗ
	|	РегистрНакопления.СебестоимостьТоваров.Остатки(
	|			ДАТАВРЕМЯ(%7, %8, %9),
	|			АналитикаУчетаНоменклатуры В
	|					(ВЫБРАТЬ
	|						ВтАналитикаУчетаНоменклатуры.КлючАналитики
	|					ИЗ
	|						ВтАналитикаУчетаНоменклатуры)
	|				И ВидЗапасов В
	|					(ВЫБРАТЬ
	|						ВтВидыЗапасов.ВидЗапасов
	|					ИЗ
	|						ВтВидыЗапасов)) КАК СбТвОстатки";
	
	
	мУжеОбработано = Новый Массив; // Для контроля дублей дней даты окончания, если есть даты окончания в один день, но разное время
	Для каждого СтрокаТз Из ТзПериодыДатаК Цикл
		
		НачалоДняДатаОкончания = НачалоДня(СтрокаТз.ДатаОкончания);
		Если мУжеОбработано.Найти(НачалоДняДатаОкончания) = Неопределено Тогда
			мУжеОбработано.Добавить(НачалоДняДатаОкончания);
		Иначе	
			Продолжить; // Уже был такой день даты окончания
		КонецЕсли;
		НачалоСледующегоДня = КонецДня(НачалоДняДатаОкончания) + 1;
		
		ПараметрыЗамены  = Новый Структура;
		ПараметрыЗамены.Вставить("_1", Формат(Год  (НачалоДняДатаОкончания), "ЧГ="));
		ПараметрыЗамены.Вставить("_2", Формат(Месяц(НачалоДняДатаОкончания), "ЧГ="));
		ПараметрыЗамены.Вставить("_3", Формат(День (НачалоДняДатаОкончания), "ЧГ="));
		ПараметрыЗамены.Вставить("_4", "23");
		ПараметрыЗамены.Вставить("_5", "59");
		ПараметрыЗамены.Вставить("_6", "59");
		ПараметрыЗамены.Вставить("_7", Формат(Год  (НачалоСледующегоДня), "ЧГ="));
		ПараметрыЗамены.Вставить("_8", Формат(Месяц(НачалоСледующегоДня), "ЧГ="));
		ПараметрыЗамены.Вставить("_9", Формат(День (НачалоСледующегоДня), "ЧГ="));
		
		ЗапросТекстСекция = СтрШаблон(ЗапросТекстШаблон, 
		ПараметрыЗамены._1,
		ПараметрыЗамены._2,
		ПараметрыЗамены._3,
		ПараметрыЗамены._4,
		ПараметрыЗамены._5,
		ПараметрыЗамены._6, 
		ПараметрыЗамены._7,
		ПараметрыЗамены._8,
		ПараметрыЗамены._9); 
		
		ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция;
		
	КонецЦикла;
	
	Возврат ЗапросТекстВставка;
	
КонецФункции
Показать
mrChOP93; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. VmvLer 21.05.18 09:19 Сейчас в теме
(1) пока нельзя тз передать в запрос СКД без извращений.

посему
Вариант с запросом в модуле объекта и дальнейшей передачей результата в скд рассматривал
это единственный способ, который активно используют в современных конфигурациях.

Откройте навороченные отчеты в ЗУП или УТ и в схеме компоновки в качестве источника увидите некий "скелет", который задает поля, а затем в общих модулях при компоновке этот каркас обрастает "мясом" реального запроса.

Для простых тз я тоже делаю примерно так


Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_Периоды_ПолучитьТекстВставки(ПармВставки)
	
	ТзПериоды = ПармВставки.ТзПериоды;
	Если НЕ ТзПериоды.Количество() Тогда
		ТекстИсключения =  "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
		ВызватьИсключение ТекстИсключения;
	КонецЕсли;
	// ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"} 
	
	// Для гарантиии, что в пакете не будет дублей периодов свернем исходную тз по всем колонкам
	мКолонки = Новый Массив;
	Для каждого тКолонка Из ТзПериоды.Колонки Цикл
	   мКолонки.Добавить(тКолонка.Имя);
	КонецЦикла;
	СтрокаИменКолонок = СтрСоединить(мКолонки, ",");
	ТзПериодыУник = ТзПериоды.Скопировать();
	ТзПериодыУник.Свернуть(СтрокаИменКолонок);
	ТзПериодыУник.Сортировать("ДатаНачала,ДатаОкончания");
	
	// Текст первой секции и пример второй из запроса-объединения в СКД. 
	// Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
	// Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
	// формируются динамически в этом методе. Недоступный &ПараметрПериоды служит для поиска секции
	// шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
	//  
    //  |.... голова пакетов запроса
	//  |
	//  |ВЫБРАТЬ
	//  |	ДАТАВРЕМЯ(1, 1, 1) КАК ДатаНачала,
	//  |	ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
	//  |	0 КАК ДнейПериода,
	//  |	0 КАК ДнейРабочих
	//  |ПОМЕСТИТЬ ВтПериоды
	//  |ГДЕ
	//  |	&ПараметрПериоды
	//	|
	//	|ОБЪЕДИНИТЬ ВСЕ
	//	|
	//  |ВЫБРАТЬ 
	//  |	ДАТАВРЕМЯ(2017, 11, 1),
	//  |	ДАТАВРЕМЯ(2017, 11, 30, 23, 59, 59),
	//  |	30,
	//  |	22";
	
	ЗапросТекстВставка = "";
	ЗапросТекстШаблон1 = "
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ 
	|	ДАТАВРЕМЯ(%1, %2, %3),
	|	ДАТАВРЕМЯ(%4, %5, %6, %7, %8, %9),";
	ЗапросТекстШаблон2 = "
	|	%1,
	|	%2";
	
	мУжеОбработано = Новый Массив; // Для контроля дублей интервалов, если есть даты начала и окончания в один день, но разное время
	Для каждого СтрокаТз Из ТзПериодыУник Цикл
		
		НачалоДняДатаНчл = НачалоДня(СтрокаТз.ДатаНачала);
		НачалоДняДатаОкн = НачалоДня(СтрокаТз.ДатаОкончания);
		КлючИнтервала = Формат(НачалоДняДатаНчл, "ДЛФ=Д")+"_"+Формат(НачалоДняДатаОкн, "ДЛФ=Д");
		
		Если мУжеОбработано.Найти(КлючИнтервала) = Неопределено Тогда
			мУжеОбработано.Добавить(КлючИнтервала);
		Иначе	
			Продолжить; // Уже был такой интервал по дате начала и окончания без учета времени
		КонецЕсли;
		
		ПараметрыЗамены1  = Новый Структура;
		ПараметрыЗамены1.Вставить("_1", Формат(Год  (НачалоДняДатаНчл), "ЧГ="));
		ПараметрыЗамены1.Вставить("_2", Формат(Месяц(НачалоДняДатаНчл), "ЧГ="));
		ПараметрыЗамены1.Вставить("_3", Формат(День (НачалоДняДатаНчл), "ЧГ="));
		ПараметрыЗамены1.Вставить("_4", Формат(Год  (НачалоДняДатаОкн), "ЧГ="));
		ПараметрыЗамены1.Вставить("_5", Формат(Месяц(НачалоДняДатаОкн), "ЧГ="));
		ПараметрыЗамены1.Вставить("_6", Формат(День (НачалоДняДатаОкн), "ЧГ="));
		ПараметрыЗамены1.Вставить("_7", "23");
		ПараметрыЗамены1.Вставить("_8", "59");
		ПараметрыЗамены1.Вставить("_9", "59");

		ПараметрыЗамены2  = Новый Структура;
		ПараметрыЗамены2.Вставить("_1", Формат(СтрокаТз.ДнейПериода, "ЧГ="));
		ПараметрыЗамены2.Вставить("_2", Формат(СтрокаТз.ДнейРабочих, "ЧГ="));
	
		ЗапросТекстСекция1 = СтрШаблон(ЗапросТекстШаблон1, 
		ПараметрыЗамены1._1,
		ПараметрыЗамены1._2,
		ПараметрыЗамены1._3,
		ПараметрыЗамены1._4,
		ПараметрыЗамены1._5,
		ПараметрыЗамены1._6, 
		ПараметрыЗамены1._7,
		ПараметрыЗамены1._8,
		ПараметрыЗамены1._9); 
		
		ЗапросТекстСекция2 = СтрШаблон(ЗапросТекстШаблон2, 
		ПараметрыЗамены2._1,
		ПараметрыЗамены2._2); 
		
		ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция1 + ЗапросТекстСекция2;
		
	КонецЦикла;
	
	Возврат ЗапросТекстВставка;	
	
КонецФункции

Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_ОстаткиНаДатаК_П­олучитьТекстВставки(ПармВставки)
	
	ТзПериоды = ПармВставки.ТзПериоды;
	Если НЕ ТзПериоды.Количество() Тогда
		ТекстИсключения =  "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
		ВызватьИсключение ТекстИсключения;
	КонецЕсли;
	// ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"} 
	
	ИмяКолонкиГраницыПериода = "ДатаОкончания";
	ТзПериодыДатаК = ТзПериоды.Скопировать(, ИмяКолонкиГраницыПериода);
	ТзПериодыДатаК.Свернуть(ИмяКолонкиГраницыПериода);
	ТзПериодыДатаК.Сортировать(ИмяКолонкиГраницыПериода);
	
	// Текст первой секции и пример второй из запроса-объединения в СКД. 
	// Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
	// Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
	// формируются динамически в этом методе. Недоступный &ПараметрОстатки служит для поиска секции
	// шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
	//
	// Обратите внимание, что 
	//  - в качестве поля ДатаОкончания - выступает конец дня,
	//  - в качестве параметра остатков - выступает начало следующего дня, что аналогично 
	// ДОБАВИТЬКДАТЕ(&ДатаОкончания, СЕКУНДА, 1), но избавляет запрос от лишнего вычисления. 
	//  
	//  |
	//  |.... тут может быть выборка вложенных полей	
	//  |	ПОМЕСТИТЬ ВтОстатки
    //  |.... тут может быть соединение с другими таблицами
	//  |
	//  |ВЫБРАТЬ 
	//  |	ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
	//  |	СбТвОстатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
	//  |	СбТвОстатки.ВидЗапасов КАК ВидЗапасов,
	//  |	СбТвОстатки.КоличествоОстаток КАК КоличествоОстаток,
	//  |	СбТвОстатки.СтоимостьОстаток КАК СтоимостьОстаток
	//  |	ИЗ
	//  |	    РегистрНакопления.СебестоимостьТоваров.Остатки(, ЛОЖЬ) КАК СбТвОстатки
	//  |	ГДЕ
	//  |		&ПараметрОстатки
	//	|
	//	|ОБЪЕДИНИТЬ ВСЕ
	//	|
	//  |ВЫБРАТЬ 
	//  |	ДАТАВРЕМЯ(2017, 7, 31, 23, 59, 59),
	//  |	СбТвОстатки.АналитикаУчетаНоменклатуры,
	//  |	СбТвОстатки.ВидЗапасов,
	//  |	СбТвОстатки.КоличествоОстаток,
	//  |	СбТвОстатки.СтоимостьОстаток
	//  |ИЗ
	//  |	РегистрНакопления.СебестоимостьТоваров.Остатки(
	//  |			ДАТАВРЕМЯ(2017, 8, 1),
	//  |			АналитикаУчетаНоменклатуры В
	//  |					(ВЫБРАТЬ
	//  |						ВтАналитикаУчетаНоменклатуры.КлючАналитики
	//  |					ИЗ
	//  |						ВтАналитикаУчетаНоменклатуры)
	//  |				И ВидЗапасов В
	//  |					(ВЫБРАТЬ
	//  |						ВтВидыЗапасов.ВидЗапасов
	//  |					ИЗ
	//  |						ВтВидыЗапасов)) КАК СбТвОстатки";
	
	ЗапросТекстВставка = "";
	ЗапросТекстШаблон  = "
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ 
	|	ДАТАВРЕМЯ(%1, %2, %3, %4, %5, %6),
	|	СбТвОстатки.АналитикаУчетаНоменклатуры,
	|	СбТвОстатки.ВидЗапасов,
	|	СбТвОстатки.КоличествоОстаток,
	|	СбТвОстатки.СтоимостьОстаток
	|ИЗ
	|	РегистрНакопления.СебестоимостьТоваров.Остатки(
	|			ДАТАВРЕМЯ(%7, %8, %9),
	|			АналитикаУчетаНоменклатуры В
	|					(ВЫБРАТЬ
	|						ВтАналитикаУчетаНоменклатуры.КлючАналитики
	|					ИЗ
	|						ВтАналитикаУчетаНоменклатуры)
	|				И ВидЗапасов В
	|					(ВЫБРАТЬ
	|						ВтВидыЗапасов.ВидЗапасов
	|					ИЗ
	|						ВтВидыЗапасов)) КАК СбТвОстатки";
	
	
	мУжеОбработано = Новый Массив; // Для контроля дублей дней даты окончания, если есть даты окончания в один день, но разное время
	Для каждого СтрокаТз Из ТзПериодыДатаК Цикл
		
		НачалоДняДатаОкончания = НачалоДня(СтрокаТз.ДатаОкончания);
		Если мУжеОбработано.Найти(НачалоДняДатаОкончания) = Неопределено Тогда
			мУжеОбработано.Добавить(НачалоДняДатаОкончания);
		Иначе	
			Продолжить; // Уже был такой день даты окончания
		КонецЕсли;
		НачалоСледующегоДня = КонецДня(НачалоДняДатаОкончания) + 1;
		
		ПараметрыЗамены  = Новый Структура;
		ПараметрыЗамены.Вставить("_1", Формат(Год  (НачалоДняДатаОкончания), "ЧГ="));
		ПараметрыЗамены.Вставить("_2", Формат(Месяц(НачалоДняДатаОкончания), "ЧГ="));
		ПараметрыЗамены.Вставить("_3", Формат(День (НачалоДняДатаОкончания), "ЧГ="));
		ПараметрыЗамены.Вставить("_4", "23");
		ПараметрыЗамены.Вставить("_5", "59");
		ПараметрыЗамены.Вставить("_6", "59");
		ПараметрыЗамены.Вставить("_7", Формат(Год  (НачалоСледующегоДня), "ЧГ="));
		ПараметрыЗамены.Вставить("_8", Формат(Месяц(НачалоСледующегоДня), "ЧГ="));
		ПараметрыЗамены.Вставить("_9", Формат(День (НачалоСледующегоДня), "ЧГ="));
		
		ЗапросТекстСекция = СтрШаблон(ЗапросТекстШаблон, 
		ПараметрыЗамены._1,
		ПараметрыЗамены._2,
		ПараметрыЗамены._3,
		ПараметрыЗамены._4,
		ПараметрыЗамены._5,
		ПараметрыЗамены._6, 
		ПараметрыЗамены._7,
		ПараметрыЗамены._8,
		ПараметрыЗамены._9); 
		
		ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция;
		
	КонецЦикла;
	
	Возврат ЗапросТекстВставка;
	
КонецФункции
Показать
mrChOP93; +1 Ответить
6. pm74 199 21.05.18 10:37 Сейчас в теме
(1)
код состряпан из 2 макетов, посмотрите может пригодиться
если выбросить все манипуляции с отбором параметрами и проч.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;
    Схема=ПолучитьМакет("НастрокаКолонок");
    КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
    ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;
    //-----------------------------------------------------
    КомпоновщикНастроек0=Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпоновщикНастроек0.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
    КомпоновщикНастроек0.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
    КомпоновщикНастроек0.ЗагрузитьПользовательскиеНастройки(КомпоновщикНастроек.ПользовательскиеНастройки); // Параметры
    //  сортировка
    ГруппаДетальныеЗаписи=КомпоновщикНастроек0.Настройки.Структура[0].Структура[0];
    СтрокаУжеДобавилиВПорядок="";
    Для Каждого ЭлементПользовательскихНастроек Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
        Если ТипЗнч(ЭлементПользовательскихНастроек)=Тип("ПорядокКомпоновкиДанных") Тогда
            Для Каждого ПользовательскийЭлементПорядка Из ЭлементПользовательскихНастроек.Элементы Цикл
                ИндексТочки=Найти(Строка(ПользовательскийЭлементПорядка.Поле),".");
                ПолеПорядка=Лев(Строка(ПользовательскийЭлементПорядка.Поле),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ПользовательскийЭлементПорядка.Поле))));
                Если ГруппаДетальныеЗаписи.Порядок.ДоступныеПоляПорядка.Элементы.Найти(ПолеПорядка)<>Неопределено
                    И ПолеПорядка<>"Контрагент" Тогда
                    НовыйЭлементПользовательскогоПорядка1=ГруппаДетальныеЗаписи.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
                    ЗаполнитьЗначенияСвойств(НовыйЭлементПользовательскогоПорядка1,ПользовательскийЭлементПорядка);
                    СтрокаУжеДобавилиВПорядок=?(ПользовательскийЭлементПорядка.Использование,Строка(ПользовательскийЭлементПорядка.Поле)+";"+СтрокаУжеДобавилиВПорядок,СтрокаУжеДобавилиВПорядок);
                КонецЕсли;    
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    Для Каждого ЭлементПорядка Из КомпоновщикНастроек.Настройки.Порядок.Элементы Цикл
        ИндексТочки=Найти(Строка(ЭлементПорядка.Поле),".");
        ПолеПорядка=Лев(Строка(ЭлементПорядка.Поле),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ЭлементПорядка.Поле))));
        Если ГруппаДетальныеЗаписи.Порядок.ДоступныеПоляПорядка.Элементы.Найти(ПолеПорядка)<>Неопределено
            И ПолеПорядка<>"Контрагент"  
            И Найти(СтрокаУжеДобавилиВПорядок,Строка(ПользовательскийЭлементПорядка.Поле))=0 Тогда
            НовыйЭлементПорядка1=ГруппаДетальныеЗаписи.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
            ЗаполнитьЗначенияСвойств(НовыйЭлементПорядка1,ЭлементПорядка);
        КонецЕсли;
    КонецЦикла;
    // отбор
    СтрокаУжеДобавилиВОтбор="";
    Для Каждого ПользовательскийЭлементОтбора Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
        Если ТипЗнч(ПользовательскийЭлементОтбора)=Тип("ЭлементОтбораКомпоновкиДанных") Тогда
            Если ПользовательскийЭлементОтбора.ЛевоеЗначение=Неопределено Тогда  
                //  в порядке эксперимента
                //ИД=КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(ПользовательскийЭлементОтбора);
                // Отладчик : КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(ПользовательскийЭлементОтбора)    bb47871f-b5f6-4246-b6a2-ff32610fde41    ИдентификаторКомпоновкиДанных
                // Отладчик :КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ИдентификаторПользовательскойНастройки    "bb47871f-b5f6-4246-b6a2-ff32610fde41"    Строка
                 //ТестНужныйЭлементОтбора=КомпоновщикНастроек.Настройки.Отбор.ПолучитьОбъектПоИдентификатору(ИД);
                // Отладчик : КомпоновщикНастроек.Настройки.Отбор.ПолучитьОбъектПоИдентификатору(ИД)   Неопределено ?????
                //  Так и не понял как это работает, просто пройдем циклом
                НужныйЭлементОтбора=Неопределено;
                Для Каждого НужныйЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
                    Если ПользовательскийЭлементОтбора.ИдентификаторПользовательскойНастройки=НужныйЭлементОтбора.ИдентификаторПользовательскойНастройки Тогда
                        НовыйЭлементОтбора1=КомпоновщикНастроек0.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
                        ЗаполнитьЗначенияСвойств(НовыйЭлементОтбора1,ПользовательскийЭлементОтбора);
                        НовыйЭлементОтбора1.ЛевоеЗначение=НужныйЭлементОтбора.ЛевоеЗначение;
                        СтрокаУжеДобавилиВОтбор=?(НовыйЭлементОтбора1.Использование,Строка(НужныйЭлементОтбора.ЛевоеЗначение)+";"+СтрокаУжеДобавилиВОтбор,СтрокаУжеДобавилиВОтбор);
                    КонецЕсли;    
                КонецЦикла;
            Иначе
                ИндексТочки=Найти(Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение),".");
                ПолеОтбора=Лев(Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение))));
                Если КомпоновщикНастроек0.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти(ПолеОтбора)<>Неопределено
                    И Найти(СтрокаУжеДобавилиВОтбор,Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение))=0 Тогда
                    НовыйЭлементОтбора2=КомпоновщикНастроек0.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
                    ЗаполнитьЗначенияСвойств(НовыйЭлементОтбора2,ПользовательскийЭлементОтбора);
                КонецЕсли;
            КонецЕсли;    
        КонецЕсли;
    КонецЦикла;
    Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
        ИндексТочки=Найти(Строка(ЭлементОтбора.ЛевоеЗначение),".");
        ПолеОтбора=Лев(Строка(ЭлементОтбора.ЛевоеЗначение),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ЭлементОтбора.ЛевоеЗначение))));
        Если КомпоновщикНастроек0.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти(ПолеОтбора)<>Неопределено
            И ЗначениеЗаполнено(ЭлементОтбора.ПравоеЗначение)                     
            И Найти(СтрокаУжеДобавилиВОтбор,Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение))=0 Тогда
            НовыйЭлементОтбора1=КомпоновщикНастроек0.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
            ЗаполнитьЗначенияСвойств(НовыйЭлементОтбора1,ЭлементОтбора);
        КонецЕсли;
    КонецЦикла;
    Макет=КомпоновщикМакета.Выполнить(Схема,КомпоновщикНастроек0.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    ПроцессорКомпоновки.Инициализировать(Макет);
    ПроцессорВывода=Новый  ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ТаблицаЗаказы=Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТаблицаЗаказы);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    Ё=ТаблицаЗаказы.Количество()-1;
    Пока  Ё >= 0 Цикл
        Если Не ЗначениеЗаполнено(ТаблицаЗаказы[Ё].Заказ) Тогда
            ТаблицаЗаказы.Удалить(Ё);
        КонецЕсли;
        Ё=Ё-1;
    КонецЦикла;
    Сообщить("Количество записей  в  загруженной таблице значений = "+ ТаблицаЗаказы.Количество());
    // --------------------------------основная схема
    Макет=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.ПолучитьНастройки(),ДанныеРасшифровки);
    ПроцессорКомпоновки.Инициализировать(Макет,Новый Структура("ТаблицаЗаказы",ТаблицаЗаказы),ДанныеРасшифровки);
    ПроцессорВывода=Новый  ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Показать
2. pyrkin_vanya 488 21.05.18 08:38 Сейчас в теме
3. mrChOP93 96 21.05.18 08:41 Сейчас в теме
(2) тут, на сколько я понял, вывод результатов ИЗ скд, а мне нужно засунуть тз В скд и обработать ее в запросе.
4. Octopus 337 21.05.18 08:44 Сейчас в теме
Как-то так
	// Данные объекта
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Партнеры", Партнеры);
	Запрос.УстановитьПараметр("ТекущаяДата", НачалоДня(ТекущаяДата()));
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Партнеры.Ссылка КАК Партнер,
	|	МАКСИМУМ(ЕСТЬNULL(СделкиСКлиентами.ПотенциальнаяСуммаПродажи, 0)) КАК СуммаМаксимальнойСделки,
	|	РАЗНОСТЬДАТ(Партнеры.ДатаРегистрации, &ТекущаяДата, ДЕНЬ) КАК ВозрастПартнера
	|ИЗ
	|	Справочник.Партнеры КАК Партнеры
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СделкиСКлиентами КАК СделкиСКлиентами
	|		ПО (СделкиСКлиентами.Партнер = Партнеры.Ссылка)
	|			И (НЕ СделкиСКлиентами.ПометкаУдаления)
	|			И (СделкиСКлиентами.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСделок.ВРаботе))
	|ГДЕ
	|	&УсловиеПартнеров
	|
	|СГРУППИРОВАТЬ ПО
	|	Партнеры.Ссылка";
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеПартнеров", ?(Партнеры = Неопределено, "ИСТИНА", "Партнеры.Ссылка В (&Партнеры)"));
	
	ДанныеОбъекта = Запрос.Выполнить().Выгрузить();
	
	// Схема компоновки данных
	СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
	
    Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
    Источник.Имя = "ДанныеОбъекта";
    Источник.СтрокаСоединения = "";
    Источник.ТипИсточникаДанных = "Local";
	
	НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
	НаборДанных.Имя = "ДанныеОбъекта";
	НаборДанных.ИмяОбъекта = "ДанныеОбъекта";
	НаборДанных.ИсточникДанных = "ДанныеОбъекта";
	
	Для каждого Колонка из ДанныеОбъекта.Колонки Цикл
		ПолеДанных = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
		ПолеДанных.Поле = Колонка.Имя;
		ПолеДанных.ПутьКДанным = Колонка.Имя;
		ПолеДанных.ТипЗначения = Колонка.ТипЗначения;
	КонецЦикла;
	
	АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор);
	КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
   	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных));
	
	// Параметры схемы
	НастройкиСхемы = УсловияОтбора.УсловияОтбора.Получить();
	Если НастройкиСхемы <> Неопределено Тогда
		КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиСхемы);
		
		ДетальныеЗаписи = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
		ДетальныеЗаписи.Имя = "Детальные";
		ДетальныеЗаписи.Использование = Истина;

		ВыбранноеПоле = ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));   
		ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Партнер");
		
		КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
		МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
		
		ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
		ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, Новый Структура("ДанныеОбъекта", ДанныеОбъекта));
		
		ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
		ТаблицаЗначений = Новый ТаблицаЗначений;
		ПроцессорВывода.УстановитьОбъект(ТаблицаЗначений);
		ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
		
		Результат = ТаблицаЗначений.ВыгрузитьКолонку("Партнер");
	КонецЕсли;
Показать
Оставьте свое сообщение

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