Помогите вывести в отчет итоги по группам!

1. Elected 21 21.04.15 11:01 Сейчас в теме
Добрый день! Есть отчет о движении денежных средств, вот сам код:
Процедура Сформировать()

	Если (ПустоеЗначение(ВыбНачПериода)=1) или (ПустоеЗначение(ВыбКонПериода)=1) Тогда
		Предупреждение("Не верно задан период!",10);
		Возврат;
	КонецЕсли;
	ВыбНачПериода=НачМесяца(ВыбНачПериода);
	ВыбКонПериода=КонМесяца(ВыбКонПериода);
	Если ВыбКонПериода>ПолучитьДатуТА() Тогда
		ВыбКонПериода=ПолучитьДатуТА();
	КонецЕсли;
	Если ВыбНачПериода>ВыбКонПериода Тогда
		ВыбНачПериода=ВыбКонПериода;
	КонецЕсли;

	ТЗ = СоздатьОбъект("ТаблицаЗначений");
	ТЗ.Очистить();
	ТЗ.НоваяКолонка("Наименование");
	
	Таб=СоздатьОбъект("Таблица");
	Таб.ИсходнаяТаблица("Сформировать");
	Таб.ВывестиСекцию("Шапка|Поставщик");
	НачДаты = ВыбНачПериода;
	Пока 1=1 Цикл
		Таб.ПрисоединитьСекцию("Шапка|Месяц");
		ТЗ.НоваяКолонка(,"Число",,,,,,);
		НачДаты = ДобавитьМесяц(НачДаты,1);
		Если НачДаты > ВыбКонПериода Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Таб.ПрисоединитьСекцию("Шапка|Итого");
	ТЗ.НоваяКолонка("Итого","Число",,,,,,);

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

	Запрос2=СоздатьОбъект("Запрос");
	Итого=0;
	ТекстЗапроса="
	|Период с ВыбНачПериода по ВыбКонПериода;   
	|СтатьяДДС = Регистр.ЗаявкиНаПлатежи.СтатьяДДС;
	|Контрагент	= Регистр.ЗаявкиНаПлатежи.Контрагент;
	|СуммаПлатежа		= Регистр.ЗаявкиНаПлатежи.Сумма;
	|Функция СуммаСуммаПлатежа = Сумма(СуммаПлатежа);  
	|Функция СуммаНачОст = НачОст(СуммаПлатежа);
	|Функция СуммаПриход = Приход(СуммаПлатежа);
	|Функция СуммаРасход = Расход(СуммаПлатежа);
	|Функция СуммаКонОст = КонОст(СуммаПлатежа);
	|Группировка СтатьяДДС Все ВошедшиеВЗапрос;
	|Группировка Контрагент Без групп;
	|Группировка Месяц Все ВошедшиеВЗапрос;
	|";
	
	Если Запрос2.Выполнить(ТекстЗапроса) = 0 Тогда
		Сообщить("Неверный основной запрос");
		Возврат;
	КонецЕсли;
		
	НомерПоз = 0;   
	Пока Запрос2.Группировка("СтатьяДДС") = 1 Цикл 
		ТЗ.УдалитьСтроки();
		Таб.ВывестиСекцию("Поставщик|СтатьяДДС");
		ТЗ.НоваяСтрока();
		ТЗ.Наименование = Запрос2.СтатьяДДС;				
		Пока Запрос2.Группировка("Контрагент") = 1 Цикл
			ТЗ.НоваяСтрока();
			ТЗ.Наименование = Запрос2.Контрагент;
			НомСтр = "";
			НомСтр = ТЗ.КоличествоСтрок();
			НомКол = 1;
			ИтогПоСтроке = "";
			Пока Запрос2.Группировка("Месяц") = 1 Цикл
				НомКол = НомКол+1;
				СуммаПрод = Запрос2.СуммаРасход;
				ТЗ.УстановитьЗначение(НомСтр,НомКол,СуммаПрод);
				ИтогПоСтроке = Число(ИтогПоСтроке) + Число(СуммаПрод);
			КонецЦикла;
			ТЗ.УстановитьЗначение(НомСтр,(НомКол + 1),ИтогПоСтроке);
		КонецЦикла;
		Для НомКолСумм = 2 По ТЗ.КоличествоКолонок() Цикл
			ИтогПоКол = "";
			ИтогПоКол = ТЗ.Итог(НомКолСумм);	
			ТЗ.УстановитьЗначение(1,НомКолСумм,ИтогПоКол);
			Если (НомКолСумм = ТЗ.КоличествоКолонок()) Тогда
				Таб.ПрисоединитьСекцию("СтатьяДДС|Итого");
			Иначе
				Таб.ПрисоединитьСекцию("СтатьяДДС|Месяц");
			КонецЕсли;
		КонецЦикла;
		Для НомСтрТЗ = 2 По ТЗ.КоличествоСтрок() Цикл
			НомерПоз = НомерПоз + 1;
			Контрагент = ТЗ.ПолучитьЗначение(НомСтрТЗ,1);
			Таб.ВывестиСекцию("Контрагент|Поставщик");
			Для НомКолТЗ = 2 По  ТЗ.КоличествоКолонок() Цикл
				СуммаМесяца = ТЗ.ПолучитьЗначение(НомСтрТЗ,НомКолТЗ);
				Если (НомКолТЗ = ТЗ.КоличествоКолонок()) Тогда
					Таб.ПрисоединитьСекцию("Контрагент|Итого");
				Иначе
					Таб.ПрисоединитьСекцию("Контрагент|Месяц");
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	Таб.Опции(0,0,5,2);
	Таб.ТолькоПросмотр(1);
	Таб.ПараметрыСтраницы(2,,,,,,,,,1);
	Таб.Показать("Сформировать");
КонецПроцедуры //Сформировать()
Показать


При выводе отчета на экран, получаю следующее:
http://data3.floomby.com/files/share/21_4_2015/9/tjIskla4h0Ghb6MOBIPJA.jpg
IT расходы - это группа, но итоги по группе не наблюдаются(((. Сумма расходов по месяцам и в колонке ИТОГО тоже равны 0. Там где идет группировка по контрагентам, выводятся, непонятно зачем, пустая строка с нулевыми суммами. Не могу понять откуда она берётся?!... И последних двух строк тоже не должно быть, так как по ним реально в регистре нет никакого движения. В общем должно получится вот так:
http://data3.floomby.com/files/share/21_4_2015/9/PFffKcPrF02e39QQ5N3dw.jpg
Подскажите, что я не так сделал?! Дайте совет куда мне "рыть" дальше!? Сам отчет прилагается... и не бойтесь ходить по ссылкам с картинками, они безопасные! Заранее благодарен любому, кто откликнется...

P.S. С итогами по группе разобрался.
Прикрепленные файлы:
ОтчетДДС.ert
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. l_user 21.04.15 13:40 Сейчас в теме
(1) Elected,
Проблема в том, что при обращении к итогам по группе "СтатьяДДС" вы не сможете обратиться к группировке "Контрагент" и так далее.

Как вариант решения можно предложить собирать отдельно итоги статьям ДДС в таблицу значений.
Предположим что есть таблица значений с колонками "ГруппаДДС, СтатьяДДС, Контрагент, Итог, Месяц1, Месяц2.."
1. цикл "Статья ДДС"
2. цикл "Контрагент"
3. цикл "Месяц". Здесь идет добавление строк в итоговую таблицу значений для каждой нужно вам группировки
Например:
ТЗ.НоваяСтрока();
ТЗ.ГруппаДДС = Запрос.Статья.Родитель;
ТЗ.СтатьяДДС = "";
ТЗ.Контрагент = "";
ТЗ.Месяц = Запрос.НужнаяСумма; // здесь нужно определить в какую колонку засунуть цифру.
ТЗ.Итог  = Запрос.НужнаяСумма;

ТЗ.НоваяСтрока();
ТЗ.ГруппаДДС = Запрос.Статья.Родитель;
ТЗ.СтатьяДДС = Запрос.Статья;
ТЗ.Контрагент = "";
ТЗ.Месяц = Запрос.НужнаяСумма; // здесь нужно определить в какую колонку засунуть цифру.
ТЗ.Итог  = Запрос.НужнаяСумма;

ТЗ.НоваяСтрока();
ТЗ.ГруппаДДС = Запрос.Статья.Родитель;
ТЗ.СтатьяДДС = Запрос.Статья;
ТЗ.Контрагент = Запрос.Контрагент;
ТЗ.Месяц = Запрос.НужнаяСумма; // здесь нужно определить в какую колонку засунуть цифру.
ТЗ.Итог  = Запрос.НужнаяСумма;
Показать

Обратите внимание, что эти три строчки в таблицу значений добавляются при каждом прохождении цикла по месяцам.

После заполнения таблицы значений выполнить свертку ТЗ.Свернуть("ГруппаДДС, СтатьяДДС, Контрагент","Итог, Месяц1, Месяц2..");
Дальше, при желании отсортировать, и выполнить заполнение отчетной формы. При попытке реализации данного алгоритма нужно обратить внимание на проверку "Запрос.Статья.Родитель".
Минус данного решения в "неуниверсальности".
2. Оберон 16 21.04.15 11:23 Сейчас в теме
|Группировка СтатьяДДС Все ВошедшиеВЗапрос;

заменить на |Группировка СтатьяДДС;
3. Elected 21 21.04.15 11:27 Сейчас в теме
5. Serginio 938 22.04.15 10:32 Сейчас в теме
http://infostart.ru/public/345658/

Здесь есть обработка которая строит дерево и вычисляет суммы по группам и выводит данные по группам со сдвигом
Оставьте свое сообщение

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