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


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

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

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

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

вместо

НАЧАЛОПЕРИОДА(КадроваяИсторияСотрудниковИнтервальный.ДатаНачала, ДЕНЬ) <= НАЧАЛОПЕРИОДА(НачисленияУдержанияПоСотрудникам.ДатаНачала, ДЕНЬ)
4 CbIP
 
26.10.21
15:28
(3) Получилось, большое спасибо!

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

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


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

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


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


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