Имя: Пароль:
1C
1С v8
Разбить данные по годам
0 anikulnikova
 
29.12.15
13:23
Добрый день, стоит такая задача: по невыходам сотрудников сформировать отчет, который по каждому рабочему году того или иного сотрудника будет показывать невыходы.
Т.е. допустим, я устроилась 20.06.2013г., мне необходимо увидеть данные за эти рабочие годы, с 20.06.13 по 20.06.14, с 20.06.14 по 20.06.15 и соответственно за этот незаконченный рабочий год сколько у меня было неявок(за каждый год по отдельности).
Запрос по документу я вытащила, он отображает данные, загвоздка в том, как раскидать всё по рабочим годам.
ВЫБРАТЬ
    НевыходыВОрганизацияхНачисления.Ссылка,
    НевыходыВОрганизацияхНачисления.Сотрудник КАК Сотрудник,
    СУММА(НевыходыВОрганизацияхНачисления.ОтработаноДней) КАК КоличествоДней,
    СУММА(НевыходыВОрганизацияхНачисления.ОтработаноЧасов) КАК КоличествоЧасов,
    СотрудникиОрганизаций.ДатаПриемаНаРаботу
ИЗ
    Документ.НевыходыВОрганизациях.Начисления КАК НевыходыВОрганизацияхНачисления
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
        ПО НевыходыВОрганизацияхНачисления.Сотрудник = СотрудникиОрганизаций.Ссылка
ГДЕ
    НевыходыВОрганизацияхНачисления.Ссылка.ПометкаУдаления = &Ложь

СГРУППИРОВАТЬ ПО
    НевыходыВОрганизацияхНачисления.Сотрудник,
    СотрудникиОрганизаций.ДатаПриемаНаРаботу,
    НевыходыВОрганизацияхНачисления.Ссылка

УПОРЯДОЧИТЬ ПО
    Сотрудник
1 sash-ml
 
29.12.15
13:31
Выразить(РАЗНОСТЬДАТ(датаневыхода,датаприема, ДЕНЬ)/365 как число (2,0)) + 1
как то так
2 anikulnikova
 
29.12.15
13:36
(1) спасибо, но как-то не понятно )))
3 sash-ml
 
29.12.15
13:38
можно проще
РАЗНОСТЬДАТ(датаприема,датаневыхода, ГОД) как НомерГодаСМоментаПреима
4 anikulnikova
 
29.12.15
14:03
(3) Дата невыхода может быть не одним днем, и определяется ДатойНачала и ДатойОкончания, конкретно датыневыхода - нет.
5 sash-ml
 
29.12.15
14:07
(4) бери по дате окончания, будет небольшая погрешность если невыходы были как раз на рубеже года. Но если таких невыходов нет то никто не заметит.
6 anikulnikova
 
29.12.15
14:13
Ругается,пишет неверные параметры...
7 sash-ml
 
29.12.15
14:17
покажи запрос который получился
8 salvator
 
29.12.15
14:17
ГДЕ
    НевыходыВОрганизацияхНачисления.Ссылка.ПометкаУдаления = &Ложь

Замени на

ГДЕ
    НЕ НевыходыВОрганизацияхНачисления.Ссылка.ПометкаУдаления
9 anikulnikova
 
29.12.15
14:19
Не не, не то выходит.Выходит просто разница лет. допустим я устроилась 13-го, а документ 15-го, он и выдает - 2 года. Это, увы, не то.
Необходимо создать возможно что-то типа нового поля для отображения года, в нем как-то привязать рабочий год сотрудника от даты приема, и потом отбирать по рабочему году неявки. Но.. я это только представляю, а как сделать не знаю.
10 sash-ml
 
29.12.15
14:26
А разница лет чем тебе не рабочий год сотрудника от даты приема? Группируй по этой разнице
11 anikulnikova
 
29.12.15
14:43
(10) ну допустим я попробую из этого что-то построить, а как быть с теми сотрудниками, которые в этом году и пришли
12 sash-ml
 
29.12.15
14:47
тогда (1), бери разницу в днях и дели на 365, округляй, прибавляй 1
13 anikulnikova
 
29.12.15
14:56
(12) Смысл не такой все-равно получается. Хотелось бы получить именно год, а не его количество (от разницы), т.е. высчитать, допустим у меня с 13 года было не полных 3 года, и чтобы в группировке отображалось что-то типа:
1) группировка 13-14 год
2) группировка 14-15 год
3) группировка 15-16 год
14 salvator
 
29.12.15
15:04
(9) Создай таблицу значений с годами, с нужным интервалом с...по. Например с 1990 по 2100.
Потом таблицу с данными соединяй с таблицей годов.
Чтобы получить начало и окончание периодов, исходя из даты приема по даты увольнения, что-то типа этого придется написать. Вероятно, можно короче, не проверял.

ВЫБРАТЬ
    ТабДанные.ДатаПрихода,
    ТабДанные.ДатаУхода,
    ДОБАВИТЬКДАТЕ(ТабДанные.ДатаПрихода,ГОД,ТабГода.Год-1-ГОД(ТабДанные.ДатаПрихода)) КАК НачалоПериода,
    ВЫБОР КОГДА ДОБАВИТЬКДАТЕ(ТабДанные.ДатаПрихода,ГОД,ТабГода.Год-ГОД(ТабДанные.ДатаПрихода))>ТабДанные.ДатаУхода
                ТОГДА ДОБАВИТЬКДАТЕ(ТабДанные.ДатаУхода,СЕКУНДА,-1)
                ИНАЧЕ ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ТабДанные.ДатаПрихода,ГОД,ТабГода.Год-ГОД(ТабДанные.ДатаПрихода)),СЕКУНДА,-1)
    КОНЕЦ КАК ОкончаниеПериода,    
ИЗ ТабДанные КАК ТабДанные
ЛЕВОЕ СОЕДИНЕНИЕ ТабГода КАК ТабГода
ПО ГОД(ТабДанные.ДатаПрихода)+1 <= ТабГода.Год И ГОД(ТабДанные.ДатаУхода)+1 >= ТабГода.Год
15 FIXXXL
 
29.12.15
15:09
Функция ГОД(<Дата>) в запросе вернет год от даты
по этому полю и группируй
16 elisabet
 
29.12.15
15:09
(0) А нахера шарахаться по документам, когда в регистре расчета невыходу соответствует расчет "отпуск за свой счет", и количество дней и часов там же в регистре указано, на которые он приходится.
И потом эту выборку просто соедини с годами.
17 sash-ml
 
29.12.15
15:42
(13) чистым запросом практически невозможно получить такую группировку, нужно делать оформление через макет в СКД, или через вычисляемые поля
18 strange2007
 
29.12.15
15:46
В задачу не вникал, но раз по датам (годам, месяцам), то просто рабочий запрос по выбору всех месяцев от одной даты до другой. Глядишь может кому пригодится

ВЫБРАТЬ
    aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d КАК НомерДняИзДиапазона
ПОМЕСТИТЬ ВТ_Дни
ИЗ
    (ВЫБРАТЬ
        0 КАК a

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
        1

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
        2

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
        3

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
        4

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
        5

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
        6

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
        7

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
        8

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
        9) КАК aa
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК b

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            1

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            2

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            3

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            4

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            5

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            6

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            7

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            8

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            9) КАК bb
        ПО (ИСТИНА)
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК c

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            1

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            2

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            3

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            4

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            5

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            6

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            7

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            8

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            9) КАК cc
        ПО (ИСТИНА)
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК d

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            1

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            2

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            3

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            4

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            5

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            6

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            7

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            8

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
            9) КАК dd
        ПО (ИСТИНА)
ГДЕ
    aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, ВТ_Дни.НомерДняИзДиапазона) КАК Дата
ПОМЕСТИТЬ Даты
ИЗ
    ВТ_Дни КАК ВТ_Дни
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Месяцы.НачалоМес,
    Месяцы.КонецМес
ИЗ
    (ВЫБРАТЬ
        НАЧАЛОПЕРИОДА(Даты.Дата, МЕСЯЦ) КАК НачалоМес,
        КОНЕЦПЕРИОДА(Даты.Дата, МЕСЯЦ) КАК КонецМес
    ИЗ
        Даты КАК Даты

    СГРУППИРОВАТЬ ПО
        НАЧАЛОПЕРИОДА(Даты.Дата, МЕСЯЦ),
        КОНЕЦПЕРИОДА(Даты.Дата, МЕСЯЦ)) КАК Месяцы
19 anikulnikova
 
30.12.15
11:46
(3) Спасибо, Ваш способ помогает, но не совсем как необходимо. Если сгруппировать по этому полю, то отбор документов будет производится, но не за рабочий год, а за календарный. Скриншот могу выложить, только куда?
20 aka AMIGO
 
30.12.15
11:48
(19) Ложи сюда: http://pics.rsh.ru/
21 anikulnikova
 
30.12.15
11:57
http://pics.rsh.ru/img/screenshot_q740iyz9.jpg

По скриншоту можно увидеть, что у сотрудника рабочий год начинается 4 июня 13 года, и заканчивается 3 июня 2014, и соответственно начинается следующий, НО, с помощью предложенного в (3) сообщении варианта выходит так. Как можно сделать, чтоб попадали данные за именно рабочий год, а не календарный.
22 anikulnikova
 
30.12.15
11:59
По скриншоту документ № 5 должен был попасть в верхние документы, т.к. 28.04 рабочий год  у сотрудника не был завершен.