Имя: Пароль:
1C
1С v8
Группировка в запросе
0 spapin87
 
28.06.13
11:35
Подскажите один момент, пытаюсь сделать группировку по ЗаказПоставщику_PI и ЗаказПоставщику_BO (3 уровень). ДокументОплатыВЭД (4 уровень). Сейчас группировка по Сделка, группировка надо сделать внутри этой групировки
Вот в принципе код(за комментировано условие, по которому пытаюсь найти нужные документы и сгруппировать для 3 уровня):

Перем СуммаПеревода;
   Перем СуммаРасхода;
   Перем СуммаКонвертации;
   Перем СуммаТрансфер;
   Перем ЗаказПоставщикуBO;
   Перем ЗаказПоставщикуPI;
   Перем ЗаказПоставщикуCI;
   Перем ЗаказПоставщикуSK;
   ЗаказПоставщикуBO = 0;
   ЗаказПоставщикуPI = 0;
   ЗаказПоставщикуCI = 0;
   ЗаказПоставщикуSK = 0;
   СуммаПеревода = 0;
   СуммаРасхода = 0;
   СуммаКонвертации = 0;
   СуммаТрансфер = 0;
   
   Макет = ВнешнийОтчетОбъект.ПолучитьМакет("Отчет");
   Запрос = Новый Запрос;
   текстзапроса =
   "ВЫБРАТЬ
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.Контрагент,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.Сделка КАК Сделка,
   |    0 КАК СуммаПеревода,
   |    0 КАК СуммаКонвертация,
   |    0 КАК СуммаТрансфер,
   |    0 КАК СуммаДокумента,
   |    NULL КАК докоплаты,
   |    0 КАК КоэффОчистки,
   |    ВЫБОР
   |        КОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику ССЫЛКА Документ.ЗаказПоставщику_PI
   |                ИЛИ ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику ССЫЛКА Документ.ЗаказПоставщику_BO
   |            ТОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.СуммаВзаиморасчетовПриход
   |        ИНАЧЕ 0
   |    КОНЕЦ КАК ЗаказПоставщикуPI,
   |    ВЫБОР
   |        КОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику ССЫЛКА Документ.ЗаказПоставщику_BO
   |            ТОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.СуммаВзаиморасчетовПриход
   |        ИНАЧЕ 0
   |    КОНЕЦ КАК ЗаказПоставщикуBO,
   |    ВЫБОР
   |        КОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику ССЫЛКА Документ.ЗаказПоставщику_CI
   |            ТОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.СуммаВзаиморасчетовПриход + ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаФрахт
   |        ИНАЧЕ 0
   |    КОНЕЦ КАК ЗаказПоставщикуCI,
   |    ВЫБОР
   |        КОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику ССЫЛКА Документ.ЗаказПоставщику_SK
   |            ТОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.СуммаВзаиморасчетовПриход
   |        ИНАЧЕ 0
   |    КОНЕЦ КАК ЗаказПоставщикуSK,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаДокумента КАК ЗаказПоставщикуСуммаДокументаBO,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаДокумента КАК ЗаказПоставщикуСуммаДокументаCI,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаДокумента КАК ЗаказПоставщикуСуммаДокументаPI,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаДокумента КАК ЗаказПоставщикуСуммаДокументаSK,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаФрахт,
   |    NULL КАК ДатаОплаты
   |ИЗ
   |    РегистрНакопления.ЗаказыПоставщикамВЭД.ОстаткиИОбороты(&ДатаНачала, &ДатаКонца, Период, , ) КАК ЗаказыПоставщикамВЭДОстаткиИОбороты
   |ГДЕ
   |    1 = 1
   |    И 3 = 3
   |
   |СГРУППИРОВАТЬ ПО
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.Контрагент,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.СуммаВзаиморасчетовПриход,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.Сделка,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаДокумента,
   |    ВЫБОР
   |        КОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику ССЫЛКА Документ.ЗаказПоставщику_BO
   |            ТОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.СуммаВзаиморасчетовПриход
   |        ИНАЧЕ 0
   |    КОНЕЦ,
   |    ВЫБОР
   |        КОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику ССЫЛКА Документ.ЗаказПоставщику_SK
   |            ТОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.СуммаВзаиморасчетовПриход
   |        ИНАЧЕ 0
   |    КОНЕЦ,
   |    ВЫБОР
   |        КОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику ССЫЛКА Документ.ЗаказПоставщику_PI
   |                ИЛИ ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику ССЫЛКА Документ.ЗаказПоставщику_BO
   |            ТОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.СуммаВзаиморасчетовПриход
   |        ИНАЧЕ 0
   |    КОНЕЦ,
   |    ВЫБОР
   |        КОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику ССЫЛКА Документ.ЗаказПоставщику_CI
   |            ТОГДА ЗаказыПоставщикамВЭДОстаткиИОбороты.СуммаВзаиморасчетовПриход + ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаФрахт
   |        ИНАЧЕ 0
   |    КОНЕЦ,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаФрахт,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаДокумента,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаДокумента,
   |    ЗаказыПоставщикамВЭДОстаткиИОбороты.ЗаказПоставщику.СуммаДокумента
   |
   |ОБЪЕДИНИТЬ ВСЕ
   |
   |ВЫБРАТЬ
   |    ДокументОплатыВЭД.Контрагент,
   |    NULL,
   |    0,
   |    ДокументОплатыВЭД.Сделка,
   |    ДокументОплатыВЭД.СуммаПеревода,
   |    ДокументОплатыВЭД.СуммаКонвертация,
   |    ДокументОплатыВЭД.СуммаТрансфер,
   |    ДокументОплатыВЭД.СуммаДокумента,
   |    ДокументОплатыВЭД.Ссылка,
   |    NULL,
   |    NULL,
   |    NULL,
   |    NULL,
   |    NULL,
   |    NULL,
   |    NULL,
   |    NULL,
   |    NULL,
   |    NULL,
   |    ДокументОплатыВЭД.Дата
   |ИЗ
   |    Документ.ДокументОплатыВЭД КАК ДокументОплатыВЭД
   |ГДЕ
   |    2 = 2
   |    И 4 = 4
   |    И ДокументОплатыВЭД.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
   |
   |СГРУППИРОВАТЬ ПО
   |    ДокументОплатыВЭД.Контрагент,
   |    ДокументОплатыВЭД.Сделка,
   |    ДокументОплатыВЭД.СуммаПеревода,
   |    ДокументОплатыВЭД.СуммаКонвертация,
   |    ДокументОплатыВЭД.СуммаТрансфер,
   |    ДокументОплатыВЭД.СуммаДокумента,
   |    ДокументОплатыВЭД.Ссылка,
   |    ДокументОплатыВЭД.Дата
   |ИТОГИ
   |    СУММА(СуммаВзаиморасчетовПриход),
   |    СУММА(СуммаПеревода),
   |    СУММА(СуммаКонвертация),
   |    СУММА(СуммаТрансфер),
   |    СУММА(СуммаДокумента),
   |    СУММА(ЗаказПоставщикуPI),
   |    СУММА(ЗаказПоставщикуBO),
   |    СУММА(ЗаказПоставщикуCI),
   |    СУММА(ЗаказПоставщикуSK)
   |ПО
   |    Сделка";
   
   
   Если ЭлементыФормы.Контрагент.Значение <> Справочники.Контрагенты.ПустаяСсылка() тогда
       Запрос.УстановитьПараметр("Контрагент", Контрагент);
       текстзапроса = СтрЗаменить(текстзапроса,"1 = 1","ЗаказыПоставщикамВЭДОстаткиИОбороты.Контрагент = &Контрагент");
       текстзапроса = СтрЗаменить(текстзапроса,"2 = 2","ДокументОплатыВЭД.Контрагент = &Контрагент");
   КонецЕсли;
   Если ЭлементыФормы.Сделка.Значение <> Справочники.СделкиВЭД.ПустаяСсылка() тогда
       Запрос.УстановитьПараметр("Сделка", Сделка);
       текстзапроса = СтрЗаменить(текстзапроса,"3 = 3","ЗаказыПоставщикамВЭДОстаткиИОбороты.Сделка = &Сделка");
       текстзапроса = СтрЗаменить(текстзапроса,"4 = 4","ДокументОплатыВЭД.Сделка = &Сделка");
   КонецЕсли;
   Запрос.УстановитьПараметр("ДатаКонца", КонецДня(ДатаКонца));
   Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
   Запрос.Текст =     текстзапроса;
   
   Результат = Запрос.Выполнить();
   ТЗРезультата = Результат.Выгрузить();
   ТЗРезультата.Колонки.Добавить("ДатаДок");    
   ТЗРезультата.Колонки.Добавить("Уровень");
   ТЗРезультата.Колонки.Добавить("Комментарий");
   ТЗРезультата.Колонки.Добавить("ДокументДвижения");
   
   Для каждого стрТЗРезультата из ТЗРезультата цикл
       Если (стрТЗРезультата.заказпоставщику = null) и (стрТЗРезультата.ДокОплаты = null) тогда
           стрТЗРезультата.уровень = 1;
       Иначе
           стрТЗРезультата.уровень = 2;
                           Если стрТЗРезультата.заказПоставщику <> null тогда
                   стрТЗРезультата.ДатаДок = Формат(стрТЗРезультата.заказПоставщику.дата, "ДФ=dd.MM.yyyy");
                   стрТЗРезультата.Комментарий = стрТЗРезультата.заказПоставщику.Комментарий;
                   стрТЗРезультата.ДокументДвижения =  стрТЗРезультата.заказПоставщику;
               КонецЕсли;
               
               Если стрТЗРезультата.ДокОплаты <> null тогда
                   
                   стрТЗРезультата.ДатаДок = Формат(стрТЗРезультата.ДокОплаты.дата, "ДФ=dd.MM.yyyy");
                   стрТЗРезультата.Комментарий = стрТЗРезультата.ДокОплаты.Комментарий;
                   стрТЗРезультата.ДокументДвижения =  стрТЗРезультата.ДокОплаты;
                   КоэффОчистки = стрТЗРезультата.СуммаДокумента / стрТЗРезультата.СуммаКонвертация;
               КонецЕсли;
           КонецЕсли;
       //    Если (ТипЗнч(стрТЗРезультата.ДокументДвижения) =  Тип("ДокументСсылка.ЗаказПоставщику_PI")) ИЛИ
       //        (ТипЗнч(стрТЗРезультата.ДокументДвижения) =  Тип("ДокументСсылка.ЗаказПоставщику_BO")) Тогда  
       //        стрТЗРезультата.уровень = 3;
       //КонецЕсли;
   КонецЦикла;
   ТЗРезультата.Сортировать("Сделка,ДатаДОк");
   ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
   ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
   ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
   ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
   ОбластьСделка = Макет.ПолучитьОбласть("Сделка");
   ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
   ОбластьИтого = Макет.ПолучитьОбласть("Итого");
   ОбластьИтоги = Макет.ПолучитьОбласть("Итоги");
   
   ТабДок.Очистить();
   ТабДок.Вывести(ОбластьЗаголовок);
   ТабДок.Вывести(ОбластьШапкаТаблицы);
   ТабДок.НачатьАвтогруппировкуСтрок();
   
   ВыборкаСделка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   Для каждого ВыборкаСделка из ТЗРезультата цикл
       
       ОбластьСделка.Области.ДеталиЦветное.ЦветФона = новый Цвет(0,160,255);
       
       Если ВыборкаСделка.СуммаПеревода <> 0 ИЛИ ВыборкаСделка.СуммаДокумента <> 0 ИЛИ ВыборкаСделка.СуммаКонвертация <> 0
           ИЛИ ВыборкаСделка.СуммаТрансфер <> 0 Тогда
           ОбластьДетальныхЗаписей.Области.ЦветБежевый.ЦветФона = новый Цвет (255,150,64);
       Иначе
           ОбластьДетальныхЗаписей.Области.ЦветБежевый.ЦветФона = новый Цвет (255,255,255);
       КонецЕсли;
       
       Если ВыборкаСделка.уровень=1 тогда
           ОбластьСделка.Параметры.Заполнить(ВыборкаСделка);
           Если ВыборкаСделка.СуммаДокумента <> 0 И  ВыборкаСделка.СуммаКонвертация <> 0 Тогда
               ОбластьСделка.Параметры.КоэффОчистки = ВыборкаСделка.СуммаДокумента / ВыборкаСделка.СуммаКонвертация;
           КонецЕсли;
           
           ТабДок.Вывести(ОбластьСделка, ВыборкаСделка.Уровень);
           
       иначе
           
           ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаСделка);
           
           ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаСделка.Уровень);
           СуммаПеревода = СуммаПеревода + ВыборкаСделка.СуммаПеревода;
           СуммаРасхода = СуммаРасхода + ВыборкаСделка.СуммаДокумента;
           СуммаКонвертации = СуммаКонвертации + ВыборкаСделка.СуммаКонвертация;
           СуммаТрансфер = СуммаТрансфер + ВыборкаСделка.СуммаТрансфер;
           Если  НЕ (ПустаяСтрока(ВыборкаСделка.ЗаказПоставщикуBO) И ПустаяСтрока(ВыборкаСделка.ЗаказПоставщикуPI)
               И ПустаяСтрока(ВыборкаСделка.ЗаказПоставщикуCI) И ПустаяСтрока(ВыборкаСделка.ЗаказПоставщикуSK)) Тогда
               ЗаказПоставщикуPI = ЗаказПоставщикуPI + ВыборкаСделка.ЗаказПоставщикуPI;
               ЗаказПоставщикуCI = ЗаказПоставщикуCI + ВыборкаСделка.ЗаказПоставщикуCI;
               ЗаказПоставщикуSK = ЗаказПоставщикуSK + ВыборкаСделка.ЗаказПоставщикуSK;
           КонецЕсли;
           
       КонецЕсли;
   КонецЦикла;
   ОбластьИтого.Параметры.ЗаказПоставщикуPI = ЗаказПоставщикуPI;
   ОбластьИтого.Параметры.ЗаказПоставщикуCI = ЗаказПоставщикуCI;
   ОбластьИтого.Параметры.ЗаказПоставщикуSK = ЗаказПоставщикуSK;
   ОбластьИтого.Параметры.ИтогоСуммаПеревода = СуммаПеревода;
   ОбластьИтого.Параметры.ИтогоРасход = СуммаРасхода;
   ОбластьИтого.Параметры.ИтогоСуммаКонвертация = СуммаКонвертации;
   ОбластьИтого.Параметры.ИтогоСуммаТрансфер = СуммаТрансфер;
   ОбластьИтоги.Параметры.ИтогоСуммаПеревода = СуммаПеревода;
   ОбластьИтоги.Параметры.ИтогоРасход = СуммаРасхода;
   ОбластьИтого.Области.ДеталиЦветноеИтого.ЦветФона = новый цвет(255,255,0);
   
   ТабДок.ЗакончитьАвтогруппировкуСтрок();
   ТабДок.ПоказатьУровеньГруппировокСтрок(0);
   ТабДок.Вывести(ОбластьИтого);
   ТабДок.Вывести(ОбластьПодвалТаблицы);
   ТабДок.Вывести(ОбластьПодвал);
   ТабДок.Вывести(ОбластьИтоги);
1 salvator
 
28.06.13
11:37
Это назывыается "Итоги", а не "группировка".
Добавь итоги по нужным полям.
2 Mitriy
 
28.06.13
11:37
о, сколько буков...
3 salvator
 
28.06.13
11:38
А вообще по коду - ужаснах.
Можно сделать проще и короче, имхо.
4 spapin87
 
28.06.13
11:42
Так?

   |СГРУППИРОВАТЬ ПО
   |    ДокументОплатыВЭД.Контрагент,
   |    ДокументОплатыВЭД.Сделка,
   |    ДокументОплатыВЭД.СуммаПеревода,
   |    ДокументОплатыВЭД.СуммаКонвертация,
   |    ДокументОплатыВЭД.СуммаТрансфер,
   |    ДокументОплатыВЭД.СуммаДокумента,
   |    ДокументОплатыВЭД.Ссылка,
   |    ДокументОплатыВЭД.Дата
   |ИТОГИ
   |    СУММА(СуммаВзаиморасчетовПриход),
   |    СУММА(СуммаПеревода),
   |    СУММА(СуммаКонвертация),
   |    СУММА(СуммаТрансфер),
   |    СУММА(СуммаДокумента),
   |    СУММА(ЗаказПоставщикуPI),
   |    СУММА(ЗаказПоставщикуBO),
   |    СУММА(ЗаказПоставщикуCI),
   |    СУММА(ЗаказПоставщикуSK)
   |ПО
   |    Сделка,
   |    ЗаказПоставщикуСуммаДокументаBO,
   |    ЗаказПоставщикуСуммаДокументаPI";
5 salvator
 
28.06.13
11:51
По итогам - да, так.
А дальше что ты там в выборке делаешь, даже разбираться лень.
6 spapin87
 
28.06.13
12:11
Получается мне нужно сделать еще один цикл в выборке по документам?
7 Nenaviwu1c20
 
28.06.13
12:23
Выборка = запрос.выбрать(обходрезультатазапроса.погруппировкам);
Пока выборка.следующий() цикл
ВыборкаЗаказПоставщикуСуммаДокументаBO = выборка.выбрать(обходрезультатазапроса.погруппировкам);
пока ВыборкаЗаказПоставщикуСуммаДокументаBO.следующий() цикл
ВыборкаЗаказПоставщикуСуммаДокументаPI = ВыборкаЗаказПоставщикуСуммаДокументаBO.выбрать(обходрезультатазапроса.погруппировкам);
Пока ВыборкаЗаказПоставщикуСуммаДокументаBO.СЛедующий() цикл
конеццикла
конеццикла;
конеццикла;
ну и т.д.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший