Здравствуйте. Пытаюсь запросом получить кадровое состояние сотрудника на конкретные даты. Использую для этого регистр КадроваяИсторияСотрудниковИнтервальный, он на первый взгляд отлично под это подходит.
Все бы ничего, но на границах дат есть проблемы, а именно непонятно почему они "залезают" всегда или иногда (пока не понял логику) на другие дни.
К примеру: человек был переведен 1 октября в другое подразделение, но у него стоит ДатаОкончания предыдущего интервала не 31 сентября 23 часа 59 минут 59 секунд, а 1 октября к примеру 5 секунд! Т.е. хрен с ним с секундами, а идет перехлест даже на другой день. Новый интервал где уже новое подразделение начинается к примеру в 6 секунд 1 октября.
Если запросом с этим работать, то куча проблем, не понятно в какой день по сути закончился интервал... те. функции КонецДня или НачалоДня тут не помогут.
Возможно конечно использовать какие-то спец-функции самой конфы для получения подобных данных, но не очень хочется логику переделывать да и хочется понять смысл почему так сделано и как с этим можно все-таки работать с этим регистром? Может сдвиг какой-то времени нужно делать изначально в запросах, чтобы такого не было, в общем нужно понимание возникновения этих секунд.
Подскажите может кто разбирался с этим.
(1) без паники - все в порядке, просто нужно отвыкать от технологии периодических регистров и понять
технологию интервальных.
поначалу это боль, т.к. у многих "ломка" по старой логике.
интервальная логика работает гораздо быстрее - проверено после 10 лет использования зупов, начиная с самых мохнатых.
(3) Да паники то нет, нет понимания.. И как тогда с такими регистрами работать, если идет перехлест дат? Можете пояснить? Сама структура такого регистра понятна, почему он быстрее должен работать тоже в принципе (пытался до этого получить те-же данные с обычного регистра кадровой истории, не интервального, вот там проблемы были, с интервальным работать поприятнее). Но всю малину портят эти даты..
(4) Нет смысла вести росказни, но есть алгоритм познания
1. Поищите глобальным поиском в общих модулях запросы с тегом "КадроваяИсторияСотрудниковИнтервальный"
2. Создайте папку у себя на диске "КадроваяИсторияСотрудниковИнтервальный"
3. Скопируйте в эту папку найденные запросы
4. Открывайте консоль и поочередно копируйте тексты в нее
5. Избавтесь или вбейте параметры/вт в каждом тексте так, чтобы запрос работал
6. Пристально рассматривайте результаты.
7. После пары дней таких обзоров приходит понимание.
Самое главное - не надо бояться тестов запросов и говорить себе "е-п-р-с-т, это, что за грибы!"
подтверждаю - грибы как грибы, вполне здоровые.
(6) Посмотрел функцию КадровыйУчет.КадровыеДанныеСотрудников. Не подходит она мне, т.к. в ней выводятся кадровое состояние сотрудника на определенную дату, мне же нужно получить по итогу всех сотрудников, кто работал (был в отпуске и тп) за определенный период на подразделении, а не просто на дату.
(10)это можно и обычным способом, через срез последних + изменения за период узнать.
В кадровой истории не хранятся данные о состоянии сотрудника: в отпуске/на больничном/etc
(11) Не очень понял как это можно сделать через срез последних, если напишите пример краткий буду рад. То что нет данных об отпуске мне тут не очень важно, мне нужно знать что человек числится,работает там-то за такой-то период, этого достаточно. Просто тут срез скорее всего не пойдет, т.к. есть ситуации когда к примеру человек один день отработал, а потом уволился или перевелся, но его все равно нужно выводить пусть и на текущее время он не числится в подразделении.
Выбрать Период, ФизЛицо, Сотрудник, Подразделение Из РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&НачалоПериода)
ГДЕ НЕ ВидСобытия = ВидыСобытий.Увольнение
ОБЪЕДИНИТЬ
Выбрать Период, ФизЛицо, Сотрудник, Подразделение Из РегистрСведений.КадроваяИсторияСотрудников
ГДЕ Период МЕЖДУ &НачалоПериода И &КонецПериода
(13) Да, что-то я не подумал что так можно попробовать получить, спасибо, а не лезть в интервальный регистр. Кстати и в этом регистре тоже используется сдвиг периода на секунды при записи)
// Составляет таблицу состояний сотрудников.
// Если указаны даты начала/окончания, будут отобраны записи о состояниях,
// которые хотя бы одним днем попадают в указанный период.
СостоянияСотрудников.СостоянияСотрудников()
(8)Хорошая функция (и регистр используемые в ней), но с него к сожалению не получить информацию о подразделении где работает сотрудник, только статус работает или нет с датами. У меня куча подразделений, нужно знать где именно работает.