Создаю отчет "Баланс" (не СКД)
Отчет имеет ПолеТабличногоДокумента куда весь результат и выводиться.
Не могу решить вопрос с проверкой конечного результата на ноль и скрытие таких строк. Может у кого будет идей в самом коде обработки результата такое сделать.
Спасибо заранее
(9) ну как. Рисуешь, какой должен быть отчет. Что в колонках. Делаешь такую же таблицу значений. Если отчет многоуровневый, то - дерево значений. Заполняешь его всеми данными. Потом выводишь таблицу значений в табличный документ.
Такая технология не будет работать, если отчет очень большой. Если в нем тысяча колонок и миллионы строк. Но кмк если так, то это говорит о неправильной концепции отчета.
Ну вот например у тебя будут колонки
ВыручкаЗапчасти
ВыручкаАвтошины
ВыручкаНедвижимость
ВыручкаИмущество
ВыручкаПрочие
если надо по месяцам, то можно по-разному, я делаю обычно вложенные таблицы. Ну примерно так:
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.добавить("ВыручкаЗапчасти");
блабла
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.ВыручкаЗапчасти = Новый ТаблицаЗначений();
Для н = 1 По 12 Цикл
НоваяСтрока.ВыручкаЗапчасти.Колонки.Добавить("Месяц" + н);
КонецЦикла;
ну и так далее.
В итоге у тебя есть полная структура выводимых в отчет данных, с которыми можно делать все что угодно, и потом вывести то, что нужно.
(1) Farkhod82, в этом отчете реализовано что-то наподобие: http://infostart.ru/public/102009/ Для реализации нужно сделать выгрузку результата запроса в таблицу значений и сделать Массив, содержащий наименования выводимых данных, т.е. Запчасти, автошины и т.д
Будет область, в которую эти данные и выводить.
Выводим сначала Обороты и выручку, потом обходя массив, выводим например запчасти - смотрим по таблице, есть ли данные за весь период - то выводим эту строку, дальше помесячная пристыковка данных, нет - не выводим.
Можно поставить вывод строки в условие:
ВыручкаВсего = ВыручкаЗапчасти + ВыручкаАвтошины + ВыручкаНедвижимость + ВыручкаИмущество + ВыручкаПрочие;
Если ВыручкаЗапчасти = 0 и ВыручкаАвтошины = 0 и ВыручкаНедвижимость = 0 и ВыручкаИмущество = 0 и ВыручкаПрочие = 0 и ВыручкаВсего = 0 тогда
Иначе
ОбластьВыручкаРезультат.Параметры.ВыручкаЗапчасти = Формат(ВыручкаЗапчасти, "ЧЦ=15; ЧДЦ=2; ЧН=0,00");
вариант 2 не устраивает потому что у меня отчет выводиться по принципу Вывести(), вывожу колонку с наименованиями всех значений сразу, а потом к ним присоединяю колонку функцией Присоединить().
По этой схеме будет выводиться колонка с наименованиями а суммы будут пустыми
(3) Jannin,
Видимо не до конца донес информацию
Отчет формирует записи по месяцам, каждая колонка это один месяц
Можно конечно динамически создавать строки, а не как сейчас по строго заданному макету(смотреть пример) и отсекать все нули.
Но в этом случаи, если в первом месяце сумма 0 то следующие месяцы не будут выводиться ((((
Может у кого есть механизм где можно все данные предварительно забить в Таблицу, отфильтровать, а потом выводить в Табличный документ?
В этом варианте было бы на много проще.
(5) подобные отчеты всегда делаю сначала выводом в таблицу значений или дерево значений, а потом в печатную форму. Если сразу выводить печатную форму, любая обработка результатов превращается в большую проблему. И изменения в отчете делать намного проще, когда все сначала аккуратно сложено в табличку. Чем больше в отчете всяких расчетов, тем это актуальнее.
(9) ну как. Рисуешь, какой должен быть отчет. Что в колонках. Делаешь такую же таблицу значений. Если отчет многоуровневый, то - дерево значений. Заполняешь его всеми данными. Потом выводишь таблицу значений в табличный документ.
Такая технология не будет работать, если отчет очень большой. Если в нем тысяча колонок и миллионы строк. Но кмк если так, то это говорит о неправильной концепции отчета.
Ну вот например у тебя будут колонки
ВыручкаЗапчасти
ВыручкаАвтошины
ВыручкаНедвижимость
ВыручкаИмущество
ВыручкаПрочие
если надо по месяцам, то можно по-разному, я делаю обычно вложенные таблицы. Ну примерно так:
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.добавить("ВыручкаЗапчасти");
блабла
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.ВыручкаЗапчасти = Новый ТаблицаЗначений();
Для н = 1 По 12 Цикл
НоваяСтрока.ВыручкаЗапчасти.Колонки.Добавить("Месяц" + н);
КонецЦикла;
ну и так далее.
В итоге у тебя есть полная структура выводимых в отчет данных, с которыми можно делать все что угодно, и потом вывести то, что нужно.
Спасибо всем кто помог:
Если коме надо будет вот то получилось
Процедура СформироватьОтчет()
ВыборкаПроекты = ВыборкаПроекты();
ТаблицаРезультат = Новый ТаблицаЗначений;
ТаблицаРезультат.Колонки.Добавить("Проект");
Для н=0 по Месяцев Цикл
ТаблицаРезультат.Колонки.Добавить("Месяц" + Строка(Н+1));
КонецЦикла;
Пока ВыборкаПроекты.Следующий() Цикл
НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.Проект = ВыборкаПроекты.Ссылка;
Для Н=0 По Месяцев Цикл
Сумма = 0;
ТекМесяц = КонецМесяца(ДобавитьМесяц(ЭлементыФормы.ДатаНачало.Значение, Н));
ВыборкаВыручка = ВыборкаВыручка(ТекМесяц, ВыборкаПроекты.Ссылка);
Пока ВыборкаВыручка.Следующий() Цикл
Месяц = "Месяц" + Строка(Н+1);
НоваяСтрока[Месяц] = ВыборкаВыручка.Сумма;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ТаблицаРезультат = УрезаниеТаблицаРезультат(ТаблицаРезультат, Месяцев);
ОбластьВыручкаШапка = Макет.ПолучитьОбласть("ВыручкаШапка|Наименование");
ТабДок.Вывести(ОбластьВыручкаШапка);
Для Н=0 по Месяцев цикл
ОбластьВыручкаШапкаРезультат = Макет.ПолучитьОбласть("ВыручкаШапка|Результат");
ТабДок.Присоединить(ОбластьВыручкаШапкаРезультат);
КонецЦикла;
ОбластьПроект = Макет.ПолучитьОбласть("Проекты|Наименование");
Для каждого Стр Из ТаблицаРезультат Цикл
СуммаПоПроекту = 0;
ОбластьПроект.Параметры.НаименованиеПроекта = Стр.Проект;
ТабДок.Вывести(ОбластьПроект);
ОбластьПроектРезультат = Макет.ПолучитьОбласть("Проекты|Результат");
Для Н=0 по Месяцев цикл
Месяц = "Месяц" + Строка(Н+1);
СуммаПоПроекту = ?(Стр[Месяц]=Неопределено, 0, Стр[Месяц]);
ОбластьПроектРезультат.Параметры.СуммаПоПроекту = Формат(СуммаПоПроекту, "ЧЦ=15; ЧДЦ=2; ЧН=0,00");
ТабДок.Присоединить(ОбластьПроектРезультат);
КонецЦикла;
КонецЦикла;
ОбластьИтого = Макет.ПолучитьОбласть("ПроектыВсего|Наименование");
ТабДок.Вывести(ОбластьИтого);
Для Н =0 ПО Месяцев Цикл
ОбластьИтогоРезультат = Макет.ПолучитьОбласть("ПроектыВсего|Результат");
Месяц = "Месяц" + Строка(Н+1);
ОбластьИтогоРезультат.Параметры.СуммаПоПроекту = Формат(ТаблицаРезультат.Итог(Месяц), "ЧЦ=15; ЧДЦ=2; ЧН=0,00");
ТабДок.Присоединить(ОбластьИтогоРезультат);
КонецЦикла;
КонецПроцедуры
Функция УрезаниеТаблицаРезультат(ТаблицаРезультат, Месяцев)
СтаршийИндексКолонок = ТаблицаРезультат.Колонки.Количество() - 1;
Индекс = ТаблицаРезультат.Количество() - 1;
Пока Индекс >= 0 Цикл
Сумма = 0;
Для Сч = 0 По СтаршийИндексКолонок Цикл
Если ТипЗнч(ТаблицаРезультат[Индекс][Сч]) = Тип("Число") Тогда
Сумма = Сумма + ТаблицаРезультат[Индекс][Сч];
КонецЕсли;
КонецЦикла;
Если Сумма = 0 Тогда
ТаблицаРезультат.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
Возврат ТаблицаРезультат;
КонецФункции
//Месяцев - количество месяцев между датой НачалоПериода и КонецПериода