ЗУП: как лучше получить все подразделения сотрудника #710581


#0 by Антиквар
Всем привет! Требуется получить все подразделения сотрудника, в которых он работал за квартал. Не получается красивый запрос. Сделал так: ИЗ     РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций ГДЕ     РаботникиОрганизаций.Период МЕЖДУ &НачалоПериода И &КонецПериода Но тут получается, что если в регистре сведений РаботникиОрганизаций нет записей за период МЕЖДУ &НачалоПериода И &КонецПериода, но есть запись за предыдущий период, в которой ПериодЗавершения находится МЕЖДУ &НачалоПериода И &КонецПериода, то нужно взять ПодразделениеЗавершения, т.к. оно в этот период попадает. Но запрос это не выбирает. Если сделать ещё одно объединение, но уже по условию: РаботникиОрганизаций.ПериодЗавершения МЕЖДУ &НачалоПериода И &КонецПериода то тут может попасть ненужная информация, т.к. в предыдущем запросе по обычному периоду могли быть записи и они перекрывают данные. Короче запутался я что-то, помогите с запросом :) Или может в стандарте ЗУПа есть аналогичное, я бы там посмотрел. Но сам не нашел такого отчета.
#1 by SeraFim
Из типовой:
#2 by SeraFim
хотя и тут косяк: во втором запросе условие должно быть
#3 by Dmitry1c
Вот за что я не люблю ЗУП. Чтобы получить какую-то типичную инфу, нужно из((ебну(ться
#4 by el7cartel
ну так взял и изъеб(((нулся!
#5 by Антиквар
Спасибо огромное, вот 3-ий запрос у меня никак и не получался, но понимал, что без него никак. Честно говоря я и сейчас, глядя на него, пока смысл не понял :)
#6 by SeraFim
ПериодЗавершения - для временных переводов. То есть по окончании перевода - человек вернется на старое место. Но возможны ситуации, когда по окончании перевода будет новый приказ. В таком случае, данные ПериодаЗавершения нам не нужны. Вот для этого и используется соединение в этом запросе
#7 by Антиквар
да, я в курсе про период завершения. >> Но возможны ситуации, когда по окончании перевода будет новый приказ. >> В таком случае, данные ПериодаЗавершения нам не нужны. Вот про это я и писал в первом посте, что не знаю как сделать 3-ий запрос в объединении, чтобы учесть данный момент. Вы мне прислали пример, но я пока не разобрался. Т.е. я понимаю, что этот запрос наверное делает то что нужно, но код для меня пока не читаемый :) Сейчас тут дергают по разным мелочам, подразгребу проблемы и вдумчиво буду читать код 3-го запроса :)
#8 by Антиквар
>> Но возможны ситуации, когда по окончании перевода будет новый приказ. В таком случае, данные ПериодаЗавершения нам не нужны. >>Вот для этого и используется соединение в этом запросе По-моему не совсем так. Если была запись в регистре до &НачалоМесяца, а период завершения у неё МЕЖДУ &НачалоМесяца И &КонецМесяца, и больше за отчетный период записей нет, то вот для этого и нужен 3-ий запрос, чтобы учесть подразделение завершения. А если есть записи перекрытия, т.е. если в отчетном периоде есть другие записи в регистре, то мы ничего не берем этим запросом, т.к. эти записи перекрывают и выбраны вторым запросом.
#9 by Антиквар
>> хотя и тут косяк Почему? Мне кажется всё верно. Во 2-м запросе мы должны учесть &НачалоМесяца, т.к. в первом запросе срез нам не даст движение регистра в дате начала месяца. В дате начала месяца он даст информацию лишь в том случае, если на эту дату есть период завершения. И вот тут проблема мне кажется, если период завершения - 1-ый день месяца, и в этот же день есть другая запись. Мы получим два подразделения, а нужно одно. Поэтому мне кажется в первом запросе в полях запроса надо делать не "<=", а строго "<":
#10 by SeraFim
Все тут хорошо =)
#11 by Антиквар
Всё-таки что-то не так. Допустим делаем отчет за июнь. У сотрудника было кадровое перемещение с 15 по 31 мая из подразделения Подр1 в Подр2. Затем оформили кадровое перемещение сотрудника с 1 июня в подразделение Подр3, т.е. сотруднику не надо в июне возвращаться в Подр1. А что имеем: В регистре будет запись: Период = 15 мая, ПериодЗавершения = 1 июня. Первый запрос нам вернет ПодразделениеЗавершения = Подр1. Следующая запись в регистре: Период = 1 июня, и Подразделение = Подр3. Второй запрос нам вернет единственно правильное подразделение для месяца июнь: Подр3. Но Подр1 в выборке первого запроса лишнее. А если исправить второй запрос как ты пишешь, то и Подр3 не вернет, только Подр1. Совсем плохо :(
#12 by Антиквар
И даже если упростить задачу: имеем всего одно кадровое перемещение с 1 июня из подразделения Подр1 в Подр2, без всяких периодов завершения. Первый запрос вернет Подр1, второй запрос либо Подр2, либо в твоем варианте ничего не вернет. А должно вернуть только Подр2, Подр1 остается в мае.
#13 by Антиквар
Т.е. этот запрос видимо не дает готовый вариант. Нужно с его результатом работать, анализировать полученные периоды и исключать какие-то строки... Зашибись, вроде хотелка то элементарная на первый взгляд, получить список подразделений, в которых работал, а как сложно сделать.
#14 by RomaH
первый запрос вернет подр2 срез на 1 июня получит запись перемещения
#15 by RomaH
- имеем: 15/05 П1 31/05 П2 01/06 П3 первый запрос вернет 01/06 ПЗ
#16 by RomaH
в общем не надо фантазировать - давай скрины с неправильной выборкой типового запроса
#17 by RomaH
дубли уберет, но смысла большого нет
#18 by SeraFim
У тебя путаница со срезом последних - неправильно понимаешь, как он работает. Из справки: СрезПоследних Предназначена для получения наиболее поздних записей регистра сведений на указанную дату (включительно) То есть если есть движения на дату среза (на 1 июня), то это движение и будет в срезе последних. Именно поэтому я и сделал поправочку в . Движения с датой = началу периода уже учтены в первом запросе
#19 by Антиквар
Да, ребят, извиняюсь, думал что не "включительно". Перепутал с сальдо регистра накопления. Дубли мне не важны, их отсею, главное чтобы попало только то что надо. Спасибо ещё раз, сейчас взгляну на эти запросы правильно :)
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С