() Спасибо! Перегнал ваш код в 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;//из метода золотого сечения
КонецЕсли;
КонецЦикла;
Возврат ПСК;
КонецФункции
Показать