Отчет П4, СтатистикаПерсонала, СхемаКомпоновкиДанныхКадры.

1. Petr Shnurov (shnurov) 01.12.16 10:50 Сейчас в теме
Доброго времени суток. Организация переходит на ЗУП 3, до этого использовались самописная система. Идет внедрение, дошли до отчета по Среднесписочной численности(ССЧ) и Списочной численности (Сч), данные расходятся В ЗУП и нашей самописной системе, полез разбираться. Начальные данные для П4 берутся из СКД "СхемаКомпоновкиДанныхКадры" отчета "СтатистикаПерсонала", далее динамически формируются и выводятся в макет "ФормаОтчета2014Кв1_ФормаОтчета" отчета "РегламентированныйОтчетСтатистикаФормаП4" и все это потом выводится на форму "ФормаОтчета2014Кв1" этого же отчета. На форме представлены итоговые данные, но есть кнопка расшифровать и если ее нажать (для ячейки "работников списочного состава (без внешних совместителей) 2)" ) откроется таблица в которой будут Сотрудники и ССЧ этого сотрудника.

Так вот на против каждого сотрудника стоит 1, но есть те напротив которых стоит дробное значение например: 1,03225806451612903226, 0,35483870967741935484 и т.д., что по мнению наших кадровиков неправильно.

Разобрав запрос я пришел в выводу что ССЧ и СЧ в программе рассчитывается следующим образом

Списочная численность:

∑ 1/Кдм
Кдд

где, Кдм – количество дней в месяце, КДм количество дней на должности.

Среднесписочная численность:

∑ Ст/Кдм
(Кдд )

где, Кдм – количество дней в месяце, КДм количество дней на должности, Ст – ставка

Вроде все правильно и такая формула для сотрудников у которых нет кадровых переводов в месяц получения отчета П4 даст 1, а вот у которых есть переводы дает дробное значение.

Разбирая запрос дальше, к слову там есть че разбирать (40+ временных таблиц), я обрати внимание что в запросе периоды когда у сотрудника меняется должность пересекаются.
Пример: Сотрудник на 01.08 был на Должности1, далее с 06.08 его перевели на Должность2, а с 08.08 и до конца месяца его перевели на Должность3. Так в временной таблице ВТПериодыСостояний эти периоды пересекаются, т.е. получаются периоды с 01.08 по 06.08., далее с 06.08 по 08.08 и с 08.08 до 31.08, таким образом сотрудник 06.08 и 08.08 работал одновременном на двух должностях.


Ниже фрагмент кода запроса


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

СГРУППИРОВАТЬ ПО
	ПериодыИзмененияСостоянийСотрудников.Сотрудник,
	ПериодыИзмененияСостоянийСотрудников.Период
;
Показать


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

ЕСТЬNULL(МИНИМУМ(ПериодыИзмененияСостоянийСотрудниковВспом.Период), &КонецПериода) КАК ДатаОкончания,


заменить на

МИНИМУМ(ЕСТЬNULL(ДобавитьКДате(ПериодыИзмененияСостоянийСотрудниковВспом.Период, День,-1), &КонецПериода)) КАК ДатаОкончания,


кстати функция
Минимум
тоже стоит на там где надо.

Но все же вопрос, может кто знает: Почему запрос именно такой, почему периоды пересекаются? Разве нормально что СЧ и ССЧ дробная(хотя по формуле будут дроби, но не так как сейчас)?
Ответы
2. Petr Shnurov (shnurov) 02.12.16 05:07 Сейчас в теме
Продолжу-дополню. Версия ЗУП 3.1.1.74 КОРП.

Разбирая дальше запрос наткнулся еще на одну ошибку в запросе. День увольнения считается рабочим днем, однако для этого запроса это не так, причем там зачем-то специально отнят день, а именно в Временной таблице ВТПодразделенияСотрудников

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

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

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

Показать


как видим из данного фрагмента специально для увольнения вычитается день

ВЫБОР
		КОГДА КадроваяИсторияСотрудников.ВидСобытия = ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)
			ТОГДА ДОБАВИТЬКДАТЕ(КадроваяИсторияСотрудников.Период, ДЕНЬ, -1)
		ИНАЧЕ КадроваяИсторияСотрудников.Период
	КОНЕЦ,


надо исправить на

 КадроваяИсторияСотрудников.Период,
3. Светлана . (Swetlana) 10 02.12.16 09:19 Сейчас в теме
(2) где то встречала что последний день увольнения не должен попадать в численность, но сейчас не могу найти где я это видела. Но в отчете это предусмотрели, поэтому и отнимают один день, вот только основание для этого не нашла
4. Petr Shnurov (shnurov) 02.12.16 10:07 Сейчас в теме
(3)
Ну если так, то все равно неправильно считает, т.к. в таком случае периоды будут неверны(т.е. смотри первую часть исправлений). Проблема та в том что периоды наезжают друг на друга, а если последний день работы не входит в ССч то да, вторую правку не нужно использовать.
Оставьте свое сообщение