8.х Подсчет строк в макете отчета

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем mhl, 15 сен 2007.

  1. TopicStarter Overlay
    mhl
    Offline

    mhl Опытный в 1С

    Регистрация:
    23 июн 2007
    Сообщения:
    418
    Симпатии:
    0
    Баллы:
    26
    Народ помогите!!!
    Есть такая таблица:

    *************************************
    Дата | Расход
    01.01.2007 | 10
    05.01.2007 | 20
    25.01.2007 | 56

    05.02.2007 | 100
    12.02.2007 | 250
    ***************************************

    Как посчитать расход по месяцам и результаты выводить в конце каждого месяца? Т.е. как только заканчивается даты с январем делать итог и так с каждым месяцем. У меня выходит только в конце таблицы.
  2. lazy
    Offline

    lazy Модераторы Команда форума Модератор

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Вот вариант - но я его толком не проверял. На 4х строках выдал верные результаты, и я остался доволен, так, что если в нем есть баги - ногами не пинать :unsure: Года не различает, предполагает, что таблица содержит хотябы одну строку, и сортирована по возрастанию дат в пределах одного года. Использовал Сообщить() т.к. не понятно, куда собственно выводить - в ТЗ, в ТабличныйДокумент или еще куда...
    Код:
    // Предположу, что Таблица - ТЗ, Дата и Расход, соответственно ее 
    // колонки
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    ТекущийМесяц = Месяц(Таблица[0].Дата); // текущий месяц, из первой строки
    СуммаВМесяце = 0; // вот в эту переменную мы будем подсчитывать сумму для каждого месяца
    Для каждого стр из Таблица Цикл // основной цикл работы
    Если ТекущийМесяц <> Месяц(стр.Дата) Тогда // ага, сменился месяц, нужно выводить итог
    Сообщить("для месяца № "+ТекущийМесяц+" сумма = "+СуммаВМесяце); // вывод результата за месяц
    ТекущийМесяц = Месяц(стр.Дата); // новый рабочий период
    СуммаВМесяце = 0; // обнулим сумму месяца
    КонецЕсли;
    СуммаВМесяце = СуммаВМесяце  + стр.Расход; // увеличим счетчик текущего месяца
    КонецЦикла;
    // выведем месяц оказавшийся последним...
    Сообщить("для месяца № "+ТекущийМесяц+" сумма = "+СуммаВМесяце+" это заключительная строка");
    КонецПроцедуры
    
    P.S. Если данные добыты запросом, может есть смысл перестроить запрос, чтобы не извращаться с подобными конструкциями?
  3. TopicStarter Overlay
    mhl
    Offline

    mhl Опытный в 1С

    Регистрация:
    23 июн 2007
    Сообщения:
    418
    Симпатии:
    0
    Баллы:
    26
    Извини, я не совсем корректно поставил вопрос. Да, данные добываются запросом.
    Вот данная процедура:
    Код:
    Процедура Отчет(ТабДок) Экспорт
    //{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ(Отчет)
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    
    Макет = ВнешняяОбработкаОбъект.ПолучитьМакет("Отчет");
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    РазмещениеЗаказа.Дата КАК Дата,
    |    РазмещениеЗаказа.Номер,
    |    РазмещениеЗаказа.ДатаРеализации,
    |    РазмещениеЗаказа.Номенклатура,
    |    ПРЕДСТАВЛЕНИЕ(РазмещениеЗаказа.Номенклатура),
    |    РазмещениеЗаказа.Контрагент,
    |    ПРЕДСТАВЛЕНИЕ(РазмещениеЗаказа.Контрагент),
    |    РазмещениеЗаказа.ИтогоКВыплатеФакт,
    |    РазмещениеЗаказа.ОтгрузкаПродукции,
    |    ПРЕДСТАВЛЕНИЕ(РазмещениеЗаказа.ОтгрузкаПродукции),
    |    РазмещениеЗаказа.Ссылка,
    |    РазмещениеЗаказа.Комментарий,
    |    РазмещениеЗаказа.ИтогоРасходМатериал,
    |    РазмещениеЗаказа.ИтогоРасходЗарплата,
    |    РазмещениеЗаказа.ИтогоРасходПрочее,
    |    РазмещениеЗаказа.ПроцентНаценки,
    |    РазмещениеЗаказа.Количество,
    |    РазмещениеЗаказа.Ответственный,
    |    РазмещениеЗаказа.ДатаДок,
    |    РазмещениеЗаказа.Наценка
    |ИЗ
    |    Документ.РазмещениеЗаказа КАК РазмещениеЗаказа
    |ГДЕ
    |    РазмещениеЗаказа.Дата >= &НачДата
    |    И РазмещениеЗаказа.Дата <= &КонДата";
    Если ДопКонтрагент.Пустая() ТОгда
    Иначе
    Запрос.Текст = Запрос.Текст +         
    "
    |    И РазмещениеЗаказа.Контрагент = &Контрагент";
    КонецЕсли;
    Запрос.Текст = Запрос.Текст +         
    "
    |УПОРЯДОЧИТЬ ПО
    |    Дата
    |АВТОУПОРЯДОЧИВАНИЕ";
    
    Запрос.УстановитьПараметр("НачДата", КонецДня(НачДата));
    Запрос.УстановитьПараметр("КонДата", НачалоДня(КонДата));
    Запрос.УстановитьПараметр("Контрагент", ДопКонтрагент);
    
    Результат = Запрос.Выполнить();
    
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
    ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
    ИтогиЗаМесяц = Макет.ПолучитьОбласть("ИтогЗаМесяц"); //в эту область хочу выводить итоги
    
    ТабДок.Очистить();
    ТабДок.Вывести(ОбластьЗаголовок);
    ТабДок.Вывести(ОбластьШапкаТаблицы);
    ТабДок.НачатьАвтогруппировкуСтрок();
    
    ВыборкаДетали = Результат.Выбрать();
    
    Итог=0; //в эту переменную буду подсчитывать результаты по месяцам
    Пока ВыборкаДетали.Следующий() Цикл
    Если Месяц(ВыборкаДетали.Дата) = 1 Тогда //вот таким образом решил считать данные за месяц
    ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
    ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
    
    //Считаем итоги. Проблема в том, что если вывод области вынести из цикла, то итоги будут в конце //таблицы, а если оставить, в каждой ячейке будут выходить промежуточные итоги
    Материал=Материал+ВыборкаДетали.ИтогоРасходМатериал;
    ИтогиЗаМесяц.Параметры.Мат=Материал;
    ТабДок.Вывести(ИтогиЗаМесяц);
    КонецЕсли;
    КонецЦикла;
    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
    ТабДок.Вывести(ОбластьПодвалТаблицы);
    ТабДок.Вывести(ОбластьПодвал);
    ТабДок.ФиксацияСверху = 4;
    
    //}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ             
    КонецПроцедуры
    
    Ты предложил переделать запрос, но я не могу понять как это сделать
  4. lazy
    Offline

    lazy Модераторы Команда форума Модератор

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    На вскидку - нужно добавить в запрос примерно такую конструкцию(если конечно Расход это ИтогоРасходМатериал):

    ИТОГИ СУММА(ИтогоРасходМатериал) ПО
    Дата ПЕРИОДАМИ(МЕСЯЦ,&НачДата ,&КонДата )

    Но во первых я не уверен, что это именно то, а во вторых скорее всего придется перестраивать как минимум вывод отчета в макет, а то и весь запрос.

Поделиться этой страницей