Начисление процентов по займов за произвольный период, процентные ставки могут меняться

26.12.11

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

Есть задача начисления процентов по займам за произвольный период, включая случаи кратного количества лет, т.е. в общем случае, когда обе даты начала и конца периода  лежат в разных годах. Займы могут выплачиваться частями. Кроме того, процентные ставки по договорам займа могут меняться в любой момент (день). Эта задача была сделана в платформе 7.7, но с помощью объектной модели запросов по бухгалтерским итогам и таблицы значений. Сейчас я сделал исключительно через механизм запросов.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Выгрузка конфигурации
.dt 38,70Kb
51
51 Скачать (1 SM) Купить за 1 850 руб.

Описание задачи:
Есть задача начисления процентов по займам за произвольный период, включая случаи кратного количества лет, т.е. в общем случае, когда обе даты начала и конца периода  лежат в разных годах. Займы могут выплачиваться частями. Кроме того, процентные ставки по договорам займа могут меняться в любой момент (день). Эта задача была сделана в платформе 7.7, но с помощью объектной модели запросов по бухгалтерским итогам и таблицы значений. Сейчас я сделал исключительно через механизм запросов.



	ВЫБРАТЬ
    РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
    РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
    РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
    РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаЗайма,
    РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.Период
ПОМЕСТИТЬ Врем1
ИЗ
    РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, ДвиженияИГраницыПериода, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ВыданныеЗаймы), , ) КАК РегистрБухгалтерииХозрасчетныйОстаткиИОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПроцентныеСтавкиПоЗаймам.Период,
    ПроцентныеСтавкиПоЗаймам.Договор,
    ПроцентныеСтавкиПоЗаймам.ПроцентнаяСтавка
ПОМЕСТИТЬ Врем2
ИЗ
    РегистрСведений.ПроцентныеСтавкиПоЗаймам КАК ПроцентныеСтавкиПоЗаймам
ГДЕ
    ПроцентныеСтавкиПоЗаймам.Период     И ПроцентныеСтавкиПоЗаймам.Период >= &НачалоПериода
    И ПроцентныеСтавкиПоЗаймам.Договор В
            (ВЫБРАТЬ РАЗЛИЧНЫЕ
                Врем1.Договор
            ИЗ
                Врем1 КАК Врем1)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ПроцентныеСтавкиПоЗаймамСрезПоследних.Период,
    ПроцентныеСтавкиПоЗаймамСрезПоследних.Договор,
    ПроцентныеСтавкиПоЗаймамСрезПоследних.ПроцентнаяСтавка
ИЗ
    РегистрСведений.ПроцентныеСтавкиПоЗаймам.СрезПоследних(
            &НачалоПериода,
            Договор В
                (ВЫБРАТЬ РАЗЛИЧНЫЕ
                    Врем1.Договор
                ИЗ
                    Врем1 КАК Врем1)) КАК ПроцентныеСтавкиПоЗаймамСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Врем1.Счет,
    Врем1.Контрагент,
    Врем1.Договор,
    Врем2.Период,
    Врем1.СуммаЗайма,
    МАКСИМУМ(Врем1.Период) КАК Период1
ПОМЕСТИТЬ Врем3
ИЗ
    Врем1 КАК Врем1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Врем2 КАК Врем2
        ПО Врем1.Договор = Врем2.Договор
            И Врем1.Период
СГРУППИРОВАТЬ ПО
    Врем1.Счет,
    Врем1.Контрагент,
    Врем1.Договор,
    Врем2.Период,
    Врем1.СуммаЗайма
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Врем1.Счет КАК Счет,
    Врем1.Контрагент КАК Контрагент,
    Врем1.Договор КАК Договор,
    ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(Врем1.Период, ГОД), СЕКУНДА, 1) КАК Период,
    МАКСИМУМ(Врем1.Период) КАК Период1
ПОМЕСТИТЬ Врем4
ИЗ
    Врем1 КАК Врем1
ГДЕ
    ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(Врем1.Период, ГОД), СЕКУНДА, 1)
СГРУППИРОВАТЬ ПО
    Врем1.Счет,
    Врем1.Контрагент,
    Врем1.Договор,
    ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(Врем1.Период, ГОД), СЕКУНДА, 1)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Врем4.Счет,
    Врем4.Контрагент,
    Врем4.Договор,
    Врем4.Период,
    Врем1.СуммаЗайма
ПОМЕСТИТЬ Врем5
ИЗ
    Врем1 КАК Врем1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Врем4 КАК Врем4
        ПО Врем1.Счет = Врем4.Счет
            И Врем1.Контрагент = Врем4.Контрагент
            И Врем1.Период = Врем4.Период1
            И Врем1.Договор = Врем4.Договор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Врем1.Счет КАК Счет,
    Врем1.Контрагент КАК Контрагент,
    Врем1.Договор КАК Договор,
    Врем1.Период КАК Период,
    Врем1.СуммаЗайма КАК СуммаЗайма
ПОМЕСТИТЬ Врем6
ИЗ
    Врем1 КАК Врем1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Врем3.Счет,
    Врем3.Контрагент,
    Врем3.Договор,
    Врем3.Период,
    Врем3.СуммаЗайма
ИЗ
    Врем3 КАК Врем3

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Врем5.Счет,
    Врем5.Контрагент,
    Врем5.Договор,
    Врем5.Период,
    Врем5.СуммаЗайма
ИЗ
    Врем5 КАК Врем5
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Врем6.Счет,
    Врем6.Контрагент,
    Врем6.Договор,
    Врем6.Период,
    Врем6.СуммаЗайма,
    МАКСИМУМ(Врем2.Период) КАК Период1
ПОМЕСТИТЬ Врем7
ИЗ
    Врем6 КАК Врем6
        ЛЕВОЕ СОЕДИНЕНИЕ Врем2 КАК Врем2
        ПО Врем6.Договор = Врем2.Договор
            И Врем6.Период >= Врем2.Период

СГРУППИРОВАТЬ ПО
    Врем6.Счет,
    Врем6.Контрагент,
    Врем6.Договор,
    Врем6.Период,
    Врем6.СуммаЗайма
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Врем7.Счет,
    Врем7.Контрагент,
    Врем7.Договор,
    Врем7.Период,
    Врем7.СуммаЗайма,
    ЕСТЬNULL(Врем2.ПроцентнаяСтавка, 0) КАК ПроцентнаяСтавка
ПОМЕСТИТЬ Врем8
ИЗ
    Врем7 КАК Врем7
        ЛЕВОЕ СОЕДИНЕНИЕ Врем2 КАК Врем2
        ПО Врем7.Договор = Врем2.Договор
            И Врем7.Период1 = Врем2.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Врем8.Период КАК НачалоПериода,
    МИНИМУМ(ЕСТЬNULL(ДОБАВИТЬКДАТЕ(Врем81.Период, СЕКУНДА, -1), &КонецПериода)) КАК КонецПериода,
    Врем8.Счет,
    Врем8.Контрагент,
    Врем8.Договор,
    Врем8.СуммаЗайма,
    Врем8.ПроцентнаяСтавка
ПОМЕСТИТЬ Врем9
ИЗ
    Врем8 КАК Врем8
        ЛЕВОЕ СОЕДИНЕНИЕ Врем8 КАК Врем81
        ПО Врем8.Счет = Врем81.Счет
            И Врем8.Контрагент = Врем81.Контрагент
            И Врем8.Договор = Врем81.Договор
            И Врем8.Период < Врем81.Период

СГРУППИРОВАТЬ ПО
    Врем8.Счет,
    Врем8.Договор,
    Врем8.Контрагент,
    Врем8.Период,
    Врем8.СуммаЗайма,
    Врем8.ПроцентнаяСтавка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Врем9.НачалоПериода КАК НачалоПериода,
    Врем9.КонецПериода,
    Врем9.Счет КАК Счет,
    Врем9.Контрагент КАК Контрагент,
    Врем9.Договор КАК Договор,
    Врем9.СуммаЗайма,
    Врем9.ПроцентнаяСтавка,
    РАЗНОСТЬДАТ(Врем9.НачалоПериода, Врем9.КонецПериода, ДЕНЬ) + 1 КАК РазностьДат,
    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Врем9.НачалоПериода, ГОД), КОНЕЦПЕРИОДА(Врем9.КонецПериода, ГОД), ДЕНЬ) + 1 КАК КоличествоДнейВГодах,
    ВЫРАЗИТЬ(Врем9.СуммаЗайма * Врем9.ПроцентнаяСтавка / 100 * (РАЗНОСТЬДАТ(Врем9.НачалоПериода, Врем9.КонецПериода, ДЕНЬ) + 1) / (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Врем9.НачалоПериода, ГОД), КОНЕЦПЕРИОДА(Врем9.КонецПериода, ГОД), ДЕНЬ) + 1) * (ГОД(Врем9.КонецПериода) - ГОД(Врем9.НачалоПериода) + 1) КАК ЧИСЛО(15, 2)) КАК НачисленныйПроцент
ИЗ
    Врем9 КАК Врем9
ГДЕ
    Врем9.НачалоПериода <> Врем9.КонецПериода
    И Врем9.СуммаЗайма > 0

    
1.    В первом запросе мы производим выборку остатков по суммам займов на протяжении периода. При этом метод дополнения мы выбираем такой, чтобы получить остатки даже если не было движений по займам в течение периода.
2.    Во втором запросе мы делаем выборку процентных ставок, выбирая сначала существующие ставки на начало периода, а затем объединяя это выборку с изменениями процентных ставок в пределах периода. Каждая выборка ограничивается теми договорами, которые были выбраны на первом этапе.
3.    Изменение процентной ставки вызывает дробление периода расчета, т.е., например, если сумма займа постоянна на каком отрезке времени, то изменение процентной ставки внутри этого отрезка времени делит этот отрезок времени на две части, двукратное изменение внутри  этого отрезка на три части и т.д.. Поэтому мы делаем выборку тех дат изменения процентных ставок, которые внутри периода отчета и находим ближайшие к ним значения сумм займов, счетов, контрагентов.
4.    В четвертом запросе мы учитываем, что период отчета может быть лежать в разных годах, т.е., например, отрезок времени должен поделиться на такие отрезки: Дата1-КонецГода(Дата1), Начало следующего года-Дата2/Конец н-го года.
5.    К четвертому запросу добавляем, где мы получаем начала следующих годов, добавляем суммы займов.
6.    Объединяем все полученные данные.
7.    Запросы 7 и 8 позволяют вычислить недостающие значения процентных ставок.
8.    Запрос 9 формирует периоды для расчетов.
9.    Последний запрос вычисляет суммы процентов. Оператор Выразить используется для округления.
Если интервал представляет собой кратное количество лет, то умножается на количество лет, если нет, то на 1.

Прилагается выгрузка с тестовыми примерами, отчет сделанный с помощью СКД "Отчет по начисленным процентам", призванные показать алгоритм.

См. также

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    152621    836    398    

846

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

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

16.08.2024    6911    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2118    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    7322    implecs_team    6    

46

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3212    andrey_sag    10    

35

Запросы СКД Программист Стажер Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    7344    KawaNoNeko    23    

26

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2997    3    Yashazz    0    

34
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Boroda 90 26.12.11 22:54 Сейчас в теме
Как я понимаю, это будет работать в Бухгалтерии лишь? Или для ЗУП тоже подойдёт?
2. gutentag 253 27.12.11 02:07 Сейчас в теме
(1) Ну вряд ли, работодатели или главбухи захотят в ЗУПе давать/оформлять займы с "плавающими ставками" и мыкаться с расчетом мат.выгоды.
Но чисто теоретически, вопрос поставлен верно :)
3. gutentag 253 27.12.11 02:09 Сейчас в теме
(1)
ВЫБРАТЬ
РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.Счет КАК Счет,


имхо судя по этой строке, без доработки напильником в ЗУПе врядли заработает...................................................................................
4. vvf1973 9 27.12.11 08:07 Сейчас в теме
(1)
Историю хранения остатков по выданным займам или полученным вы можете хранить/получать как сочтете нужным, т.е. Вам любым удобным способом надо получить историю остатков, где указываются вид займа(выданный, полученный), разрезы учета займа(договор и контрагент/сотрудник, может еще какие-то разрезы), дата изменения займа, сумма займа. Метод, указанный в статье, имхо, по сути универсален.
5. Boroda 90 27.12.11 21:49 Сейчас в теме
(1) Вот как раз столкнулся с необходимостью ведения подобного начисления и уплаты займов в зарплате. Дело в том, что при займе должна также расчитываться мат.выгода и НДФЛ с неё, а это удобнее делать в зарплатных программах для того, чтобы годовой отчёт по НДФЛ формировался автоматически. Ну, а поскольку в обычных организациях (ну, в очень простых, где сотрудникам платится лишь оклад да премия, болеть нельзя и т.п. - можно зарплату считать и в Бухгалтерии) НДФЛ считается в ЗУП (ЗиК), то целесообразно и займ считать в них. Но стандартный займ и расчёт его погашения очень "жёсткий", и не всегда удобен, особенно, когда сотр склонен платить нерегулярно, а подобный расчёт как раз отличается гибкостью.
(4) Спасибо, я понял, что можно попробовать использовать применительно к ЗУП сам метод, а обработка под Бухгалтерию.
6. gutentag 253 28.12.11 10:24 Сейчас в теме
(5) если получится, то поделитесь, пжст, результатом - очень надо для ЗУП-8
-----------------------------------------------------------------------------------------------------------------

(4) т.к. я бухгалтер, а не программер, то я никогда не понимал и не понимаю: зачем надо вносить изменеия в конфигураторе, если можно сделать все в обработке, а дополнительные сведения и регистры хранить во внешнем/их файлах(формат файла по-вкусу). Тем более что расчет процентов по займам/кредитам = имхо делается раз в месяц(но в любом случае быстродействие системы/конфигурации бухгалтеру для такой операции тут не потребуется). ИМХО.

ставлю плюс только за решение посталенной задачи/идеи
7. sps02 21.07.14 16:59 Сейчас в теме
Здравствуйте. По скрину видно что только в 1С 8.3 работает??Верно?
8. vvf1973 9 24.07.14 16:55 Сейчас в теме
(7)
Управляемые формы работают и на 8.2. Сам алгоритм - это запрос и не зависит от режима (обычные или управляемые формы)
Оставьте свое сообщение