1. shnurov 01.12.16 10:50 Сейчас в теме

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

Доброго времени суток. Организация переходит на ЗУП 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. shnurov 02.12.16 05:07 Сейчас в теме
Продолжу-дополню. Версия ЗУП 3.1.1.74 КОРП.

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

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

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

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

Показать


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

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


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

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

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 100 000 руб.
Полный день

Консультант-аналитик 1С (ЗУП)
Санкт-Петербург
Полный день

Руководитель группы сервисов ЭДО, ЭЦП и криптографии
Москва
зарплата от 150 000 руб.
Полный день

Руководитель группы интеграций (1С)
Москва
зарплата от 150 000 руб.
Полный день

Руководитель группы сервисов FRM на 1С
Москва
зарплата от 150 000 руб.
Полный день