gifts2017

Запросы к регистрам сведений с реквизитом "ПериодЗавершения"

Опубликовал Сергей Лесовой (Synoecium) в раздел Программирование - Практика программирования

В конфигурациях ЗУП и УПП есть 2 часто используемых регистра сведений:  «РаботникиОрганизаций» aka «Кадровая история сотрудников (по юрлицам)»  - хранит кадровые перемещения сотрудника в регл. учете и «ПлановыеНачисленияРаботниковОрганизаций» aka «Плановые начисления сотрудников организаций» - хранит назначенные сотруднику виды расчета. Эти регистры имеют одну особенность, часто упускаемую новичками из виду.

Регистры «РаботникиОрганизаций»  и «ПлановыеНачисленияРаботниковОрганизаций» имеют ресурс ПериодЗавершения, который показывает, что запись характеризуется не только началом, но еще и концом своего действия. Все остальные ресурсы этих регистров дублируются ресурсами с окончанием «…Завершения» и при наступлении даты, указанной в периоде завершения, считается, что актуальными становятся ресурсы с этим окончанием. Рассмотрим теперь конкретные примеры запросов к этим регистрами.

1)      Срез последних регистра «РаботникиОрганизаций».

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

 

Схема получения нужных ресурсов довольно простая – проверяем, заполнен ли ресурс «ПериодЗавершения» и наступил ли этот самый период завершения, если оба условия выполняются, возвращаем ресурс «…Завершения», в противном случае возвращается обычный ресурс. В примере таким образом получается поле Должность, Подразделение и ГрафикРаботы, при желании можно аналогично получить все остальные поля. Обратите внимание на раздел ГДЕ, здесь мы отфильтровываем только работающих на дату среза сотрудников.

Подобный запрос используется в стандартном отчете «СпискиРаботниковОрганизаций»

2)      Срез последних регистра «ПлановыеНачисленияРаботниковОрганизаций».

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

 

Как и в предыдущем примере, ресурсы получаем такой же конструкцией. В самом регистре гораздо больше полей и если получать все возможные, то запрос будет громоздким. В примере мы получаем поля Действие, ВидРасчета и Показатель1, а также дополнительное поле ЯвляетсяОсновным.

У данного регистра ВидРасчета является и измерением и ресурсом, в случае, когда вид расчета является основным по учету времени, в измерении хранится значение НЕОПРЕДЕЛЕНО (что допустимо для значений составного типа, в нашем случае, основные и дополнительные начисления), в остальных случаях значение измерения совпадает со значением ресурса вида расчета. Здесь можно отметить такую особенность, что хотя дополнительные виды расчета (из ПВР «ДополнительныеНачисленияОрганизации») тоже могут быть плановыми, в действительности же такое движение может создать только договор на выполнение работ с ФЛ, остальные документы ограничены основными начислениями. Основной по учету времени вид расчета или нет, определяют настройки плана видов расчета на закладке «Время».  Такая схема гарантирует, что на конкретную дату у сотрудника основным по учету времени может быть только один вид расчета, остальные же будут дополнительными по учету времени. Кроме того, при изменении основного по учету времени вида расчета не нужно прекращать предыдущего основного по учету времени вида расчета, что написано в инструкции к конфигурации.

Подобно предыдущему примеру, условие раздела «ГДЕ» отбирает только те виды расчета, которые действуют на дату среза.

3)      Сотрудники, работавшие в периоде

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

ОБЪЕДИНИТЬ

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

 

Иногда нужно получить список сотрудников, которые работали хотя бы часть периода в некоторых временных границах. Например, нам нужно знать, кто числился работающим пока шел конкретный месяц.

Запрос в примере делится на 2 части. В первой части мы получаем работающих на начало периода, а также тех, кто был переведен временно и к концу заданного периода этот перевод закончился (в данном примере проверка окончания перевода не имеет особого смысла, так как если сотрудник перевелся к концу периода и не уволился, то есть более ранняя запись, в которой этот перевод начался ). Во второй части мы получаем тех сотрудников, которые были приняты в течение заданного периода.

Этот пример можно расширить и получать сотрудников, работавших на данной должности или в определенном подразделении в заданном периоде.

 

4)      Сотрудники, имеющие действующие виды расчета из списка видов расчета в заданном периоде

ВЫБРАТЬ
    ОсновныеНачисленияОрганизаций.Ссылка КАК Ссылка
ПОМЕСТИТЬ втВидыРасчета
ИЗ
   
ПланВидовРасчета.ОсновныеНачисленияОрганизаций КАК ОсновныеНачисленияОрганизаций
ГДЕ
    ОсновныеНачисленияОрганизаций.Ссылка В(&СписокВР)
;

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

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ПлановыеНачисленияРаботниковОрганизаций.Сотрудник
ИЗ
   
втВидыРасчета КАК втВидыРасчета
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций КАК ПлановыеНачисленияРаботниковОрганизаций
        ПО втВидыРасчета.Ссылка = ПлановыеНачисленияРаботниковОрганизаций.ВидРасчета
ГДЕ
    ПлановыеНачисленияРаботниковОрганизаций.Период МЕЖДУ &НачалоПериода И &КонецПериода

 

Такой запрос может понадобиться, если вы хотите отобрать только тех сотрудников, кому будет начислена зарплата за определенный месяц по заданному виду расчета. Например, если вы будете рассчитывать значения показателей схем мотивации для определенного вида расчета, то имеет смысл считать показатели только для тех сотрудников, кому будет начислен этот вид расчета.

Структура запроса подобна предыдущему примеру, также есть 2 части. В первой части мы получаем сотрудников, имеющих вид расчета на начало периода и тех, кому вид расчета был возвращен в связи с наступлением периода завершения. Во второй части учитываются виды расчета, начавшиеся в течение заданного периода.

 

5)      Длительность работы сотрудника на дату среза

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втЗаписиКАнализу.Сотрудник,
   
ВЫБОР
        КОГДА ДЕНЬ(втЗаписиКАнализу.ДатаПо) >= ДЕНЬ(втЗаписиКАнализу.ДатаС)
            ТОГДА
РАЗНОСТЬДАТ(втЗаписиКАнализу.ДатаС, втЗаписиКАнализу.ДатаПо, МЕСЯЦ)
        ИНАЧЕ
РАЗНОСТЬДАТ(втЗаписиКАнализу.ДатаС, втЗаписиКАнализу.ДатаПо, МЕСЯЦ) - 1
   
КОНЕЦ КАК КолвоМесяцев,
   
втЗаписиКАнализу.Должность,
   
ВЫБОР
        КОГДА ДЕНЬ(втЗаписиКАнализу.ДатаПо) >= ДЕНЬ(втЗаписиКАнализу.ДатаС)
            ТОГДА
ДЕНЬ(втЗаписиКАнализу.ДатаПо) - ДЕНЬ(втЗаписиКАнализу.ДатаС)
        ИНАЧЕ
30 + ДЕНЬ(втЗаписиКАнализу.ДатаПо) - ДЕНЬ(втЗаписиКАнализу.ДатаС)
   
КОНЕЦ КАК КолвоДней
ПОМЕСТИТЬ втКусочкиПериодов
ИЗ
   
втЗаписиКАнализу КАК втЗаписиКАнализу
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втКусочкиПериодов.Сотрудник,
   
втКусочкиПериодов.Должность,
   
ВЫБОР
        КОГДА СУММА(втКусочкиПериодов.КолвоДней) >= 30
           
ТОГДА СУММА(втКусочкиПериодов.КолвоМесяцев) + ВЫРАЗИТЬ(СУММА(втКусочкиПериодов.КолвоДней) / 30-0.5 КАК ЧИСЛО(10, 0))
        ИНАЧЕ
СУММА(втКусочкиПериодов.КолвоМесяцев)
   
КОНЕЦ КАК КолвоМесяцев,
   
ВЫБОР
        КОГДА СУММА(втКусочкиПериодов.КолвоДней) >= 30
           
ТОГДА СУММА(втКусочкиПериодов.КолвоДней) - (ВЫРАЗИТЬ(СУММА(втКусочкиПериодов.КолвоДней) / 30-0.5 КАК ЧИСЛО(10, 0))) * 30
       
ИНАЧЕ СУММА(втКусочкиПериодов.КолвоДней)
   
КОНЕЦ КАК КолвоДней
ИЗ
   
втКусочкиПериодов КАК втКусочкиПериодов

СГРУППИРОВАТЬ ПО
   
втКусочкиПериодов.Сотрудник,
   
втКусочкиПериодов.Должность

 

Основное назначение такого запроса – подсчет длительности стажа сотрудника, но вы можете  получить длительность работы в подразделениях или на определенном графике работы. В данном примере рассчитывается длительность работы в разрезе должностей измеренная в месяцах и днях.

Временная таблица «втСКорректнымЗаверешнием» служит для получения записей о переводах сотрудника с датой начала и датой окончания данного перевода. Если период завершения больше периода следующей записи, то считаем, что возврат так и не наступил и в дальнейшем уже не учитываем.

«втЗаписиКАнализу» состоит из двух частей. В первой части мы обрубаем те временные переводы, которые выходят за дату среза и берем остальные периоды без изменений. Во второй части идет работа с периодами от даты возврата временного перевода до следующего перевода, так как такие случаи не учитываются в первой части.

«втКусочкиПериодов», в ней мы уже считаем количество месяцев и дней в каждом периоде работы сотрудника.  Для корректного расчета количества месяцев между двумя периодами добавлена проверка того, что отработан полный месяц с даты перевода, и если это не так, то количество месяцев уменьшается. Этот недоработанный месяц затем учитывается в количестве дней. Такой подход достаточно спорный, так как в месяце не всегда 30 дней. Если вам понадобиться решать такую задачу, то подумайте, как лучше представить длительность работы. Проще всего работать с днями, с годами чуть сложнее, а с месяцами уже зависит от задачи.

Наконец, в последнем запросе мы складываем полученные кусочки периодов, пересчитывая дни в месяцы – каждые 30 дней считаем за месяц. Количество месяцев и количество  дней и будет являться результатом.

Предупреждение: используйте данный пример очень аккуратно, продумайте, как считать длительность периодов с учетом специфики задачи. Если от результатов запроса будет зависеть зарплата, то каждая мелкая деталь требует проверки.

 

Выводы.

Схема регистров сведений с ресурсом ПериодЗавершения делает запросы к ним сложнее, но при желании можно построить аналог любого запроса использующего обычный РС. Если не учитывать период завершения в запросах к рассмотренным регистрам, то результаты будут неправильными в случаях временных переводов или приемов (в документах заполнена дата окончания), однако если в вашей организации не используются временные переводы, тогда все будет работать правильно и без усложнений.

 На мой взгляд, для реализации временных переводов стоило использовать другую схему регистров сведений: документ создает сразу две записи в регистре на дату начала и на дату окончания, а в случае конфликта, когда период задается раньше, чем период завершения предыдущей записи, требовать от пользователя исправления предыдущих кадровых документов. Запросы тогда превратились бы в банальный срез последних регистра сведений.

Для скачивания прикреплен архив, в котором:

1)    Сама статья в формате .docx

2)    Файл со всеми запросами из статьи в формате .sel

3)    Простой отчет на СКД, получающий плановые начисления на дату среза (запрос подобный примеру 2)

Тексты запросов раскрашены обработкой "Разукрашка": http://infostart.ru/public/19856/

Ссылки на полезные статьи для начинающего специалиста по зарплате:

Общее описание процесса настройки распространенных видов расчета: http://infostart.ru/public/22460/

Глубокое погружение в общие модули расчета зарплаты, написанное понятным языком, маст рид: http://infostart.ru/public/76206/

Простой пример собственного расчета показателей: http://infostart.ru/public/143181/

Моя статья об использовании подсистемы бюджетирования для сложных расчетов. Может пригодиться, если вам не хватает возможностей произвольной формулы в ПВР:  http://infostart.ru/public/194262/

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ПериодЗавершения
.rar 34,50Kb
28.08.13
13
.rar 1.0 34,50Kb 13 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

2. Maxim Kolkin (the1) 01.09.13 22:00
Полностью поддерживаю мнение о том, что реквизит "...Завершения" введен совершенно зря, лучше использовать методу, предложенную автором.
Synoecium; +1 Ответить
3. Андрей Смелов (Gesperid) 05.09.13 15:12
http://its.1c.ru/db/metod81#content:2910:1
"Запретить проведение документов с пересекающимися периодами изменения мы не можем, потому что это не соответствует постановке задачи регистрации первичных документов "как есть"."
Synoecium; +1 Ответить
4. Андрей Смелов (Gesperid) 05.09.13 16:36
Можно было бы немного "упростить" запросы, записывая открытые периоды (с ДатаНачала по ...) с граничным значением:
Период = ДатаНачала;
ПериодЗавершения = Дата(3999, 12, 31);
5. Сергей Лесовой (Synoecium) 06.09.13 12:45
(4) Gesperid, ребята с ИТС конечно оправдались постановкой задачи, но я также могу заявить что пользователям неудобно, что программа молча перекрывает пересекающиеся периоды более поздним изменением.
Соглашусь, что запросы чуть-чуть полегче стали бы, если период завершения устанавливался в максимальную дату при открытых периодах, но пользователи хуже воспринимают дату 31.12.3999, им она ни о чем не говорит, в отличие от программиста. А такая дата будет отображаться в формах списков и в табличных частях, если не предпринять дополнительных усилий по ее скрытию.

(1) Гость,
К сожалению прочитал эту статью уже после того как написал свою, но считаю, что их нужно совмещать друг другом, а не читать только ИТС. В этой публикации я даю готовые шаблоны по реальным регистрам, которые можно вставлять в свои запросы. Считаю, что новичку будет полезнее описание как сделать запрос с примерами и подробными пояснениями, а не объяснения почему сделали именно так, хотя они тоже не помешают.
6. Гость 07.09.13 04:16
Статья очень полезна для тех кто хочет понять базовые принципы ЗУП. Прочитал статью на ИТС, затем эту. Они хорошо друг друга дополняют.
7. Гость 07.09.13 08:49
Только запросы 3 и 4 нужно поменять местами, чтобы они совпадали с описанием.
8. Сергей Лесовой (Synoecium) 10.09.13 14:08
(7) Гость, Спасибо, исправил.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа