Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 мая 2024, 03:42

Нужная идея. Подсчет непрерывного стажа в запросе.

Автор vitasw, 17 апр 2015, 01:46

0 Пользователей и 1 гость просматривают эту тему.

vitasw

Здравствуйте коллеги.
Есть периодический РС (Для тех кто знаком, например: РС Работники в ЗУПе).

Пример набора записей по физ лицу:

Дата                 ФизЛицо                  Должность              Ставка            Комментарий

01.01.2014        Иванова                   Бухгалтер                 1                Прием
05.04.2014        Иванова                   Бухгалтер                 1                Повышение оклада
01.07.2014        Иванова                   Бухгалтер                 0                Перевод (увольнение из бухгалтера)
01.07.2014        Иванова                   Декрет                    1                Перевод (прием в декрет)
01.12.2014        Иванова                   Декрет                    0                Перевод (увольнение из декрета)
01.12.2014        Иванова                   Бухгалтер                 1                Перевод (прием в бухгалтера)
01.03.2015        Иванова                   Бухгалтер                 1                Повышение оклада


Нужно каким-то волшебным образом определить дату начала работы в текущей непрерывной должности (нужная дата выделена шрифтом), причем запросом.
Или предложите какой либо альтернативный метод определения нужной даты начала, вплоть до создания новых метаданных (РС, РН).

Спасибо.

Dethmontt

ВЫБРАТЬ
РаботникиСрезПервых.Период,
РаботникиСрезПервых.ФизЛицо,
РаботникиСрезПервых.Должность
ПОМЕСТИТЬ мин
ИЗ
РегистрСведений.Работники.СрезПервых КАК РаботникиСрезПервых
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РаботникиСрезПоследних.Период,
РаботникиСрезПоследних.ФизЛицо,
РаботникиСрезПоследних.Должность
ПОМЕСТИТЬ макс
ИЗ
РегистрСведений.Работники.СрезПоследних КАК РаботникиСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
max.ФизЛицо,
max.Должность,
min.Период КАК ДатаНачала,
max.Период КАК ДатаОкончания
ПОМЕСТИТЬ ВТ_ПериодыРаботы
ИЗ
мин КАК min
ВНУТРЕННЕЕ СОЕДИНЕНИЕ макс КАК max
ПО min.ФизЛицо = max.ФизЛицо
И min.Должность = max.Должность
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_ПериодыРаботы.ФизЛицо,
МИНИМУМ(ВТ_ПериодыРаботы.ДатаНачала) КАК ДатаНачала,
МАКСИМУМ(ВТ_ПериодыРаботы.ДатаОкончания) КАК ДатаОкончания,
ВТ_ПериодыРаботы1.Должность КАК ВытесняемаяДолжность
ПОМЕСТИТЬ ВТ_Вытяснения
ИЗ
ВТ_ПериодыРаботы КАК ВТ_ПериодыРаботы
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПериодыРаботы КАК ВТ_ПериодыРаботы1
ПО ВТ_ПериодыРаботы.ФизЛицо = ВТ_ПериодыРаботы1.ФизЛицо
И ВТ_ПериодыРаботы.Должность <> ВТ_ПериодыРаботы1.Должность
И ВТ_ПериодыРаботы.ДатаНачала >= ВТ_ПериодыРаботы1.ДатаНачала
И ВТ_ПериодыРаботы.ДатаОкончания <= ВТ_ПериодыРаботы1.ДатаОкончания

СГРУППИРОВАТЬ ПО
ВТ_ПериодыРаботы.ФизЛицо,
ВТ_ПериодыРаботы1.Должность
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_ПериодыРаботы.ФизЛицо,
ВТ_ПериодыРаботы.Должность,
ВТ_ПериодыРаботы.ДатаНачала,
ВТ_ПериодыРаботы.ДатаОкончания,
ЕСТЬNULL(ВТ_Вытяснения.ДатаНачала, ДАТАВРЕМЯ(1, 1, 1)) КАК НачалаВыт,
ЕСТЬNULL(ВТ_Вытяснения.ДатаОкончания, ДАТАВРЕМЯ(1, 1, 1)) КАК ОкончаниеВыт,
РАЗНОСТЬДАТ(ВТ_ПериодыРаботы.ДатаНачала, ВТ_ПериодыРаботы.ДатаОкончания, ДЕНЬ) - РАЗНОСТЬДАТ(ЕСТЬNULL(ВТ_Вытяснения.ДатаНачала, ДАТАВРЕМЯ(1, 1, 1)), ЕСТЬNULL(ВТ_Вытяснения.ДатаОкончания, ДАТАВРЕМЯ(1, 1, 1)), ДЕНЬ) КАК СтажДней
ИЗ
ВТ_ПериодыРаботы КАК ВТ_ПериодыРаботы
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Вытяснения КАК ВТ_Вытяснения
ПО ВТ_ПериодыРаботы.ФизЛицо = ВТ_Вытяснения.ФизЛицо
И ВТ_ПериодыРаботы.Должность = ВТ_Вытяснения.ВытесняемаяДолжность

Добавлено: 17 апр 2015, 04:44


Это простой алгоритм и не учитывает изменения типа:
01.01.2014 Бух
01.02.2014 Декрет
01.05.2014 Бух
01.06.2014 Декрет

01.09.2014 Бух

Результат будет посчитан неправильно. Вылетит 1 месяц на должности Бух (жирным)
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Дмитрий@

Пример запроса, только нужно еще учесть вдруг человек увольнялся


ВЫБРАТЬ
Работники.Период,
Работники.ФизЛицо,
Работники.Должность
ПОМЕСТИТЬ Работники
ИЗ
РегистрСведений.Работники КАК Работники
ГДЕ
Работники.ФизЛицо = &ФизЛицо
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Работники.Период,
Работники.Должность,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РаботникиДляПодсчета.Должность) КАК КоличествоИзмененийДолжности
ПОМЕСТИТЬ Работники2
ИЗ
Работники КАК Работники
ЛЕВОЕ СОЕДИНЕНИЕ Работники КАК РаботникиДляПодсчета
ПО Работники.Период <= РаботникиДляПодсчета.Период
И Работники.ФизЛицо = РаботникиДляПодсчета.ФизЛицо

СГРУППИРОВАТЬ ПО
Работники.Период,
Работники.Должность
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
Работники2.Период КАК Период,
Работники2.Должность,
Работники2.КоличествоИзмененийДолжности
ИЗ
Работники2 КАК Работники2
ГДЕ
Работники2.КоличествоИзмененийДолжности <= 1

УПОРЯДОЧИТЬ ПО
Период

vitasw

В принципе идея понятна. Спасибо. Осталось придумать как отсечь увольненте - прием.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск