Добрый день! Есть отчет о движении денежных средств, вот сам код:
Процедура Сформировать()
Если (ПустоеЗначение(ВыбНачПериода)=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 Подскажите, что я не так сделал?! Дайте совет куда мне "рыть" дальше!? Сам отчет прилагается... и не бойтесь ходить по ссылкам с картинками, они безопасные! Заранее благодарен любому, кто откликнется...
(1) Elected,
Проблема в том, что при обращении к итогам по группе "СтатьяДДС" вы не сможете обратиться к группировке "Контрагент" и так далее.
Как вариант решения можно предложить собирать отдельно итоги статьям ДДС в таблицу значений.
Предположим что есть таблица значений с колонками "ГруппаДДС, СтатьяДДС, Контрагент, Итог, Месяц1, Месяц2.."
1. цикл "Статья ДДС"
2. цикл "Контрагент"
3. цикл "Месяц". Здесь идет добавление строк в итоговую таблицу значений для каждой нужно вам группировки
Например:
ТЗ.НоваяСтрока();
ТЗ.ГруппаДДС = Запрос.Статья.Родитель;
ТЗ.СтатьяДДС = "";
ТЗ.Контрагент = "";
ТЗ.Месяц = Запрос.НужнаяСумма; // здесь нужно определить в какую колонку засунуть цифру.
ТЗ.Итог = Запрос.НужнаяСумма;
ТЗ.НоваяСтрока();
ТЗ.ГруппаДДС = Запрос.Статья.Родитель;
ТЗ.СтатьяДДС = Запрос.Статья;
ТЗ.Контрагент = "";
ТЗ.Месяц = Запрос.НужнаяСумма; // здесь нужно определить в какую колонку засунуть цифру.
ТЗ.Итог = Запрос.НужнаяСумма;
ТЗ.НоваяСтрока();
ТЗ.ГруппаДДС = Запрос.Статья.Родитель;
ТЗ.СтатьяДДС = Запрос.Статья;
ТЗ.Контрагент = Запрос.Контрагент;
ТЗ.Месяц = Запрос.НужнаяСумма; // здесь нужно определить в какую колонку засунуть цифру.
ТЗ.Итог = Запрос.НужнаяСумма;
Показать
Обратите внимание, что эти три строчки в таблицу значений добавляются при каждом прохождении цикла по месяцам.
После заполнения таблицы значений выполнить свертку ТЗ.Свернуть("ГруппаДДС, СтатьяДДС, Контрагент","Итог, Месяц1, Месяц2..");
Дальше, при желании отсортировать, и выполнить заполнение отчетной формы. При попытке реализации данного алгоритма нужно обратить внимание на проверку "Запрос.Статья.Родитель".
Минус данного решения в "неуниверсальности".