Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
17 Дек 2017, 13:16
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Нужная идея. Подсчет непрерывного стажа в запросе.  (Прочитано 1087 раз)

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

Оффлайн vitasw

  • *****
  • Сообщений: 2575
  • РЕПУТАЦИЯ: 311
  • КПД: 12%
  • Регистрация: 2015-02-10
  • Сайт: 
  • Профессия: Программист 1С
Здравствуйте коллеги.
Есть периодический РС (Для тех кто знаком, например: РС Работники в ЗУПе).

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

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

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

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
ВЫБРАТЬ
РаботникиСрезПервых.Период,
РаботникиСрезПервых.ФизЛицо,
РаботникиСрезПервых.Должность
ПОМЕСТИТЬ мин
ИЗ
РегистрСведений.Работники.СрезПервых КАК РаботникиСрезПервых
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
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 месяц на должности Бух (жирным)
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Последний раз редактировалось: Dethmontt; 17 Апр 2015, 04:44. Причина: Объединение сообщений

Оффлайн Дмитрий@

  • *****
  • Сообщений: 735
  • РЕПУТАЦИЯ: 134
  • КПД: 18%
  • Ссылка на примеры работ https://yadi.sk/d/ksVluPMB
  • Регистрация: 2015-02-27
    • Skype: ShuplecovDima
  • Сайт: 
  • Профессия: Программист 1С
Пример запроса, только нужно еще учесть вдруг человек увольнялся

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

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

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

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

УПОРЯДОЧИТЬ ПО
Период
Ссылка на примеры работ https://yadi.sk/d/ksVluPMB

Оффлайн vitasw

  • *****
  • Сообщений: 2575
  • РЕПУТАЦИЯ: 311
  • КПД: 12%
  • Регистрация: 2015-02-10
  • Сайт: 
  • Профессия: Программист 1С
В принципе идея понятна. Спасибо. Осталось придумать как отсечь увольненте - прием.


Теги:
 

Получить номер недели в месяце в запросе [номер недели]

Автор MuI_I_IkaРаздел Алгоритмы

Ответов: 0
Просмотров: 4153
Последний ответ 15 Июл 2015, 18:24
от MuI_I_Ika
РС "СостояниеОСОрганизаций" в запросе

Автор ILLUMIРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 1
Просмотров: 1122
Последний ответ 07 Янв 2015, 05:33
от ILLUMI
Как исправить при обновлении ИБ: Ошибка в запросе набора данных по причине: {(58, 2)}: Несовместимые типы "ВЫБОР" <<?>>ВЫБОР

Автор dollРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 1
Просмотров: 2127
Последний ответ 01 Янв 2017, 20:27
от Геннадий ОбьГЭС
"Поле не найдено" в запросе, но оно есть.

Автор ferrari314Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 3
Просмотров: 2690
Последний ответ 27 Окт 2015, 10:29
от vitasw
Временная таблица во вложенном запросе+Группировка VS Таблица значений + Свернуть

Автор TsaigerРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 6
Просмотров: 595
Последний ответ 14 Июл 2017, 23:10
от Tsaiger

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
145 Сообщений
ilyay ilyay
63 Сообщений
AIFrame
56 Сообщений
alex0402
50 Сообщений
andron81_81
44 Сообщений
oleg-x
42 Сообщений
BuhRust
32 Сообщений
MuI_I_Ika MuI_I_Ika
31 Сообщений
Golickoff Golickoff
28 Сообщений
Dima Dddd Dima Dddd
24 Сообщений

* Кто онлайн

  • Точка Гостей: 258
  • Точка Скрытых: 0
  • Точка Пользователей: 6
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal