.n Начисление амортизации линейным методом 
.a 
.d 03333
.s
;Загружаем описания счетов
@dzzs("dz/sv/dzaos_ps.txt")
;Загружаем массив проводок
@dzzp("dz/sv/dzaos_mp.txt")

::Начисление амортизации линейным методом
@dzvp("")
@dzdis("s:ТокСтанокZ")
@dzdis("s:ШлифСтанокW")

.alm
*Начисление амортизации за месяц
# ds ks sp np
return(vm('alx',ds,ks,sp,np,1))
.alk
*Начисление амортизации за квартал
# ds ks sp np
return(vm('alx',ds,ks,sp,np,4))
.alg
*Начисление амортизации за год
# ds ks sp np
return(vm('alx',ds,ks,sp,np,12))
.alx
# ds ks sp np km
*Модуль начисления амортизации линейным методом за заданное число месяцев
*ds - дебетуемый счет (счёт списания затрат)
*ks - кредитуемый счёт (счёт накопления амортизации)
*sp - $alm, $alk или $alg
*np - (количество в натуральном выражении) не имеет значения для алгоритма 
*km - количество месяцев, за которые начисляется амортизация

*Получаем код счёта амортизируемого объекта
*Счёт начисления амортизации должен отличаться от него ЛЮБЫМ одним дополнительным символом в конце кода
*Просто отбрасываем последний символ
so=substr(ks,0,-1) 
*Текущая стоимость объекта может отличаться от первоначальной переоценками, осуществляемыми 
*проводками по дебету (увеличение) или кредиту (уменьшение) стоимости объекта
*Поэтому амортизируемая стоимость равна текущему остатку счёта данного объекта     
*Получаем обороты и остатки счёта объекта на текущий момент ДО формирования проводки 
z=dzoot(so) 
*Амортизируемая стоимость
as=z('oss') 
* Получаем обороты и остатки счёта накопленной амортизации объекта на текущий момент ДО формирования проводки 
z=dzoot(ks) 
*Поскольку счёт всегда кредитуется, то его остаток отрицателен
na=abs(z('oss'))
*Остаточная стоимость  
os=as-na 
*Если накопленная амортизация с точностью до погрешности вычислений равна амортизируемой стоимости,
*то ничего не начисляем и проводка не будет сформирована
if abs(os)<0.01 
    return(false())     
end    
*Если ранее были выполнены какие-то ошибочные проводки по начислению амортизации свыше стоимости объекта,
*то убираем переначисленную амортизацию по кредиту счёта списания затрат и дебету счёта амортизации
*на сумму переначисления
if os<0 
    r(0,'d')=ks
    r(0,'k')=ds
    r(0,'s')=abs(os) 
    return(r)
end
*Рассчитываем амортизацию
*Выбираем годовую норму амортизации из свойства счёта начисления или свойства счёта самого объекта
*Это свойство должно иметь имя na
*Сначала пытаемся найти в атрибуте na счёта начисления амортизации
gna=dzpzas(ks,'na')
*Если атрибут na отсутствует, то ищем его на счёте самого объекта
if nz(gna)
    gna=dzpzas(so,'na')  
end
*Если и тут не найдено (нет значения - NULL), то возвращаем NULL
if nz(gna) 
    return(gna)
end    
*Вычисляем амортизацию линейным методом с учётом заданного числа месяцев 
*Норма задана в процентах!!! 
sa=as*gna*km/1200    
*Возвращаем скаляр, который будет подставлен как сумма проводки 
return(sa)