v8: Вычисление разности дат в годах, днях и месяцах запросомЗадача: вывести в отчете разность между двумя датами в годах, месяцах и днях, используя копоновку данных, но не добавляя функции в общие модули (т.к. конфигурация на поддержке) | | Автор статьи: monomo1 | Редакторы: Последняя редакция №2 от 23.04.08 | История URL: http://kb.mista.ru/article.php?id=664 | |
Ключевые слова: РазностьДат, разность дат, компоновка данных, стаж, запрос, ЗУП
Этот код можно использовать в расчитываемом поле компановки данных, а если разбить на три части (отдельно расчет годом, отдельно - месяцев, отдельно - дней), то и в обычном запросе.
В коде &Период - это дата, которой заканчивается отсчет, а ДанныеОРаботе.ДатаПриема - дата, с которой начинается отсчет.
Алгоримт работы аналогичен функции из ЗУП'а
Текст функции:
// Процедура вычисляет количество лет, месяцев и дней между двумя датами
//
// Параметры
// Дата1 – дата, первая дата (более поздняя, часто текущая, стаж определяется по состоянию на эту дату)
// Дата2 – дата, вторая дата (ранняя дата, с нее начинается "течение" стажа)
// Лет – Число, в этот параметр будет записано кол-во лет между двумя датами (Дата1-Дата2)
// Месяцев – Число, в этот параметр будет записано кол-во месяцев между двумя датами (Дата1-Дата2)
// Дней – Число, в этот параметр будет записано кол-во дней между двумя датами (Дата1-Дата2)
//
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0) Экспорт
Лет = 0;
Месяцев = 0;
Дней = 0;
Если Дата1 > Дата2 Тогда
ВременнаяДата = Дата1;
Если День(ВременнаяДата) < День(Дата2) Тогда
Дней = (ВременнаяДата - ДобавитьМесяц(ВременнаяДата,-1))/86400;
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
КонецЕсли;
Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
Месяцев = 12;
КонецЕсли;
Лет = Макс( Год(ВременнаяДата) - Год(Дата2), 0);
Месяцев = Макс(Месяцев + Месяц(ВременнаяДата) - Месяц(Дата2), 0);
Дней = Макс(Дней + День(ВременнаяДата) - День(Дата2), 0);
// скорректируем отображаемое значение, если "вмешалось" разное количество дней в месяцах
Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) Тогда
Дней = Дней + (День(КонецМесяца(Дата2)) - День(НачалоМесяца(Дата2))) - (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
КонецЕсли;
КонецЕсли;
КонецПроцедуры // РазобратьРазностьДат
Текст кода вычисляемого поля копоновки данных:
СТРОКА(
ВЫБОР
КОГДА Год(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ,"МЕСЯЦ",-12)
ИНАЧЕ
ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ
КОНЕЦ) - Год(ДанныеОРаботе.ДатаПриема) > 0
ТОГДА Год(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ,"МЕСЯЦ",-12)
ИНАЧЕ
ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ
КОНЕЦ) - Год(ДанныеОРаботе.ДатаПриема)
ИНАЧЕ 0
КОНЕЦ) + " г. "
+СТРОКА(
ВЫБОР
КОГДА ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА 12
ИНАЧЕ 0
КОНЕЦ + Месяц(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ,"МЕСЯЦ",-12)
ИНАЧЕ ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ
КОНЕЦ) - Месяц(ДанныеОРаботе.ДатаПриема) > 0
ТОГДА ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА 12
ИНАЧЕ 0
КОНЕЦ + Месяц(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ,"МЕСЯЦ",-12)
ИНАЧЕ
ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ
КОНЕЦ) - Месяц(ДанныеОРаботе.ДатаПриема)
ИНАЧЕ 0
КОНЕЦ) +" мес. "
+ СТРОКА(ВЫБОР
КОГДА (ВЫБОР
КОГДА ДЕНЬ(&Период) < ДЕНЬ(ДанныеОРаботе.ДатаПриема)
ТОГДА РазностьДат(ДобавитьКДате(&Период,"МЕСЯЦ",-1),&Период,"ДЕНЬ")
ИНАЧЕ 0
КОНЕЦ + День(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ,"МЕСЯЦ",-12)
ИНАЧЕ ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ
КОНЕЦ) - День(ДанныеОРаботе.ДатаПриема)) > 0
ТОГДА ВЫБОР
КОГДА ДЕНЬ(&Период) < ДЕНЬ(ДанныеОРаботе.ДатаПриема)
ТОГДА РазностьДат(ДобавитьКДате(&Период,"МЕСЯЦ",-1),&Период,"ДЕНЬ")
ИНАЧЕ 0
КОНЕЦ + День(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ,"МЕСЯЦ",-12)
ИНАЧЕ ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
ИНАЧЕ &Период
КОНЕЦ
КОНЕЦ) - День(ДанныеОРаботе.ДатаПриема)
ИНАЧЕ 0
КОНЕЦ) + " дн."
<\CODE> |