1s Анализ реестра


Процедура Сформироватьотчет(ТаблицаУслуги)
	
	Если Общий Тогда
		
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ *,
		               | РеестрДляКлиентовУслуги.Ссылка.Ссылка КАК Реестр
		               |ИЗ
		               |	Документ.РеестрДляКлиентов.Услуги КАК РеестрДляКлиентовУслуги
		               |ГДЕ
		               |	РеестрДляКлиентовУслуги.Ссылка.Проведен
		               |	И РеестрДляКлиентовУслуги.Ссылка.ДатаНач >= &ДатаНач
		               |	И РеестрДляКлиентовУслуги.Ссылка.ДатаКон 
		               |	И РеестрДляКлиентовУслуги.Ссылка.Контрагент = &Контрагент
		               |	И РеестрДляКлиентовУслуги.Ссылка.Организация = &Организация";
	
		Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Документ.ДатаНач));
		Запрос.УстановитьПараметр("ДатаКон", КонецДня(Документ.ДатаКон));
		Запрос.УстановитьПараметр("Контрагент", Документ.Контрагент);
		Запрос.УстановитьПараметр("Организация", Документ.Организация);
		
	Иначе
		
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		               |	*,
		               |	РеестрДляКлиентовУслуги.Ссылка.Ссылка КАК Реестр
		               |ИЗ
		               |	Документ.РеестрДляКлиентов.Услуги КАК РеестрДляКлиентовУслуги
		               |ГДЕ
		               |	РеестрДляКлиентовУслуги.Ссылка.Ссылка = &Документ";
	
		Запрос.УстановитьПараметр("Документ", Документ);
		
		
	КонецЕсли;
	
	Если ТипЗнч(Документ) = Тип("ДокументСсылка.Реестр") Тогда
	   Запрос.Текст = СтрЗаменить(Запрос.Текст, "РеестрДляКлиентов", "Реестр");
	КонецЕсли;
	
	ТаблицаДокумента = Запрос.Выполнить().Выгрузить();
	
	Запрос = Новый Запрос;
	
	Запрос.Текст = "ВЫБРАТЬ";
	
	ТекстРеквизитов = "";
	ТекстСоединения = "		ПО (";
	
	Для Каждого Реквизит Из Документ.Метаданные().ТабличныеЧасти.Услуги.Реквизиты Цикл
		
		Если Реквизит.Имя = "Номер" Тогда
			Прервать;
		КонецЕсли;
		
		ТекстРеквизитов = ТекстРеквизитов + "
		|	РеестрДляКлиентовУслуги." + Реквизит.Имя + ",";
		
		Если Реквизит.Имя > "Содержание" Тогда//строка неограниченной длины не может быть в условии соединения
			Если НЕ (НеУчитыватьID И Реквизит.Имя = "ИдСтроки") Тогда
				ТекстСоединения = ТекстСоединения + "ТаблицаДокумента." + Реквизит.Имя + " = " + "ТаблицаУслуги." + Реквизит.Имя + " И ";
			КонецЕсли;
		КонецЕсли;
		
		//
		//Заполним поля КД
		//
		
	КонецЦикла;
	
	//ТекстРеквизитов = ТекстРеквизитов + "
	//|	РеестрДляКлиентовУслуги.Реестр КАК Реестр";
	
	
	ТекстРеквизитов = Лев(ТекстРеквизитов, СтрДлина(ТекстРеквизитов)-1);//","
	ТекстСоединения = Лев(ТекстСоединения, СтрДлина(ТекстСоединения)-3);//" И "
	ТекстСоединения = ТекстСоединения + ")";
	
	
	Запрос.Текст = Запрос.Текст + ТекстРеквизитов + ", " + "
	               |	РеестрДляКлиентовУслуги.Реестр КАК Реестр
	               |ПОМЕСТИТЬ ТаблицаДокумента
	               |ИЗ
	               |	&ТаблицаДокумента КАК РеестрДляКлиентовУслуги
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ";
	Запрос.Текст = Запрос.Текст + ТекстРеквизитов + "
					|ПОМЕСТИТЬ ТаблицаУслуги
	               |ИЗ
	               |	&ТаблицаУслуги КАК РеестрДляКлиентовУслуги
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ";
				   
	Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить(ТекстРеквизитов, "РеестрДляКлиентовУслуги", "ТаблицаДокумента"), "ТаблицаДокумента.Содержание", "ВЫРАЗИТЬ(ТаблицаДокумента.Содержание КАК СТРОКА(300)) КАК Содержание") + "," + "
	               |	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТаблицаДокумента.Реестр) КАК КоличествоПовторов
	               |ПОМЕСТИТЬ ТаблицаДублейДокумента
	               |ИЗ
	               |	ТаблицаДокумента КАК ТаблицаДокумента
	               |	СГРУППИРОВАТЬ ПО
				   //По содержанию не группируем
	               |	" +	СтрЗаменить(СтрЗаменить(ТекстРеквизитов, "РеестрДляКлиентовУслуги", "ТаблицаДокумента"), "ТаблицаДокумента.Содержание", "ВЫРАЗИТЬ(ТаблицаДокумента.Содержание КАК СТРОКА(300))") +"
				   //
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ";				   
				   
	Запрос.Текст = Запрос.Текст + СтрЗаменить(ТекстРеквизитов, "РеестрДляКлиентовУслуги", "ТаблицаДокумента") + "," + "
	               |	ТаблицаДокумента.Реестр КАК Реестр,
	               |	ТаблицаУслуги.Сделка КАК Ссылка1
	               |ПОМЕСТИТЬ ТаблицаДокументаСТаблицаУслуги
	               |ИЗ
	               |	ТаблицаДокумента КАК ТаблицаДокумента
	               |		ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаУслуги КАК ТаблицаУслуги" + "
				   |" + ТекстСоединения + "
				   |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ" + СтрЗаменить(ТекстРеквизитов, "РеестрДляКлиентовУслуги", "ТаблицаУслуги") + "," + "
	               |	ТаблицаДокумента.Реестр КАК Реестр,
				   |	ТаблицаДокумента.Сделка КАК Ссылка1
	               |ПОМЕСТИТЬ ТаблицаУслугиСТаблицаДокумента
	               |ИЗ
	               |	ТаблицаУслуги КАК ТаблицаУслуги
	               |		ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаДокумента КАК ТаблицаДокумента" + "
				   |" + ТекстСоединения + "
				   |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ" + СтрЗаменить(ТекстРеквизитов, "РеестрДляКлиентовУслуги", "ТаблицаДокументаСТаблицаУслуги") + "," + "
				   |	""Строка будет удалена"" КАК Отличия,
				   |	ТаблицаДокументаСТаблицаУслуги.Сумма КАК СуммаБудетУдалена,
				   |	0 КАК СуммаБудетДобавлена,
	               |	ТаблицаДокументаСТаблицаУслуги.Реестр КАК Реестр
	               |ИЗ
	               |	ТаблицаДокументаСТаблицаУслуги КАК ТаблицаДокументаСТаблицаУслуги
	               |ГДЕ
	               |	ТаблицаДокументаСТаблицаУслуги.Ссылка1 ЕСТЬ NULL 
	               |
	               |ОБЪЕДИНИТЬ ВСЕ
	               |
	               |ВЫБРАТЬ" + СтрЗаменить(ТекстРеквизитов, "РеестрДляКлиентовУслуги", "ТаблицаУслугиСТаблицаДокумента") + "," + "
				   |	""Строка будет добавлена"",
				   |	0,
				   |	ТаблицаУслугиСТаблицаДокумента.Сумма,
				   |	ТаблицаУслугиСТаблицаДокумента.Реестр
	               |ИЗ
	               |	ТаблицаУслугиСТаблицаДокумента КАК ТаблицаУслугиСТаблицаДокумента
	               |ГДЕ
	               |	ТаблицаУслугиСТаблицаДокумента.Ссылка1 ЕСТЬ NULL 
	               |
	               |ОБЪЕДИНИТЬ ВСЕ
	               |
	               |ВЫБРАТЬ" + СтрЗаменить(ТекстРеквизитов, "РеестрДляКлиентовУслуги", "ТаблицаДублейДокумента") + "," + "
				   |	""Строка задублирована в различных реестрах"",
				   |	ТаблицаДублейДокумента.Сумма,
				   |	0,
				   |	NULL
	               |ИЗ
	               |	ТаблицаДублейДокумента КАК ТаблицаДублейДокумента
	               |ГДЕ
	               |	ТаблицаДублейДокумента.КоличествоПовторов > 1";
	
	
	Запрос.УстановитьПараметр("ТаблицаУслуги", ТаблицаУслуги);
	Запрос.УстановитьПараметр("ТаблицаДокумента", ТаблицаДокумента);
	
	Результат = Запрос.Выполнить().Выгрузить();
	
	Если ТипЗнч(Документ) = Тип("ДокументСсылка.РеестрДляКлиентов") Тогда
	
		СхемаКомпоновкиДанных = ПолучитьМакет("СхемаКДРеестрДляКлиентов");
		
	Иначе
		
		СхемаКомпоновкиДанных = ПолучитьМакет("СхемаКДРеестр");
		
	КонецЕсли;
	
	КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
	Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
	КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
	
	
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("ТЗ", Результат);  
	
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;      
    
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,  КомпоновщикНастроек.ПолучитьНастройки(), , ,);
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, );
	
	ДокументРезультат = ЭлементыФормы.ПолеРезультатаОтчета;
	
	ДокументРезультат.Очистить();
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
	
КонецПроцедуры