pigmeich: (Default)
[personal profile] pigmeich
Есть такая частая бухгалтерская задача: распределение по базе. Эти слова означают, что сумму или список (выборку, обычно) сумм нужно разделить между другим списком пропорционально долям.

Есть код, который я использую уже почти год, хочу им поделиться.

Сначала код:

CC-SA

Функция ЗаписатьНаПроцентИВозвратитьОбщее(Откуда, Куда, Доля, ЗнаковОкругления, Знач Общее = 0)
	Значение = Окр(Откуда * Доля, ЗнаковОкругления);
	Куда = Значение;
	Возврат Общее - Куда;
КонецФункции


Теперь объяснения:

Есть несколько проблем в распределении по базе:
1. Сделать так чтобы сумма получившихся чисел была расна изначальной сумме.
2. Применить стратегию округления.
3. Применить стратегию распределения остатков округления (а они будут).

Тут я пожалуюсь на 1С: система прекрасная за счет объектой базы данных. Язык -- ужасный: как раз объектов и нет. Все остальные достижения языков программирования тоже прошли мимо. Встроенные и конфигурируемые объекты, из-за этого Java-шпагетти-style.

Тем не менее, можно применить процедурный подход. Например, как код выше. :) Возможно непонятно что такое общее: я объяснюю.

Вызов функции выглядит так (на каждое исходное число): ОбщаяСумма = ЗаписатьНаПроцентИВозвратитьОбщее(ИсходнаяСумма, ЗначениеДляЗаписи, Доля, ВДанномСлучаеОбыно2НоМожетБытьИМинус6, ОбщаяСумма).

В Общем аккамулируется остаток округления. Далается это при потоковой обработке данных, так что нет необходимости презагружать выборку для пересчета.

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

Также потоково считается к какому элементу будет прибавляться Общее (то есть остаток округления) по окончанию обработки. Тут, если речь идет о регистре бухгалтерии, я рекомендую сделать отдельную проводку с пометкой "остатки окгругления". Хорошим бухгалтерам нравиться, проверено.

Что же?
1. Первая проблема решена, что само по себе самое главное в бухгалтерии (ну или кому как, есть варианты, короче).
2. Стратегию окгруления можно ставить, передавая параметр, к сожалению, если округление зависит от получившихся чисел, потоково посчитать не получается (в остальных случаях, ничего сложного нет).
3. Применение стратегии распределения остатков округления становиться легким, поскольку остаток аккамулируются в переменной.

Keeks.

PS расчет доли разделен на две строчки для удобства отладки: во второй строчке -- неявное преобразование с возможной потерей данных.

Profile

pigmeich: (Default)
pigmeich

June 2017

S M T W T F S
    1 23
4 5678910
11121314151617
18192021222324
252627282930 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 29th, 2025 10:17 am
Powered by Dreamwidth Studios