Недавно поступила задача от бухгалтера сделать отчет по стажу сотрудников, который бы считал его в годах, днях, месяцах. Посмотрел как реализуется подсчет в типовых конфигурациях, но меня это не устроило. Хотел реализовать именно запросом. Но, казалось бы, не сложная задача ограничивалась возможностями языка запросов. Поискав на Инфостарте и Мисте, не нашел готового решения данной задачи с помощью запроса. Решил делать сам. Сделал следующий запрос, который считает годы, месяцы и дни между заданными датами:
ВЫБРАТЬ
&Д1 КАК Д1,
&Д2 КАК Д2,
РАЗНОСТЬДАТ(&Д1, &Д2, ДЕНЬ) КАК ДнейВсего,
ВЫБОР
КОГДА МЕСЯЦ(&Д1) <= (МЕСЯЦ(&Д2) - ВЫБОР
КОГДА ДЕНЬ(&Д1) <= ДЕНЬ(&Д2)
ТОГДА 0
ИНАЧЕ 1
КОНЕЦ)
ТОГДА ВЫБОР
КОГДА ГОД(&Д2) > ГОД(&Д1)
ТОГДА ГОД(&Д2) - ГОД(&Д1)
ИНАЧЕ 0
КОНЕЦ
ИНАЧЕ ВЫБОР
КОГДА ГОД(&Д2) - ГОД(&Д1) >= 1
ТОГДА ГОД(&Д2) - ГОД(&Д1) - 1
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ КАК Лет,
ВЫБОР
КОГДА МЕСЯЦ(&Д1) < МЕСЯЦ(&Д2)
ТОГДА ВЫБОР
КОГДА ДЕНЬ(&Д1) <= ДЕНЬ(&Д2)
ТОГДА МЕСЯЦ(&Д2) - МЕСЯЦ(&Д1)
ИНАЧЕ МЕСЯЦ(&Д2) - МЕСЯЦ(&Д1) - 1
КОНЕЦ
ИНАЧЕ ВЫБОР
КОГДА ДЕНЬ(&Д1) <= ДЕНЬ(&Д2)
И ГОД(&Д2) - ГОД(&Д1) = 1
ТОГДА 12 - МЕСЯЦ(&Д1) + МЕСЯЦ(&Д2)
ИНАЧЕ 12 - МЕСЯЦ(&Д1) + МЕСЯЦ(&Д2) - 1
КОНЕЦ
КОНЕЦ КАК Месяцев,
ВЫБОР
КОГДА ДЕНЬ(&Д1) <= ДЕНЬ(&Д2)
ТОГДА ДЕНЬ(&Д2) - ДЕНЬ(&Д1)
ИНАЧЕ РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(&Д2, МЕСЯЦ, -1), ДЕНЬ, ДЕНЬ(&Д1) - ДЕНЬ(&Д2)), &Д2, ДЕНЬ)
КОНЕЦ КАК Дней
Дальше все было просто. Вытянул даты приема и увольнения, начала и окончания работы в предыдущих организациях и состряпал отчетик на базе шаблона. Получилось следующее:
Отчет тестировался на следующих конфигурациях:
Зарплата і управління персоналом для України 2.1.49.1
Управління виробничим підприємством для України, редакція 1.3.57.1
Управління торговим пiдприємством для України, редакція 1.2.47.2