Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 дек 2024, 07:55

Проблема с группировкой по месяцам и дням в запросе к регистру

Автор altaykniga, 12 апр 2011, 22:04

0 Пользователей и 1 гость просматривают эту тему.

altaykniga

Здравствуйте! Помогите, пожалуйста, очень срочно нужно переделать обработку! Платформа 7.7
Конфигурация  ТиС (Торговля и склад). Есть отчет, который формируется по регистру продаж с группировкой по месяцам. Задача - добавить по выбору пользователя дополнительную группировку по дням в разрезе месяца. Ничего не получается. Указываю в запросе сначала "группировка Месяц", затем "группировка день" - данные по месяцам выводятся правильные, а по дням - нули!!! Если убрать "группировка месяц", а группировка день оставить - группировка по дням происходит правильно... Что делать, помогите, пожалуйста. Далее пишу код отчета (кривоват, конечно, но это - рабочий вариант)

//******************************************************************
//*******************************************
Процедура ДобавитьФирму(Мн=0)
   Перем Фрм,Тек;
   Если ВыбФирма.РазмерСписка()>0 Тогда
      Тек=ВыбФирма.ПолучитьЗначение(ВыбФирма.ТекущаяСтрока());
   КонецЕсли;
   ОткрытьПодбор("Справочник.Фирмы",,Фрм,Мн,Тек);
   Фрм.ВыборГруппы(1);
КонецПроцедуры

//*******************************************
Процедура УдалитьФирму(Все=0)
   Если ВыбФирма.РазмерСписка()>0 Тогда
      Если Все=0 Тогда
         ВыбФирма.УдалитьЗначение(ВыбФирма.ТекущаяСтрока());
      Иначе
         ВыбФирма.УдалитьВсе();
      КонецЕсли;
   КонецЕсли;   
КонецПроцедуры

//*******************************************
Процедура ДобавитьРознСеть(Мн=0)
   Перем Фрм,Тек;
   Если ВыбРозничнаяСеть.РазмерСписка()>0 Тогда
      Тек=ВыбРозничнаяСеть.ПолучитьЗначение(ВыбРозничнаяСеть.ТекущаяСтрока());
   КонецЕсли;
   ОткрытьПодбор("Справочник.РозничныеСети",,Фрм,Мн,Тек);
   Фрм.ВыборГруппы(1);
КонецПроцедуры

//*******************************************
Процедура УдалитьРознСеть(Все=0)
   Если ВыбРозничнаяСеть.РазмерСписка()>0 Тогда
      Если Все=0 Тогда
         ВыбРозничнаяСеть.УдалитьЗначение(ВыбРозничнаяСеть.ТекущаяСтрока());
      Иначе
         ВыбРозничнаяСеть.УдалитьВсе();
      КонецЕсли;
   КонецЕсли;   
КонецПроцедуры

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

//*******************************************
Процедура УдалитьТМЦ(Все=0)
   Если ВыбТМЦ.РазмерСписка()>0 Тогда
      Если Все=0 Тогда
         ВыбТМЦ.УдалитьЗначение(ВыбТМЦ.ТекущаяСтрока());
      Иначе
         ВыбТМЦ.УдалитьВсе();
      КонецЕсли;
   КонецЕсли;   
КонецПроцедуры

//*******************************************
Процедура ДобавитьКонтра(Мн=0)
   Перем Фрм,Тек;
   Если ВыбКонтрагенты.РазмерСписка()>0 Тогда
      Тек=ВыбКонтрагенты.ПолучитьЗначение(ВыбКонтрагенты.ТекущаяСтрока());
   КонецЕсли;
   ОткрытьПодбор("Справочник.Контрагенты",,Фрм,Мн,Тек);
   Фрм.ВыборГруппы(1);
КонецПроцедуры

//*******************************************
Процедура УдалитьКонтра(Все=0)
   Если ВыбКонтрагенты.РазмерСписка()>0 Тогда
      Если Все=0 Тогда
         ВыбКонтрагенты.УдалитьЗначение(ВыбКонтрагенты.ТекущаяСтрока());
      Иначе
         ВыбКонтрагенты.УдалитьВсе();
      КонецЕсли;
   КонецЕсли;   
КонецПроцедуры

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

//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
   
   Перем Запрос, ТекстЗапроса, Таб;
   
   Если глПроверкаДаты(ВыбНачПериода,ВыбКонПериода)=0 Тогда
      Возврат;
   КонецЕсли;
   
   //Создание объекта типа Запрос
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса = "Период с ВыбНачПериода по ВыбКонПериода;
   |Фирма         = Регистр.Продажи.Фирма;
   |РозничнаяСеть = Регистр.Продажи.Покупатель.РозничнаяСеть;
   |Номенклатура  = Регистр.Продажи.Номенклатура;
   |Нетто         = Регистр.Продажи.Номенклатура.Нетто;
   |Брутто         = Регистр.Продажи.Номенклатура.БазоваяЕдиница.Вес;
   |Покупатель    = Регистр.Продажи.Покупатель;
   |Количество    = Регистр.Продажи.Количество;
   |КоличествоВ   = Регистр.Продажи.КоличествоВ;
   |ПродСтоимость = Регистр.Продажи.ПродСтоимость;
   |ПродСтоимостьВ = Регистр.Продажи.ПродСтоимостьВ;
   |Функция КоличествоСумма = Сумма(Количество);
   |Функция НеттоСумма     = Сумма(Количество * Нетто);   //Ореш
   |Функция БруттоСумма     = Сумма(Количество * Брутто);  //Ореш 
   |Функция НеттоСуммаВ     = Сумма(КоличествоВ * Нетто);   //Ореш
   |Функция БруттоСуммаВ     = Сумма(КоличествоВ * Брутто);  //Ореш
   |Функция КоличествоВСумма = Сумма(КоличествоВ);
   |Функция ПродСтоимостьСумма = Сумма(ПродСтоимость);
   |Функция ПродСтоимостьВСумма = Сумма(ПродСтоимостьВ);
   //|Группировка РозничнаяСеть упорядочить по РозничнаяСеть.Наименование без групп все;
   //|Группировка Покупатель упорядочить по Покупатель.Наименование без групп все;   
   //|Группировка Номенклатура упорядочить по Номенклатура.Наименование без групп все;
   |Группировка РозничнаяСеть;
   |Группировка Покупатель без групп;
   |Группировка Номенклатура без групп;
   |Группировка Месяц все;";
   
   Если фПоДням = 1 Тогда
      ТекстЗапроса = ТекстЗапроса + "
      |Группировка День Все;";
   КонецЕсли;
   
   
   Если ВыбФирма.РазмерСписка()>0 Тогда      // все
      ТекстЗапроса = ТекстЗапроса + "
      |Условие(Фирма в ВыбФирма);";
   КонецЕсли;
   
   Если ВыбРозничнаяСеть.РазмерСписка()>0 Тогда
      ТекстЗапроса = ТекстЗапроса + "
      |Условие(РозничнаяСеть в ВыбРозничнаяСеть);";
   КонецЕсли;
   
   Если ВыбТМЦ.РазмерСписка()>0 Тогда
      ТекстЗапроса = ТекстЗапроса + "
      |Условие(Номенклатура в ВыбТМЦ);";
   КонецЕсли;
   
   Если ВыбКонтрагенты.РазмерСписка()>0 Тогда
      ТекстЗапроса = ТекстЗапроса + "
      |Условие(Покупатель в ВыбКонтрагенты);";
   КонецЕсли;
   
   ТекстЗапроса = ТекстЗапроса + "
   |Условие(РозничнаяСеть.Выбран()=1);
   |"//}}ЗАПРОС
   ;
   
   // Если ошибка в запросе, то выход из процедуры...
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
      Возврат;
   КонецЕсли;
   
   // Подготовка к заполнению выходных форм данными запроса...
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Сформировать");
   
   Состояние("Заполнение выходной таблицы...");
   Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
   
   ТЗИтоги = СоздатьОбъект("ТаблицаЗначений");
   ТЗИтогиПок = СоздатьОбъект("ТаблицаЗначений");
   
   Запрос.Выгрузить(ТЗИтоги,0,0);
   
   ТЗИтоги.ВыбратьСтроки();
   ТЗИтогиПок.ВыбратьСтроки();
   
   ТЗИтогиПок.Загрузить(ТЗИтоги);
   ТЗИтогиПок.Свернуть("РозничнаяСеть,Покупатель,Месяц,День","КоличествоСумма,КоличествоВСумма,ПродСтоимостьСумма,ПродСтоимостьВСумма, НеттоСумма, БруттоСумма, НеттоСуммаВ, БруттоСуммаВ");
   ТЗИтоги.Свернуть("РозничнаяСеть,Месяц,День","КоличествоСумма,КоличествоВСумма,ПродСтоимостьСумма,ПродСтоимостьВСумма, НеттоСумма, БруттоСумма, НеттоСуммаВ, БруттоСуммаВ");
   Ст = 1;  Ст1 = 1;
   КолвоМес = ДатаМесяц(ВыбКонПериода)-ДатаМесяц(ВыбНачПериода);
   
   Пока Запрос.Группировка(1) = 1 Цикл
      
      // Заполнение полей РозничнаяСеть, т.е. формирование новой шапки...
      Таб.ВывестиСекцию("РозничнаяСеть|Основа");
      ТМесяц = "";
      СчетчикЦикла = 0;
      Для СчетчикЦикла = ДатаМесяц(ВыбНачПериода) По ДатаМесяц(ВыбКонПериода) Цикл
         
         Если СчетчикЦикла = 1 Тогда
            ТМесяц = "Январь";
         ИначеЕсли СчетчикЦикла = 2 Тогда
            ТМесяц = "Февраль";
         ИначеЕсли СчетчикЦикла = 3  Тогда
            ТМесяц = "Март";
         ИначеЕсли СчетчикЦикла = 4  Тогда
            ТМесяц = "Апрель";
         ИначеЕсли СчетчикЦикла = 5  Тогда
            ТМесяц = "Май";
         ИначеЕсли СчетчикЦикла = 6  Тогда
            ТМесяц = "Июнь";
         ИначеЕсли СчетчикЦикла = 7  Тогда
            ТМесяц = "Июль";
         ИначеЕсли СчетчикЦикла = 8  Тогда
            ТМесяц = "Август";
         ИначеЕсли СчетчикЦикла = 9  Тогда
            ТМесяц = "Сентябрь";
         ИначеЕсли СчетчикЦикла = 10 Тогда
            ТМесяц = "Октябрь";
         ИначеЕсли СчетчикЦикла = 11 Тогда
            ТМесяц = "Ноябрь";
         ИначеЕсли СчетчикЦикла = 12 Тогда
            ТМесяц = "Декабрь";
         КонецЕсли;
         //Таб.ПрисоединитьСекцию("РозничнаяСеть|Месяц");
         
         //Ореш
         Если ВыводитьВес = 1 Тогда
            Таб.ПрисоединитьСекцию("РозничнаяСеть|Месяц");
            Таб.ПрисоединитьСекцию("РозничнаяСеть|Вес");
         Иначе
            Таб.ПрисоединитьСекцию("РозничнаяСеть|МесяцЗагл");
         КонецЕсли;   
         
      КонецЦикла;
      
      Пока Запрос.Группировка(2) = 1 Цикл
         
         // Заполнение полей Покупатель....
         Таб.ВывестиСекцию("Покупатель|Основа");
         
         ТМесяц = "";
         СчетчикЦикла = 0;
         ТЗИтогиПок.ВыбратьСтроки();
         
         Для СчетчикЦикла = Ст1 По Ст1+КолвоМес Цикл
            ТЗИтогиПок.ПолучитьСтрокуПоНомеру(СчетчикЦикла);
            ТСумма           = ТЗИтогиПок.ПродСтоимостьСумма - ТЗИтогиПок.ПродСтоимостьВСумма;
            ТКоличествоСумма = ТЗИтогиПок.КоличествоСумма - ТЗИтогиПок.КоличествоВСумма;
            Таб.ПрисоединитьСекцию("Покупатель|Месяц"); 
            
            //Ореш
            Если ВыводитьВес = 1 Тогда
               ТНетто           = ТЗИтогиПок.НеттоСумма - ТЗИтогиПок.НеттоСуммаВ;
               ТБрутто        = ТЗИтогиПок.БруттоСумма - ТЗИтогиПок.БруттоСуммаВ;   
               Таб.ПрисоединитьСекцию("Покупатель|Вес"); 
            Иначе
               Таб.ПрисоединитьСекцию("Покупатель|Руб");
            КонецЕсли;
            
         КонецЦикла;
         Ст1 = Ст1+КолвоМес+1;
         
         Пока Запрос.Группировка(3) = 1 Цикл
            Если (ВыводитьНоменклатуру = 1) или (Запрос.РозничнаяСеть.Наименование = "Гипермаркеты") Тогда
               Таб.ВывестиСекцию("Номенклатура|Основа");
            КонецЕсли;
            Пока Запрос.Группировка(4) = 1 Цикл
               // Заполнение полей Месяц...
               ТСумма = Запрос.ПродСтоимостьСумма - Запрос.ПродСтоимостьВСумма;
               ТКоличествоСумма = Запрос.КоличествоСумма - Запрос.КоличествоВСумма;
               //Ореш
               ТНетто           = Запрос.НеттоСумма - Запрос.НеттоСуммаВ;
               ТБрутто        = Запрос.БруттоСумма - Запрос.БруттоСуммаВ;   
               
               Если (ВыводитьНоменклатуру = 1) или (Запрос.РозничнаяСеть.Наименование = "Гипермаркеты") Тогда
                  Таб.ПрисоединитьСекцию("Номенклатура|Месяц");
                  //Ореш
                  Если ВыводитьВес = 1 Тогда
                     Таб.ПрисоединитьСекцию("Номенклатура|Вес");
                  Иначе
                     Таб.ПрисоединитьСекцию("Номенклатура|Руб");
                  КонецЕсли;
               КонецЕсли;
               Если фПоДням=1 Тогда
               Пока Запрос.Группировка("День")=1 Цикл
                  ТСумма = Запрос.ПродСтоимостьСумма - Запрос.ПродСтоимостьВСумма;
                  ТКоличествоСумма = Запрос.КоличествоСумма - Запрос.КоличествоВСумма;
                  //Ореш
                  ТНетто           = Запрос.НеттоСумма - Запрос.НеттоСуммаВ;
                  ТБрутто        = Запрос.БруттоСумма - Запрос.БруттоСуммаВ;   
                  
                  Если (ВыводитьНоменклатуру = 1) или (Запрос.РозничнаяСеть.Наименование = "Гипермаркеты") Тогда
                     Таб.ПрисоединитьСекцию("Номенклатура|День");
                     //Ореш
                     //Если ВыводитьВес = 1 Тогда
                     //   Таб.ПрисоединитьСекцию("Номенклатура|Вес");
                     //Иначе
                     //   Таб.ПрисоединитьСекцию("Номенклатура|Руб");
                     //КонецЕсли;
                  КонецЕсли;
                  
                  
               КонецЦикла;
               КонецЕсли;
               
               
            КонецЦикла;
         КонецЦикла;
      КонецЦикла;
      
      // Заполнение полей "Итого"....
      Таб.ВывестиСекцию("Итого|Основа");
      ТЗИтоги.ВыбратьСтроки();
      СчетчикЦикла = 0;
      
      Для СчетчикЦикла = Ст По Ст+КолвоМес Цикл
         ТЗИтоги.ПолучитьСтрокуПоНомеру(СчетчикЦикла);
         ТСумма           = ТЗИтоги.ПродСтоимостьСумма - ТЗИтоги.ПродСтоимостьВСумма;
         ТКоличествоСумма = ТЗИтоги.КоличествоСумма - ТЗИтоги.КоличествоВСумма;
         Таб.ПрисоединитьСекцию("Итого|Месяц");
         
         //Ореш
         Если ВыводитьВес = 1 Тогда
            ТНетто           = ТЗИтоги.НеттоСумма - ТЗИтоги.НеттоСуммаВ;
            ТБрутто        = ТЗИтоги.БруттоСумма - ТЗИтоги.БруттоСуммаВ;   
            Таб.ПрисоединитьСекцию("Итого|Вес");
         Иначе
            Таб.ПрисоединитьСекцию("Итого|Руб");
         КонецЕсли;
         
      КонецЦикла;
      Ст = Ст+КолвоМес+1;
   КонецЦикла;
   
   Если ВыводитьВсего=1 Тогда
      // Заполнение полей "Всего"....
      
      ТЗИтогиПок.ВыбратьСтроки();
      ТЗИтогиПок.Свернуть("Месяц","КоличествоСумма,КоличествоВСумма,ПродСтоимостьСумма,ПродСтоимостьВСумма, НеттоСумма, БруттоСумма, НеттоСуммаВ, БруттоСуммаВ");
      Таб.ВывестиСекцию("Всего|Основа");
      ТЗИтогиПок.ВыбратьСтроки();
      СчетчикЦикла = 0;
      Для СчетчикЦикла = 1 По КолвоМес+1 Цикл
         ТЗИтогиПок.ПолучитьСтрокуПоНомеру(СчетчикЦикла);
         ТСумма           = ТЗИтогиПок.ПродСтоимостьСумма - ТЗИтогиПок.ПродСтоимостьВСумма;
         ТКоличествоСумма = ТЗИтогиПок.КоличествоСумма - ТЗИтогиПок.КоличествоВСумма;
         Таб.ПрисоединитьСекцию("Всего|Месяц");
         
         //Ореш
         Если ВыводитьВес = 1 Тогда
            ТНетто           = ТЗИтогиПок.НеттоСумма - ТЗИтогиПок.НеттоСуммаВ;
            ТБрутто        = ТЗИтогиПок.БруттоСумма - ТЗИтогиПок.БруттоСуммаВ;   
            Таб.ПрисоединитьСекцию("Всего|Вес");
         Иначе
            Таб.ПрисоединитьСекцию("Всего|Руб");
         КонецЕсли;
         
      КонецЦикла;
   КонецЕсли;
   
   
   // Вывод заполненной формы
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Сформировать", "");
КонецПроцедуры




Herby

предопределенные группировки Месяц и День вместе не дружат. Нужно использовать либо одну, либо другую.
Если же вместе использовать, то получается так, что группировка "День" не является вложенной группировкой для группировки "Месяц". Т.е. если собираешь отчет за "март" и "апрель", то группировка по "Апрелю" будет содержать и в том числе дни марта

PS: на будущее - не стоит помещать весь модуль отчета. Достаточно текста запроса, ну и вывод группировок. Сложно разбираться в куче, особенно, если неизвестно с какой стороны этой кучи смотреть.



prog1c7.7


wise_KAA

 
вместо этого кусочка ↓

|Группировка Месяц все;";
   
   Если фПоДням = 1 Тогда
      ТекстЗапроса = ТекстЗапроса + "
      |Группировка День Все;";
   КонецЕсли;



вставь этот кусочек ↓
   
   Если фПоДням = 1 Тогда
      ТекстЗапроса = ТекстЗапроса + "
      |Группировка День Все;";
   Иначе
     ТекстЗапроса = ТекстЗапроса + "
      |Группировка Месяц Все;";
   КонецЕсли;


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск