Эффективная ставка, которая зависела от числа нажатий "Заполнить"
Иван Недомолков · Dərc edilib: · Yenilənib:
В учёте ценных бумаг страховой компании есть ежедневная рутина: амортизация премии по облигациям, удерживаемым до погашения, - расчёт по эффективной ставке. Рутина, которая должна давать одну и ту же цифру, сколько раз её ни пересчитывай.
В этой истории она давала разные. Первое заполнение документа - 40,79 при эталоне бухгалтерии 40,787. Почти точно, можно списать на округление. Повторное нажатие “Заполнить” в том же документе - уже 42,88. А на следующий день вместо ожидаемых 40,335 расчёт выдал 3,72 - ошибку уже не в третьем знаке, а в десять раз.
Эта статья - о том, как устроена такая ошибка, почему она самая коварная из учётных, и как выглядит честная приёмка исправления. Читается без знания 1С.
Почему цифра “плавала”
Расчёт эффективной ставки должен опираться на неизменные исходные данные: первоначальную премию при покупке бумаги. А эта процедура опиралась на текущее сальдо премии - величину, которую сама же и меняла.
Проведёшь документ - сальдо изменилось. Нажмёшь “Заполнить” ещё раз - расчёт стартует уже с новой точки и даёт другую сумму. На следующий день сальдо уехало ещё дальше - и расчёт вместе с ним. Система с обратной связью на саму себя: каждая итерация подтачивает базу для следующей.
Вторая половина беды - расчёт за предыдущий день выполнялся не всегда, а при особом условии (нулевой доходности при покупке). Поэтому перезаполнение шло другой веткой кода, чем первое заполнение, - отсюда 40,79 против 42,88 в одном и том же документе.
Чем такая ошибка опасна
Тем, что её почти невозможно поймать регламентными средствами:
- Оборот сходится. Никакие контрольные соотношения не краснеют - суммы просто неверные.
- Ошибка не воспроизводится. Бухгалтер жалуется “вчера считало не так” - программист нажимает “Заполнить”, получает третью цифру и разводит руками.
- Каждый день по чуть-чуть. Амортизация - ежедневная. Небольшое расхождение, помноженное на портфель облигаций и месяцы, превращается в ощутимое искажение в отчётности - а страховую отчётность читает регулятор.
Если у вас в учёте есть цифра, которая “меняется от пересчёта”, - это не мистика и не “особенности 1С”. Это расчёт, который где-то опирается на собственный результат. Он не починится сам.
Как чинили - и как принимали
Процедуру расчёта заменили целиком, с тремя исправлениями: опора на первоначальную премию покупки вместо текущего сальдо, безусловное выполнение первого прохода для бумаг “до погашения”, отказ от подстановки начального баланса.
Интереснее всего здесь приёмка. Как доказать бухгалтерии, что теперь считается правильно? Договорились о честном критерии:
- Три последовательных дня расчёт должен совпасть с эталоном, посчитанным бухгалтерией вручную. Совпали: 40,787 / 40,335 / 39,883 - до третьего знака.
- Повторное нажатие “Заполнить” не должно менять сумму. Проверено: не меняет, сколько ни нажимай.
Второй пункт - прямой тест на исходную болезнь: если расчёт больше не зависит от числа нажатий, значит, обратная связь разорвана.
Что из этого стоит забрать себе
- Если цифра в документе меняется от повторного заполнения - у вас расчёт с опорой на собственный результат. Это дефект, а не особенность.
- Принимайте исправления расчётов по эталону на нескольких последовательных периодах, а не по одному “вроде сошлось”.
- В тест приёмки включайте повторное выполнение: правильный расчёт идемпотентен - сколько ни пересчитывай, сумма одна.
Мы сопровождаем учёт ценных бумаг в страховых как постоянное направление - амортизация, эффективная ставка, купоны, переоценка, партионный учёт. Эта история - одна из 46 работ четырёхмесячного кейса сопровождения; чем ещё занимаемся - на странице 1С для страховых компаний.