Имя: Пароль:
1C
1С v8
Запросы в 1с
,
0 Славянин
 
06.09.16
13:48
Добрый день. Ребята, изучаю запросы. Есть задачка.
Нужно получить список работников которые работали в подразделении за определённый период. И надо вывести дату приема и увольнения. Проблема в том, что приниматься они могли в другое подразделение и увольняться тоже могли из другого подразделения. Есть регистр сведений "работники организации". ТАм есть вся информация. Как я предполагаю мне для начала нужно отобрать людей который засветились в указанном подразделении за указанный период, и закинуть их всех в какую-то табличку. А потом перебирая эту табличку найти в том же регистре их даты увольнения и приема. Подскажите конкретнее по реализации. Что использовать? в каком направлении двигаться?
1 golem14
 
06.09.16
13:55
а это задачка для изучения или по работе?
2 Sapiens_bru
 
06.09.16
13:57
(1) Там же написано "изучаю запросы"
(0) Давай структуру регистра. Запрос такая штука, что без знания структуры данных его не напишешь.
3 golem14
 
06.09.16
14:02
(2) а ты на практике никогда ничего не изучал умник?
4 piter3
 
06.09.16
14:03
(2)Знаем мы эти изучаем.
Открой типовую и посмотри.
5 piter3
 
06.09.16
14:05
Есть отчет Списки работников,что не показывает?
6 Славянин
 
06.09.16
14:14
(5) Списки работников не даёт, то что просят
7 Славянин
 
06.09.16
14:16
(1) И по работе и изучаю)
8 piter3
 
06.09.16
14:19
(6) и что же не показывает,прямо интересно стало
9 del123
 
06.09.16
14:21
+(8) Просто кто то не умеет их настраивать :)
10 Славянин
 
06.09.16
14:22
(9) может быть
11 piter3
 
06.09.16
14:23
ок,ну возьми перемещение тогда еще глянь.
12 piter3
 
06.09.16
14:23
это разовая задача или на постоянную?
13 Славянин
 
06.09.16
14:24
(12) на постоянно
14 piter3
 
06.09.16
14:47
ВЫБРАТЬ
    РаботникиОрганизаций.Период,
    РаботникиОрганизаций.ПодразделениеОрганизации,
    РаботникиОрганизаций.Сотрудник,
    Прием.Период КАК Период1
ИЗ
    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК Прием
        ПО РаботникиОрганизаций.Сотрудник = Прием.Сотрудник
            И (Прием.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу))
ГДЕ
    РаботникиОрганизаций.Период МЕЖДУ &НачалоПериода И &КонецПериода
    И РаботникиОрганизаций.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
    И ВЫБОР
            КОГДА РаботникиОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                ТОГДА РаботникиОрганизаций.ПодразделениеОрганизацииЗавершения
            ИНАЧЕ РаботникиОрганизаций.ПодразделениеОрганизации
        КОНЕЦ = &ПодразделениеОрганизации
15 Akela has missed
 
06.09.16
15:00
(14) Если сотрудник 01.01 работал в Подразделении1, а с 20.01 перевелся в Подраделение2, то при формировании отчета с 10.01 по 31.01 по Подразделению1, за период с 10.01-20.01 ты ведь его не увидишь...
16 piter3
 
06.09.16
15:02
(15) А почему я должен формировать его с 10.01 по 31.01?
Это где-то написано в (0)?
17 Akela has missed
 
06.09.16
15:04
(16) получить список работников которые работали в подразделении за определённый период
18 piter3
 
06.09.16
15:05
(17) давай свой вариант
19 Akela has missed
 
06.09.16
15:10
ВЫБРАТЬ
    РаботникиОрганизаций.Период,
    РаботникиОрганизаций.ПериодЗавершения,
    МИНИМУМ(ЕСТЬNULL(РаботникиОрганизацийСледующаяЗапись.Период, &КонПериода)) КАК ПериодСледующий,
    РаботникиОрганизаций.Сотрудник,
    РаботникиОрганизаций.ПодразделениеОрганизации,
    РаботникиОрганизаций.ПодразделениеОрганизацииЗавершения,
    РаботникиОрганизаций.ПричинаИзмененияСостояния,
    РаботникиОрганизаций.ПричинаИзмененияСостоянияЗавершения
ПОМЕСТИТЬ втКадроваяИстория
ИЗ
    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизацийСледующаяЗапись
        ПО РаботникиОрганизаций.Сотрудник = РаботникиОрганизацийСледующаяЗапись.Сотрудник
            И РаботникиОрганизаций.Период < РаботникиОрганизацийСледующаяЗапись.Период
            И (РаботникиОрганизацийСледующаяЗапись.Период <= &КонПериода)
ГДЕ
    РаботникиОрганизаций.Период <= &КонПериода

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втКадроваяИстория.Период,
    втКадроваяИстория.Сотрудник,
    втКадроваяИстория.ПодразделениеОрганизации КАК Подразделение,
    втКадроваяИстория.ПричинаИзмененияСостояния
ПОМЕСТИТЬ втПолнаяКадроваяИстория
ИЗ
    втКадроваяИстория КАК втКадроваяИстория

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВЫБОР
        КОГДА втКадроваяИстория.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
                И втКадроваяИстория.ПериодЗавершения >= втКадроваяИстория.ПериодСледующий
            ТОГДА ДАТАВРЕМЯ(1, 1, 1)
        ИНАЧЕ втКадроваяИстория.ПериодЗавершения
    КОНЕЦ,
    втКадроваяИстория.Сотрудник,
    втКадроваяИстория.ПодразделениеОрганизацииЗавершения,
    втКадроваяИстория.ПричинаИзмененияСостоянияЗавершения
ИЗ
    втКадроваяИстория КАК втКадроваяИстория
ГДЕ
    ВЫБОР
            КОГДА втКадроваяИстория.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
                    И втКадроваяИстория.ПериодЗавершения >= втКадроваяИстория.ПериодСледующий
                ТОГДА ДАТАВРЕМЯ(1, 1, 1)
            ИНАЧЕ втКадроваяИстория.ПериодЗавершения
        КОНЕЦ <> ДАТАВРЕМЯ(1, 1, 1)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МИНИМУМ(взПолнаяКадроваяИстория.Период) КАК ДатаНачала,
    ДОБАВИТЬКДАТЕ(взПолнаяКадроваяИстория.ПериодСледующий, ДЕНЬ, -1) КАК ДатаОкончания,
    взПолнаяКадроваяИстория.Сотрудник,
    взПолнаяКадроваяИстория.Подразделение
ИЗ
    (ВЫБРАТЬ
        втПолнаяКадроваяИстория.Период КАК Период,
        МИНИМУМ(втПолнаяКадроваяИсторияСледующаяЗапись.Период) КАК ПериодСледующий,
        втПолнаяКадроваяИстория.Сотрудник КАК Сотрудник,
        втПолнаяКадроваяИстория.Подразделение КАК Подразделение
    ИЗ
        втПолнаяКадроваяИстория КАК втПолнаяКадроваяИстория
            ЛЕВОЕ СОЕДИНЕНИЕ втПолнаяКадроваяИстория КАК втПолнаяКадроваяИсторияСледующаяЗапись
            ПО втПолнаяКадроваяИстория.Сотрудник = втПолнаяКадроваяИсторияСледующаяЗапись.Сотрудник
                И втПолнаяКадроваяИстория.Период < втПолнаяКадроваяИсторияСледующаяЗапись.Период
                И (втПолнаяКадроваяИсторияСледующаяЗапись.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
                    ИЛИ втПолнаяКадроваяИстория.Подразделение <> втПолнаяКадроваяИсторияСледующаяЗапись.Подразделение)
    ГДЕ
        втПолнаяКадроваяИстория.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
    
    СГРУППИРОВАТЬ ПО
        втПолнаяКадроваяИстория.Период,
        втПолнаяКадроваяИстория.Сотрудник,
        втПолнаяКадроваяИстория.Подразделение) КАК взПолнаяКадроваяИстория
ГДЕ
    ЕСТЬNULL(ДОБАВИТЬКДАТЕ(взПолнаяКадроваяИстория.ПериодСледующий, ДЕНЬ, -1), &КонПериода) >= &НачПериода
    И взПолнаяКадроваяИстория.Подразделение В ИЕРАРХИИ(&Подразделение)

СГРУППИРОВАТЬ ПО
    взПолнаяКадроваяИстория.Подразделение,
    взПолнаяКадроваяИстория.Сотрудник,
    ДОБАВИТЬКДАТЕ(взПолнаяКадроваяИстория.ПериодСледующий, ДЕНЬ, -1)
20 piter3
 
06.09.16
15:13
(19) проверял?
21 Akela has missed
 
06.09.16
15:16
(20) когда-то давно, работало
22 Славянин
 
06.09.16
15:17
Что-то мудрёно сильно. Нужны поля Сотрудник,датаприема,датаувольнения. И всё. Сотрудники выбираются согласно выбранному подразделению и периоду. А датыприема и увольнения заполняются не зависимо от выбранного подразделения
23 Славянин
 
06.09.16
15:17
и всё это выбирается из регистра "работникиорганизации"
24 piter3
 
06.09.16
15:18
(23) Читай внимательно
25 piter3
 
06.09.16
15:18
(21) проверил на одном,разницы не заметил.может быть на работе как говорит автор и покрутил бы,а так сойдет
26 piter3
 
06.09.16
15:22
(17) [Проблема в том, что приниматься они могли в другое подразделение и увольняться тоже могли из другого подразделения. ] один косяк нашел,так что у тебе условие не такое как у него
27 DTX 4th
 
06.09.16
15:29
Дату приема/увольнения на работу надо? Или в подразделение?
Данные без дат получить легко - срезпоследних + сотрудники за период. Мб даты левым соединением проще прицепить?
28 DTX 4th
 
06.09.16
15:29
Левым соединением со всех таблицей регистра
29 Akela has missed
 
06.09.16
15:33
(26) Если в январе принялся в одно, в феврале работал в другом, а в марте уволился из третьего, то при формировании отчета за год с отбором по подразделению 1 или 2 или 3, сотрудник должен попасть в любом случае. Я понял задачу так.
А дату приема и увольнения уже можно вытащить из сотрудника.
30 piter3
 
06.09.16
15:34
(29) [А дату приема и увольнения уже можно вытащить из сотрудника.] неправильно.Это точно твое в (19)?
31 4eater
 
06.09.16
15:38
левое соединение реальной таблицы с самой собой с периодом минимальный больше пустой даты, а потом максимальный меньше 3999 года. запрос похож на остатки на каждый день
32 Akela has missed
 
06.09.16
15:39
(30) ок, из срезов по сотруднику)
33 HEKPOH
 
06.09.16
15:49
(0) в качестве самопиара: http://catalog.mista.ru/public/439245/
Даты приема и увольнения поймешь откуда вытащить...
В публикации задача более широкая - сократи под свои нужды
34 Славянин
 
06.09.16
15:56
(33) спасибо большое
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.