Имя: Пароль:
1C
1С v8
Запрос с группировкой
0 Neznakomka
 
27.09.12
09:28
Помогите, пжалуйста с запросом. Строки необходимо группировать по ргистратору, а при этом вид отпуска писать просто "Отпуск", при этом начало периода брать меньшую дату , а окончание последнюю дату. то есть сгруппировать строки по регистратору. сейчас группирются, но группируются еще и по виду отпуска. а не должны

Запрос.УстановитьПараметр("СписокОтпусков",    СписокОтпусков);
   Запрос.УстановитьПараметр("НеиспользованныйОтпуск", Перечисления.ИспользованиеОтпусковВидСтроки.НеиспользованныйОтпуск);
   Запрос.УстановитьПараметр("СостояниеОтпускЕжегодный", Перечисления.СостоянияРаботникаОрганизации.ОтпускЕжегодный);
   Запрос.УстановитьПараметр("РегистрацияОтпуска", Перечисления.ИспользованиеОтпусковВидСтроки.РегистрацияОтпуска);
   
   Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
                  |    ИспользованиеОтпуска.ВидТрудовогоОтпуска.ОчередностьПредоставленияОтпуска КАК ОчередностьПредоставленияОтпуска,
                  |    ВЫБОР
                  |        КОГДА НЕ ИспользованиеОтпуска.ВидТрудовогоОтпуска ЕСТЬ NULL
                  |            ТОГДА ИспользованиеОтпуска.ВидТрудовогоОтпуска.Наименование
                  |        ИНАЧЕ ПРЕДСТАВЛЕНИЕ(ПериодыОтпуска.Состояние)
                  |    КОНЕЦ КАК ВидОтпуска,
                  |    ИспользованиеОтпуска.РабочийГодС КАК РабочийГодС,
                  |    ИспользованиеОтпуска.РабочийГодПо КАК РабочийГодПо,
                  |    МАКСИМУМ(ВЫБОР
                  |            КОГДА НЕ ИспользованиеОтпуска.Период ЕСТЬ NULL
                  |                ТОГДА ИспользованиеОтпуска.Период
                  |            ИНАЧЕ ПериодыОтпуска.НачалоОтпуска
                  |        КОНЕЦ) КАК Период,
                  |    МАКСИМУМ(ВЫБОР
                  |            КОГДА НЕ ИспользованиеОтпуска.ДатаНачала ЕСТЬ NULL
                  |                ТОГДА ИспользованиеОтпуска.ДатаНачала
                  |            ИНАЧЕ ПериодыОтпуска.НачалоОтпуска
                  |        КОНЕЦ) КАК НачалоОтпуска,
                  |    МАКСИМУМ(ВЫБОР
                  |            КОГДА НЕ ИспользованиеОтпуска.ДатаОкончания ЕСТЬ NULL
                  |                ТОГДА ИспользованиеОтпуска.ДатаОкончания
                  |            ИНАЧЕ ДОБАВИТЬКДАТЕ(ПериодыОтпуска.ОкончаниеОтпуска, ДЕНЬ, -1)
                  |        КОНЕЦ) КАК ОкончаниеОтпуска,
                  |    СУММА(ВЫБОР
                  |            КОГДА НЕ ИспользованиеОтпуска.ИспользованоДней ЕСТЬ NULL
                  |                ТОГДА ИспользованиеОтпуска.ИспользованоДней
                  |            ИНАЧЕ РАЗНОСТЬДАТ(ПериодыОтпуска.НачалоОтпуска, ПериодыОтпуска.ОкончаниеОтпуска, ДЕНЬ)
                  |        КОНЕЦ) КАК Продолжительность,
                  |    ВЫБОР
                  |        КОГДА НЕ ИспользованиеОтпуска.ВидСтроки ЕСТЬ NULL
                  |            ТОГДА ПРЕДСТАВЛЕНИЕ(ИспользованиеОтпуска.ВидСтроки)
                  |        ИНАЧЕ """"
                  |    КОНЕЦ КАК ВидСтроки,
                  |    ПериодыОтпуска.Регистратор КАК Регистратор,
                  |    ПериодыОтпуска.Регистратор.Дата КАК ДатаПриказа,
                  |    ПериодыОтпуска.Регистратор.Номер КАК НомерПриказа
                  |ИЗ
                  |    (ВЫБРАТЬ
                  |        ДатыУходаВОтпуск.Период КАК НачалоОтпуска,
                  |        ВЫБОР
                  |            КОГДА ДатыУходаВОтпуск.ПериодЗавершения = ДАТАВРЕМЯ(1, 1, 1)
                  |                    ИЛИ ДатыУходаВОтпуск.ПериодЗавершения > МИНИМУМ(ДОБАВИТЬКДАТЕ(ДатыВозвращенияИзОтпуска.Период, ДЕНЬ, -1))
                  |                ТОГДА МИНИМУМ(ДОБАВИТЬКДАТЕ(ДатыВозвращенияИзОтпуска.Период, ДЕНЬ, -1))
                  |            ИНАЧЕ ДатыУходаВОтпуск.ПериодЗавершения
                  |        КОНЕЦ КАК ОкончаниеОтпуска,
                  |        ДатыУходаВОтпуск.Состояние КАК Состояние,
                  |        ДатыУходаВОтпуск.Регистратор КАК Регистратор
                  |    ИЗ
                  |        РегистрСведений.СостояниеРаботниковОрганизаций КАК ДатыУходаВОтпуск
                  |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботниковОрганизаций КАК ДатыВозвращенияИзОтпуска
                  |            ПО ДатыУходаВОтпуск.Сотрудник = ДатыВозвращенияИзОтпуска.Сотрудник
                  |                И ДатыУходаВОтпуск.Организация = ДатыВозвращенияИзОтпуска.Организация
                  |                И ДатыУходаВОтпуск.Период < ДатыВозвращенияИзОтпуска.Период
                  |    ГДЕ
                  |        ДатыУходаВОтпуск.Период МЕЖДУ &ДатаПриема И &ДатаАктуальности
                  |        И ДатыУходаВОтпуск.Состояние В(&СписокОтпусков)
                  |        И ДатыУходаВОтпуск.Сотрудник.Физлицо = &ФизЛицо
                  |        И ДатыУходаВОтпуск.Регистратор.Организация В(&СписокСтруктурныхЕдиниц)
                  |        И (ДатыУходаВОтпуск.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
                  |                ИЛИ НЕ ДатыВозвращенияИзОтпуска.Период ЕСТЬ NULL )
                  |    
                  |    СГРУППИРОВАТЬ ПО
                  |        ДатыУходаВОтпуск.Период,
                  |        ДатыУходаВОтпуск.ПериодЗавершения,
                  |        ДатыУходаВОтпуск.Состояние,
                  |        ДатыУходаВОтпуск.Регистратор) КАК ПериодыОтпуска
                  |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                  |            НАЧАЛОПЕРИОДА(ИспользованиеОтпуска.Период, ДЕНЬ) КАК Период,
                  |            ИспользованиеОтпуска.ДатаНачала КАК ДатаНачала,
                  |            ИспользованиеОтпуска.ДатаОкончания КАК ДатаОкончания,
                  |            ИспользованиеОтпуска.ВидТрудовогоОтпуска КАК ВидТрудовогоОтпуска,
                  |            ИспользованиеОтпуска.ВидСтроки КАК ВидСтроки,
                  |            ИспользованиеОтпуска.ИспользованоДней КАК ИспользованоДней,
                  |            ИспользованиеОтпуска.РабочийГодС КАК РабочийГодС,
                  |            ИспользованиеОтпуска.РабочийГодПо КАК РабочийГодПо
                  |        ИЗ
                  |            РегистрНакопления.ИспользованиеОтпусковРаботникамиОрганизаций КАК ИспользованиеОтпуска
                  |        ГДЕ
                  |            ИспользованиеОтпуска.Период МЕЖДУ &ДатаПриема И КОНЕЦПЕРИОДА(&ДатаАктуальности, ДЕНЬ)
                  |            И ИспользованиеОтпуска.Сотрудник.Физлицо = &ФизЛицо
                  |            И ИспользованиеОтпуска.Организация В(&СписокГоловныхОрганизаций)
                  |            И ИспользованиеОтпуска.ВидСтроки В(&РегистрацияОтпуска)) КАК ИспользованиеОтпуска
                  |        ПО ПериодыОтпуска.НачалоОтпуска = ИспользованиеОтпуска.Период
                  |            И (ПериодыОтпуска.Состояние = &СостояниеОтпускЕжегодный)
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    ПериодыОтпуска.Регистратор,
                  |    ПериодыОтпуска.Регистратор.Дата,
                  |    ПериодыОтпуска.Регистратор.Номер,
                  |    ИспользованиеОтпуска.ВидТрудовогоОтпуска.ОчередностьПредоставленияОтпуска,
                  |    ИспользованиеОтпуска.РабочийГодПо,
                  |    ИспользованиеОтпуска.РабочийГодС,
                  |    ВЫБОР
                  |        КОГДА НЕ ИспользованиеОтпуска.ВидТрудовогоОтпуска ЕСТЬ NULL
                  |            ТОГДА ИспользованиеОтпуска.ВидТрудовогоОтпуска.Наименование
                  |        ИНАЧЕ ПРЕДСТАВЛЕНИЕ(ПериодыОтпуска.Состояние)
                  |    КОНЕЦ,
                  |    ВЫБОР
                  |        КОГДА НЕ ИспользованиеОтпуска.ВидСтроки ЕСТЬ NULL
                  |            ТОГДА ПРЕДСТАВЛЕНИЕ(ИспользованиеОтпуска.ВидСтроки)
                  |        ИНАЧЕ """"
                  |    КОНЕЦ
                  |
                  |ОБЪЕДИНИТЬ ВСЕ
                  |
                  |ВЫБРАТЬ
                  |    ИспользованиеОтпуска.ВидТрудовогоОтпуска.ОчередностьПредоставленияОтпуска,
                  |    ИспользованиеОтпуска.ВидТрудовогоОтпуска.Наименование,
                  |    ИспользованиеОтпуска.РабочийГодС,
                  |    ИспользованиеОтпуска.РабочийГодПо,
                  |    ИспользованиеОтпуска.Период,
                  |    ВЫБОР
                  |        КОГДА ИспользованиеОтпуска.ДатаНачала <> ДАТАВРЕМЯ(1, 1, 1)
                  |            ТОГДА ИспользованиеОтпуска.ДатаНачала
                  |        ИНАЧЕ НАЧАЛОПЕРИОДА(ИспользованиеОтпуска.Период, ДЕНЬ)
                  |    КОНЕЦ,
                  |    ИспользованиеОтпуска.ДатаОкончания,
                  |    ИспользованиеОтпуска.ИспользованоДней,
                  |    ПРЕДСТАВЛЕНИЕ(ИспользованиеОтпуска.ВидСтроки),
                  |    ИспользованиеОтпуска.Регистратор,
                  |    ИспользованиеОтпуска.Регистратор.Дата,
                  |    ИспользованиеОтпуска.Регистратор.Номер
                  |ИЗ
                  |    РегистрНакопления.ИспользованиеОтпусковРаботникамиОрганизаций КАК ИспользованиеОтпуска
                  |ГДЕ
                  |    ИспользованиеОтпуска.Период МЕЖДУ &ДатаПриема И КОНЕЦПЕРИОДА(&ДатаАктуальности, ДЕНЬ)
                  |    И ИспользованиеОтпуска.Регистратор.Организация В(&СписокСтруктурныхЕдиниц)
                  |    И ИспользованиеОтпуска.Сотрудник.Физлицо = &ФизЛицо
                  |    И НЕ ИспользованиеОтпуска.ВидСтроки В (&НеиспользованныйОтпуск, &РегистрацияОтпуска)
                  |
                  |УПОРЯДОЧИТЬ ПО
                  |    Период,
                  |    НачалоОтпуска,
                  |    ОчередностьПредоставленияОтпуска";
                       
   РезультатЗапроса    =    Запрос.Выполнить();
   ВыборкаРезультата    =    РезультатЗапроса.Выбрать();
   инд    =    0;
   Пока ВыборкаРезультата.Следующий()    Цикл
       
       инд    = инд + 1;
           
       СтрокаОтпуска.Параметры.Заполнить(ВыборкаРезультата);
       
       Если ВыборкаРезультата.РабочийГодС <> NULL Тогда
           СтрокаОтпуска.Параметры.ОтпускЗаПериод = Формат(ВыборкаРезультата.РабочийГодС,"ДФ=дд.ММ.гг") + "-" + Формат(ВыборкаРезультата.РабочийГодПо,"ДФ=дд.ММ.гг");
       Иначе
           СтрокаОтпуска.Параметры.ОтпускЗаПериод = "";
       КонецЕсли;
       
       СтрокаОтпуска.Параметры.ОснованиеОтпуска = ?(ВыборкаРезультата.ВидСтроки <> "", СокрЛП(ВыборкаРезультата.ВидСтроки) + " ", "") +
                                                   "пр.№ "+ СокрЛП(ВыборкаРезультата.НомерПриказа) +
                                                   " от " + Формат(ВыборкаРезультата.ДатаПриказа, "ДФ=dd.MM.yy");
           
       ДокументРезультат.Вывести(СтрокаОтпуска);
       
   КонецЦикла;
1 Loyt
 
27.09.12
10:01
(0) Если вид отпуска не нужен, нафига его тогда вообще в поля добавлять? Убери и не будет по нему группировать.