Определение количества лет между двумя датами в запросе

29.10.20

Разработка - Запросы

Фрагмент запроса для определения количества лет между двумя датами для решения задачи простых процентов.

Для задачи начисления простых процентов (пени, вклады без капитализации процентов) при использовании годовой ставки необходимо вычислить дробное количество лет. Например, человек открыл вклад без капитализации процентов 01.10.2018 и решил досрочно закрыть его из-за коронавирусного кризиса 01.04.2020. Сколько всего он получил процентов по вкладу? В 2018 году это будут проценты за 92 дня или 0,252 года; в 2019 – за целый год; а в 2020 за те же 92 дня, но это будет 0,251 года, поскольку 2020 – високосный. Итого получаются проценты за 1,503 года. Количество лет нам заранее неизвестно, поэтому проще всего произвести такой расчет в цикле, перебрать каждый год, и вычислить для него долю года, для которой нужно рассчитать процент с учетом количества дней в каждом году. Например, вот так:

КоличествоЛет = 0;
НачалоИнтервала = ДатаНачалаРасчета;
КонецИнтервала = ?(Год(ДатаНачалаРасчета) = Год(ДатаОкончанияРасчета), КонецДня(ДатаОкончанияРасчета), КонецГода(ДатаНачалаРасчета));

Пока НачалоИнтервала < ДатаОкончанияРасчета Цикл
	КоличествоЛет = КоличествоЛет + (КонецИнтервала - НачалоДня(НачалоИнтервала) + 1) / (КонецГода(КонецИнтервала) - НачалоГода(НачалоИнтервала) + 1);
	НачалоИнтервала = КонецИнтервала + 1;
	КонецИнтервала =?(Год(НачалоИнтервала) = Год(ДатаОкончанияРасчета), КонецДня(ДатаОкончанияРасчета), КонецГода(НачалоИнтервала));
КонецЦикла;

Но что если нам нужно вычислить количество лет в запросе? В языке запросов 1С нет возможности организовывать циклы. Здесь нам поможет тот факт, что дробными могут быть только два крайних года, а годы, расположенные внутри отрезка всегда окажутся целыми, сколько бы их ни было. Таким образом, задача от неопределенного числа итераций сводится к трем:

  1. Вычислить количество полных лет внутри интервала
  2. Вычислить долю первого года
  3. Вычислить долю последнего года                                     

Что довольно лаконично формулируется на языке запросов:

ВЫБОР
	КОГДА РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ГОД) > 1
		ТОГДА РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ГОД) - 1
	ИНАЧЕ 0
КОНЕЦ
+ 
ВЫБОР
	КОГДА РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ГОД) > 0
		ТОГДА (РАЗНОСТЬДАТ(ДатаНачалаРасчета, КОНЕЦПЕРИОДА(ДатаНачалаРасчета, ГОД), ДЕНЬ) + 1)
				 / (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаНачалаРасчета, ГОД), КОНЕЦПЕРИОДА(ДатаНачалаРасчета, ГОД), ДЕНЬ) + 1)
		 	+ (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаОкончанияРасчета, ГОД), ДатаОкончанияРасчета, ДЕНЬ) + 1)
		 		 / (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаОкончанияРасчета, ГОД), КОНЕЦПЕРИОДА(ДатаОкончанияРасчета, ГОД), ДЕНЬ) + 1)
	ИНАЧЕ (РАЗНОСТЬДАТ(ДатаНачалаРасчета, ДатаОкончанияРасчета, ДЕНЬ) + 1)
			 / (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДатаНачалаРасчета, ГОД), КОНЕЦПЕРИОДА(ДатаОкончанияРасчета, ГОД), ДЕНЬ) + 1)
КОНЕЦ

 

СКД запрос пени простые проценты

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    184748    1029    403    

968

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    2201    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5735    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    13141    sergey279    18    

66

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    8220    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3193    PROSTO-1C    0    

23

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    10802    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 100 02.11.20 15:49 Сейчас в теме
Параметры запроса в 1с задаются амперсандом.
2. antonivan 178 02.11.20 15:54 Сейчас в теме
(1) В этом фрагменте нет параметров. ДатаНачалаРасчета и ДатаОкончанияРасчета - это поля таблицы, содержащей даты, для которых мы рассчитываем количество лет.
3. triviumfan 100 02.11.20 17:18 Сейчас в теме
(2) ИмяТаблицы.ДатаНачалаРасчета
4. antonivan 178 02.11.20 17:41 Сейчас в теме
(3) Если нужно, можно подставить ИмяТаблицы, в случае одной таблицы, работает и просто по имени поля. Для простоты примера не стал загромождать запрос
5. FatPanzer 02.11.20 17:46 Сейчас в теме
(4) Для простоты примера как раз таки надо было написать имя таблицы, чтобы понимать источник данных...
Оставьте свое сообщение