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