Расчет ЧИСТВНДОХ в 1С 8

Обработка расчета, аналогичная ЧИСТВНДОХ в excel
Очень поможет всем МФО (микрофинансовым организациям)
ЧИСТВНДОХ  — функция excel, которая возвращает внутреннюю ставку доходности для графика денежных потоков, которые не обязательно носят периодический характер.
Этот алгоритм — результат переработки алгоритма на VBA.
Этот сайт мне показала справка моего excel.
http://www.programmersforum.ru/showthread.php?t=97344
Подобные расчеты пригодятся всем, чья деятельность связана с МФО, т.к. с 01.07.14 вступает в полную силу закон о потребительских кредитах, предоставляемых физическим лицам (Федеральный закон от 21.12.2013 N 353-ФЗ «О потребительском кредите (займе)»)

4 Comments

  1. gull22

    За труды плюс.

    Reply
  2. Enya_06

    Отлично! Полезный и важный труд!

    Reply
  3. ag.baranov

    Оптимизированный код для 7.7

    Функция Экспонента(Х)
    Р=1;
    Дельта=1;
    К=1;
    Пока ?(Дельта>0,Дельта,-Дельта)>0.000001 Цикл
    Дельта=Дельта*Х/К;
    К=К+1;
    Р=Р+Дельта;
    КонецЦикла;
    Возврат окр(Р,5);
    КонецФункции
    
    Функция степень(а,в)
    возврат Экспонента(Лог(а)*в);
    КонецФункции
    
    Функция Отклонение(Предп)
    Р = -СуммаЗайма;
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
    Р = Р + Всего / Степень(1 + Предп,(ДатаПлатежа — ДатаДок)/365);
    КонецЦикла;
    Возврат Р
    КонецФункции
    
    Функция ЧИСТВНДОХ()
    Если СуммаЗайма = 0  Тогда
    Возврат 0;
    КонецЕсли;
    Если КоличествоСтрок() = 0 Тогда
    Возврат 0
    КонецЕсли;
    Переплата = (Итог(«Всего») / СуммаЗайма);
    ПолучитьСтрокуПоНомеру(КоличествоСтрок());
    Лет = (ДатаОкончания — ДатаДок) / 365;
    Предп = Степень(Переплата,2/Лет) — 1; //начальная оценка ставки
    
    Р = Отклонение(Предп);
    Если Р > 0 Тогда
    Шаг = 0.382 * Предп;
    Иначе
    Шаг = -0.382 * Предп;
    КонецЕсли;
    Точность = 0.00001;
    Пока (Шаг < -Точность) ИЛИ (Шаг > Точность) Цикл
    Предп = Предп + Шаг;
    Р = Отклонение(Предп);
    Если Р * Шаг < 0 Тогда
    Шаг = -Шаг * 0.382;//из метода золотого сечения
    КонецЕсли;
    КонецЦикла;
    Возврат Предп;
    КонецФункции
    

    Показать

    Reply
  4. unichkin

    (3) Спасибо! Перегнал ваш код в v8, работает быстрее чем алгоритм публикации

    // Реализация функции Excell «ЧИСТВНДОХ»
    //
    //Параметры:
    // ТаблицаИсточник — ТаблицаЗначений
    // ИмяКолонкиПериод — Число
    // ИмяКолонкиСумма — Строка
    // Точность — Число
    //
    //Возвращаемое значение:
    // Число
    //
    Функция ЧИСТВНДОХ(ТаблицаИсточник, ИмяКолонкиПериод = «Период», ИмяКолонкиСумма = «Сумма», Точность = 0.0001)
    
    Если ТаблицаИсточник.Итог(ИмяКолонкиСумма) = 0 Тогда
    Возврат 0;
    КонецЕсли;
    
    ТаблицаРасчета = Новый ТаблицаЗначений;
    ТаблицаРасчета.Колонки.Добавить(«Дата»);
    ТаблицаРасчета.Колонки.Добавить(«РазностьДат»);
    ТаблицаРасчета.Колонки.Добавить(«Сумма»);
    
    ПерваяДата = НачалоДня(ТаблицаИсточник[0][ИмяКолонкиПериод]);
    
    Для каждого СтрокаИсточник Из ТаблицаИсточник Цикл
    ТекДата = СтрокаИсточник[ИмяКолонкиПериод];
    
    СтрокаРасчета = ТаблицаРасчета.Добавить();
    СтрокаРасчета.Дата = ТекДата;
    СтрокаРасчета.РазностьДат = (НачалоДня(ТекДата) — ПерваяДата) / (24 * 60 * 60) / 365;
    СтрокаРасчета.Сумма = СтрокаИсточник[ИмяКолонкиСумма];
    КонецЦикла;
    
    ПСК = 0.1;
    Сумма = 0;
    Для каждого СтрокаРасчета Из ТаблицаРасчета Цикл
    Сумма = Сумма + СтрокаРасчета.Сумма / Pow(1 + ПСК, СтрокаРасчета.РазностьДат)
    
    КонецЦикла;
    
    Если Сумма > 0 Тогда
    Шаг = 0.382 * ПСК;
    Иначе
    Шаг = -0.382 * ПСК;
    КонецЕсли;
    
    Пока (Шаг < -Точность) ИЛИ (Шаг > Точность) Цикл
    ПСК = ПСК + Шаг;
    Сумма = 0;
    Для каждого СтрокаРасчета Из ТаблицаРасчета Цикл
    Сумма = Сумма + СтрокаРасчета.Сумма / Pow(1 + ПСК, СтрокаРасчета.РазностьДат)
    
    КонецЦикла;
    Если Сумма * Шаг < 0 Тогда
    Шаг = -Шаг * 0.382;//из метода золотого сечения
    КонецЕсли;
    КонецЦикла;
    Возврат ПСК;
    КонецФункции
    

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *