При создании конфигурации для кадров столкнулся в необходимости расчета стажа... Понятно, что все это уже делалось и, возможно, я изобретаю велосипед, но пусть это будет мой мопед. Возможно, кому-то пригодится, и для кого-то это окажется наиболее простым решением
Функция РазностьДат(ДатаНач, ДатаКон) Экспорт
В начале узнаем, сколько полных лет в стаже
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНач, &ДатаКон, МЕСЯЦ) КАК Месяцы"
;
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Если Выборка.Месяцы > 12 ИЛИ (Выборка.Месяцы = 12 И День(ДатаНач) < День(ДатаКон)) Тогда
Годы = Цел(Выборка.Месяцы / 12);
Далее отсекаем количество отработанных лет (запоминая их), чтобы остались месяцы и дни
ДатаД = ДобавитьМесяц(ДатаНач,Годы * 12);
Иначе
Годы = 0;
ДатаД = ДатаНач;
КонецЕсли;
Определяем количество отработанных месяцев
ЗапросД = Новый Запрос;
ЗапросД.Текст = "
|ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачД, &ДатаКонД, МЕСЯЦ) КАК Месяцы"
;
ЗапросД.УстановитьПараметр("ДатаНачД", ДатаД);
ЗапросД.УстановитьПараметр("ДатаКонД", ДатаКон);
ВыборкаД = ЗапросД.Выполнить().Выбрать();
ВыборкаД.Следующий();
Проверим, когда конечная дата и дата приема в одном месяце (включается или нет последний месяц)
Если ДобавитьМесяц(ДатаД,ВыборкаД.Месяцы) > ДатаКон Тогда
Месяцы = ВыборкаД.Месяцы - 1;
Иначе
Месяцы = ВыборкаД.Месяцы;
КонецЕсли;
Ну и количество дней найдем
ДатаК = ДобавитьМесяц(ДатаД,Месяцы);
ЗапросК = Новый Запрос;
ЗапросК.Текст = "
|ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачК, &ДатаКонК, ДЕНЬ) КАК Дни"
;
ЗапросК.УстановитьПараметр("ДатаНачК", ДатаК);
ЗапросК.УстановитьПараметр("ДатаКонК", ДатаКон);
ВыборкаК = ЗапросК.Выполнить().Выбрать();
ВыборкаК.Следующий();
Дни = ВыборкаК.Дни;
МассивДат = Новый Массив;
МассивДат.Добавить(Годы);
МассивДат.Добавить(Месяцы);
МассивДат.Добавить(Дни);
Возврат(МассивДат);
КонецФункции
Ну вот и все...Функция возвращает массив, где первый элемент годы, второй месяцы и третий дни
Затем можно вызвать данную функцию для вывода стажа, например, так
МассивДат = РазностьДат(ДатаПриема,ТекущаяДата());
Если Прав(МассивДат[0], 1) = "1"
ИЛИ Прав(МассивДат[0], 1) = "2"
ИЛИ Прав(МассивДат[0], 1) = "3"
ИЛИ Прав(МассивДат[0], 1) = "4"
Тогда п = " г. ";
Иначе п = " л. ";
КонецЕсли;
Стаж = Строка(МассивДат[0]) + п + Строка(МассивДат[1]) + " м. " + Строка(МассивДат[2]) + " д";