Каталог решений - Вновь о том, как рассчитать стаж

Вновь о том, как рассчитать стаж

Вновь о том, как рассчитать стаж

В наличии

Простой прием (алгоритм) расчета стажа

Категория:

Описание

При создании конфигурации для кадров столкнулся в необходимости расчета стажа… Понятно, что все это уже делалось и, возможно, я изобретаю велосипед, но пусть это будет мой мопед. Возможно, кому-то пригодится, и для кого-то это окажется наиболее простым решением 

Функция РазностьДат(ДатаНач, ДатаКон) Экспорт

В начале узнаем, сколько полных лет в стаже

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНач, &ДатаКон, МЕСЯЦ) КАК Месяцы"
;
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Если Выборка.Месяцы > 12 ИЛИ (Выборка.Месяцы = 12 И День(ДатаНач) < День(ДатаКон)) Тогда
Годы = Цел(Выборка.Месяцы / 12);

Далее отсекаем количество отработанных лет (запоминая их), чтобы остались месяцы и дни

ДатаД = ДобавитьМесяц(ДатаНач,Годы * 12); 
Иначе
Годы = 0; 
ДатаД = ДатаНач;
КонецЕсли;

Определяем количество отработанных месяцев

ЗапросД = Новый Запрос;
ЗапросД.Текст = "
|ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачД, &ДатаКонД, МЕСЯЦ) КАК Месяцы"
;
ЗапросД.УстановитьПараметр("ДатаНачД", ДатаД);
ЗапросД.УстановитьПараметр("ДатаКонД", ДатаКон);
ВыборкаД = ЗапросД.Выполнить().Выбрать();
ВыборкаД.Следующий();

Проверим, когда конечная дата и дата приема в одном месяце (включается или нет последний месяц)

Если ДобавитьМесяц(ДатаД,ВыборкаД.Месяцы) > ДатаКон Тогда
Месяцы = ВыборкаД.Месяцы - 1;
Иначе
Месяцы = ВыборкаД.Месяцы;
КонецЕсли;

Ну и количество дней найдем

ДатаК = ДобавитьМесяц(ДатаД,Месяцы);
ЗапросК = Новый Запрос;
ЗапросК.Текст = "
|ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачК, &ДатаКонК, ДЕНЬ) КАК Дни"
;
ЗапросК.УстановитьПараметр("ДатаНачК", ДатаК);
ЗапросК.УстановитьПараметр("ДатаКонК", ДатаКон);
ВыборкаК = ЗапросК.Выполнить().Выбрать();
ВыборкаК.Следующий(); 
Дни = ВыборкаК.Дни;
МассивДат = Новый Массив;
МассивДат.Добавить(Годы);
МассивДат.Добавить(Месяцы);
МассивДат.Добавить(Дни);
Возврат(МассивДат);
КонецФункции

Ну вот и все…Функция возвращает массив, где первый элемент годы, второй месяцы и третий дни

Затем можно вызвать данную функцию для вывода стажа, например, так

МассивДат = РазностьДат(ДатаПриема,ТекущаяДата());
Если Прав(МассивДат[0], 1) = "1" 
ИЛИ Прав(МассивДат[0], 1) = "2" 
ИЛИ Прав(МассивДат[0], 1) = "3"
ИЛИ Прав(МассивДат[0], 1) = "4"
Тогда п = " г. ";
Иначе п = " л. ";
КонецЕсли;
Стаж = Строка(МассивДат[0]) + п + Строка(МассивДат[1]) + " м. " + Строка(МассивДат[2]) + " д";

 

has been added to your cart:
Оформление заказа