Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Помогите с запросом

Помогите с запросом
Я
   CbIP
 
26.10.21 - 15:01
Здравствуйте, запросом выбираю начисления сотрудников из РегистрНакопления.НачисленияУдержанияПоСотрудникам, левым соединением добавляю должности сотрудников из РегистрСведений.КадроваяИсторияСотрудниковИнтервальный в соответствии с ДатаНачала и ДатаОкончания начисления. Все работает НО в случае если у сотрудника был кадровый перевод на другую должность в отчетном периоде, а начисление например "Премия" была назначена за весь период то получаю пустую строку вместо должности (в запросе заменяется на "Не найдена"). Как вместо "Не найдена" получить "последнюю" должность сотрудника?

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


   Dmitrii
 
1 - 26.10.21 - 15:10
(0) >> Как вместо "Не найдена" получить "последнюю" должность сотрудника?

Для начала определить для себя - на какую дату ты хочешь получить "последнюю" должность сотрудника - на ДатаНачала, на ДатаОкончания, а может и вовсе на дату составления отчета?
Сотрудника то в период с ДатаНачала по ДатаОкончания могли 33 раза перевести с одной должности на другую или с одного подразделения в другое.
   CbIP
 
2 - 26.10.21 - 15:13
(1)
На ДатаОкончания
   Dmitrii
 
3 - 26.10.21 - 15:16
(2) Так и пиши тогда в условиях соединения.
НАЧАЛОПЕРИОДА(КадроваяИсторияСотрудниковИнтервальный.ДатаНачала, ДЕНЬ) <= НАЧАЛОПЕРИОДА(НачисленияУдержанияПоСотрудникам.ДатаОкончания, ДЕНЬ)

вместо
НАЧАЛОПЕРИОДА(КадроваяИсторияСотрудниковИнтервальный.ДатаНачала, ДЕНЬ) <= НАЧАЛОПЕРИОДА(НачисленияУдержанияПоСотрудникам.ДатаНачала, ДЕНЬ)

   CbIP
 
4 - 26.10.21 - 15:28
(3) Получилось, большое спасибо!

Теперь еще ситуация когда например поле НачислениеУдержание = "НДФЛ" то поля ДатаНачала и ДатаОкончания не заполнены. Соответственно мой запрос в этих местах должность выдает "Не найдена".
А хотелось бы получить должность на Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания) то-есть на конец отчетного периода в отчете?
   Dmitrii
 
5 - 26.10.21 - 15:44
Добавь в условие соединения
| ИЛИ
|  НачисленияУдержанияПоСотрудникам.НачислениеУдержание = &НДФЛ И
|  НАЧАЛОПЕРИОДА(КадроваяИсторияСотрудниковИнтервальный.ДатаНачала, ДЕНЬ) <= &ДатаОкончания И
|  НАЧАЛОПЕРИОДА(ДобавитьКДате(КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания,ДЕНЬ,-1), ДЕНЬ) >= &ДатаОкончания

   Dmitrii
 
6 - 26.10.21 - 15:58
+ к (5) Забыл про сотрудника. Точнее будет так.

| ИЛИ
|  КадроваяИсторияСотрудниковИнтервальный.Сотрудник = НачисленияУдержанияПоСотрудникам.Сотрудник И
|  НачисленияУдержанияПоСотрудникам.НачислениеУдержание = &НДФЛ И
|  НАЧАЛОПЕРИОДА(КадроваяИсторияСотрудниковИнтервальный.ДатаНачала, ДЕНЬ) <= &ДатаОкончания И
|  НАЧАЛОПЕРИОДА(ДобавитьКДате(КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания,ДЕНЬ,-1), ДЕНЬ) >= &ДатаОкончания

   CbIP
 
7 - 26.10.21 - 16:28
(6)

Все равно должности нет. может я что то не так добавил?

        |ИЗ
        |    РегистрНакопления.НачисленияУдержанияПоСотрудникам КАК НачисленияУдержанияПоСотрудникам
           |    ЛЕВОЕ СОЕДИНЕНИЕ 
        |        РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный
        |        ПО
        |            КадроваяИсторияСотрудниковИнтервальный.Сотрудник = НачисленияУдержанияПоСотрудникам.Сотрудник И
        |            НАЧАЛОПЕРИОДА(КадроваяИсторияСотрудниковИнтервальный.ДатаНачала, ДЕНЬ) <= НАЧАЛОПЕРИОДА(НачисленияУдержанияПоСотрудникам.ДатаОкончания, ДЕНЬ) И
        |            НАЧАЛОПЕРИОДА(ДобавитьКДате(КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания,ДЕНЬ,-1), ДЕНЬ) >= НАЧАЛОПЕРИОДА(НачисленияУдержанияПоСотрудникам.ДатаОкончания, ДЕНЬ)
        |             ИЛИ
        |                  КадроваяИсторияСотрудниковИнтервальный.Сотрудник = НачисленияУдержанияПоСотрудникам.Сотрудник И
        |                  НачисленияУдержанияПоСотрудникам.НачислениеУдержание = &НДФЛ И
        |                  НАЧАЛОПЕРИОДА(КадроваяИсторияСотрудниковИнтервальный.ДатаНачала, ДЕНЬ) <= &ДатаОкончания И
        |                  НАЧАЛОПЕРИОДА(ДобавитьКДате(КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания,ДЕНЬ,-1), ДЕНЬ) >= &ДатаОкончания
        |ГДЕ
         |    НачисленияУдержанияПоСотрудникам.Период МЕЖДУ &ДатаНачала И &ДатаОкончания" ;



   Dmitrii
 
8 - 26.10.21 - 16:42
(7) Значение параметра &НДФЛ точно верно указал?
Условие соединения не выполнится только если в записи одна из его частей не выполняется. Либо Сотрудник не тот, либо НачислениеУдержание не то, либо нет записей кадровой истории с ДатаНачала и ДатаОкончания, удовлетворяющих условию.
Потеряться могли только те, у кого ДатаОкончания в кадровом регистре в тот же день, что и &ДатаОкончания отчета. Потому что ты вычитаешь из ДатаОкончания один день.

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.