Кажется, что может быть проще регистра Состояние сотрудников организации. Дата и состояние. Сразу видно с какой даты сотрудник в отпуске или болеет или в отпуске по уходу за ребенком.
Но 1С добавила ресурсы ДатаЗавершения и СостояниеЗавершения. И испортила всю малину стройность решения. Значит когда наступит ДатаЗавершения у сотрудника будет состояние СостояниеЗавершения. Так думают большинство кадровых работников, по крайней мере с которыми я встречался. Значит наш любимый СрезПоследнних не пройдет и мы вооружившись методами SQL(в запросах 1С) напишем правильный отчет.
Придумаем простой пример:
Иванова Василиса Микулишна находится в отпуске по уходу за ребенком с 01.01.2009 по 31.12.2011.
№ п/п |
Сотрудник |
Период |
Состояние |
Период завершения |
Состояние завершения |
Регистратор |
1 |
Иванова Василиса Микулишна |
01.01.2009 |
В отпуске по уходу за ребенком |
01.01.2012 |
Работает |
Отпуска организаций 1910-ОТ от 30.12.2008 0:00:00 |
Делаем просотй запрос
ВЫБРАТЬ РАЗРЕШЕННЫЕ
СостояниеРаботниковОрганизаций.Период КАК Период,
СостояниеРаботниковОрганизаций.Сотрудник КАК Сотрудник,
СостояниеРаботниковОрганизаций.Состояние КАК Состояние,
СостояниеРаботниковОрганизаций.Регистратор,
СостояниеРаботниковОрганизаций.ПериодЗавершения
ИЗ
РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
Объединяем с периодами после после завешения
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВложенныйЗапрос.ПериодЗавершения,
ВложенныйЗапрос.Сотрудник,
ВложенныйЗапрос.СостояниеЗавершения,
ВложенныйЗапрос.Регистратор,
ВложенныйЗапрос.ПериодНовый
ИЗ
(ВЫБРАТЬ
СостояниеРаботниковОрганизаций.Регистратор КАК Регистратор,
СостояниеРаботниковОрганизаций.Период КАК Период,
СостояниеРаботниковОрганизаций.Сотрудник КАК Сотрудник,
МИНИМУМ(СостояниеПослеТекущего.Период) КАК ПериодНовый,
СостояниеРаботниковОрганизаций.Состояние КАК Состояние,
СостояниеРаботниковОрганизаций.ПериодЗавершения КАК ПериодЗавершения,
СостояниеРаботниковОрганизаций.СостояниеЗавершения КАК СостояниеЗавершения
ИЗ
РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеПослеТекущего
ПО СостояниеРаботниковОрганизаций.Организация = СостояниеПослеТекущего.Организация
И СостояниеРаботниковОрганизаций.Сотрудник = СостояниеПослеТекущего.Сотрудник
И СостояниеРаботниковОрганизаций.Период < СостояниеПослеТекущего.Период
СГРУППИРОВАТЬ ПО
СостояниеРаботниковОрганизаций.Сотрудник,
СостояниеРаботниковОрганизаций.Период,
СостояниеРаботниковОрганизаций.Регистратор,
СостояниеРаботниковОрганизаций.Состояние,
СостояниеРаботниковОрганизаций.ПериодЗавершения,
СостояниеРаботниковОрганизаций.СостояниеЗавершения) КАК ВложенныйЗапрос
ГДЕ
(ВложенныйЗапрос.ПериодЗавершения < ВложенныйЗапрос.ПериодНовый
ИЛИ ВложенныйЗапрос.ПериодНовый ЕСТЬ NULL )
И ВложенныйЗапрос.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
;
И делаем правильные периоды в случае пересечения...
ВЫБРАТЬ
ВложенныйЗапрос.Период,
ВложенныйЗапрос.Сотрудник КАК Сотрудник,
ВТСостояниеСотрудников.Состояние,
ВТСостояниеСотрудников.Регистратор,
ВТСостояниеСотрудников.ПериодЗавершения
ПОМЕСТИТЬ ВТДекреныеОтпуска
ИЗ
(ВЫБРАТЬ
МАКСИМУМ(ВложенныйЗапрос.Период) КАК Период,
ВложенныйЗапрос.Сотрудник КАК Сотрудник
ИЗ
ВТСостояниеСотрудников КАК ВложенныйЗапрос
ГДЕ
ВложенныйЗапрос.Период
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.Сотрудник) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ ВТСостояниеСотрудников КАК ВТСостояниеСотрудников
ПО ВложенныйЗапрос.Период = ВТСостояниеСотрудников.Период
И ВложенныйЗапрос.Сотрудник = ВТСостояниеСотрудников.Сотрудник
ГДЕ
ВТСостояниеСотрудников.Состояние В(&СписокСостояний)
;
Получаем то, что нам надо. Последний запрос строим тот который нужен каждому и радуемся...
Идею заложенную в отчет можно применять не только к отпуску по уходу, но в любом отчете по регистру Состояниюсотрудника.
P.S.
По моему пониманию 1С делает неправильный шаг, когда планируемые действия в будущем(Состояние завершения) сразу выдаются за факт, а не относятся исключительно к категории планирования. Но это так и мы должны быть во всеоружии, чтобы понять как это работает и дотошно объяснять пользователям.