Как распределять по базе в 1С
Nov. 28th, 2012 02:31 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Есть такая частая бухгалтерская задача: распределение по базе. Эти слова означают, что сумму или список (выборку, обычно) сумм нужно разделить между другим списком пропорционально долям.
Есть код, который я использую уже почти год, хочу им поделиться.
Сначала код:
CC-SA
Теперь объяснения:
Есть несколько проблем в распределении по базе:
1. Сделать так чтобы сумма получившихся чисел была расна изначальной сумме.
2. Применить стратегию округления.
3. Применить стратегию распределения остатков округления (а они будут).
Тут я пожалуюсь на 1С: система прекрасная за счет объектой базы данных. Язык -- ужасный: как раз объектов и нет. Все остальные достижения языков программирования тоже прошли мимо. Встроенные и конфигурируемые объекты, из-за этого Java-шпагетти-style.
Тем не менее, можно применить процедурный подход. Например, как код выше. :) Возможно непонятно что такое общее: я объяснюю.
Вызов функции выглядит так (на каждое исходное число): ОбщаяСумма = ЗаписатьНаПроцентИВозвратитьОбщее(ИсходнаяСумма, ЗначениеДляЗаписи, Доля, ВДанномСлучаеОбыно2НоМожетБытьИМинус6, ОбщаяСумма).
В Общем аккамулируется остаток округления. Далается это при потоковой обработке данных, так что нет необходимости презагружать выборку для пересчета.
Почему общее упоминается два раза? Это нестандартный подход, поэтому я считаю, что изменение Общего в функции должно быть выделено в соответствии с хорошем стилем кода.
Также потоково считается к какому элементу будет прибавляться Общее (то есть остаток округления) по окончанию обработки. Тут, если речь идет о регистре бухгалтерии, я рекомендую сделать отдельную проводку с пометкой "остатки окгругления". Хорошим бухгалтерам нравиться, проверено.
Что же?
1. Первая проблема решена, что само по себе самое главное в бухгалтерии (ну или кому как, есть варианты, короче).
2. Стратегию окгруления можно ставить, передавая параметр, к сожалению, если округление зависит от получившихся чисел, потоково посчитать не получается (в остальных случаях, ничего сложного нет).
3. Применение стратегии распределения остатков округления становиться легким, поскольку остаток аккамулируются в переменной.
Keeks.
PS расчет доли разделен на две строчки для удобства отладки: во второй строчке -- неявное преобразование с возможной потерей данных.
Есть код, который я использую уже почти год, хочу им поделиться.
Сначала код:
CC-SA
Функция ЗаписатьНаПроцентИВозвратитьОбщее(Откуда, Куда, Доля, ЗнаковОкругления, Знач Общее = 0) Значение = Окр(Откуда * Доля, ЗнаковОкругления); Куда = Значение; Возврат Общее - Куда; КонецФункции
Теперь объяснения:
Есть несколько проблем в распределении по базе:
1. Сделать так чтобы сумма получившихся чисел была расна изначальной сумме.
2. Применить стратегию округления.
3. Применить стратегию распределения остатков округления (а они будут).
Тут я пожалуюсь на 1С: система прекрасная за счет объектой базы данных. Язык -- ужасный: как раз объектов и нет. Все остальные достижения языков программирования тоже прошли мимо. Встроенные и конфигурируемые объекты, из-за этого Java-шпагетти-style.
Тем не менее, можно применить процедурный подход. Например, как код выше. :) Возможно непонятно что такое общее: я объяснюю.
Вызов функции выглядит так (на каждое исходное число): ОбщаяСумма = ЗаписатьНаПроцентИВозвратитьОбщее(ИсходнаяСумма, ЗначениеДляЗаписи, Доля, ВДанномСлучаеОбыно2НоМожетБытьИМинус6, ОбщаяСумма).
В Общем аккамулируется остаток округления. Далается это при потоковой обработке данных, так что нет необходимости презагружать выборку для пересчета.
Почему общее упоминается два раза? Это нестандартный подход, поэтому я считаю, что изменение Общего в функции должно быть выделено в соответствии с хорошем стилем кода.
Также потоково считается к какому элементу будет прибавляться Общее (то есть остаток округления) по окончанию обработки. Тут, если речь идет о регистре бухгалтерии, я рекомендую сделать отдельную проводку с пометкой "остатки окгругления". Хорошим бухгалтерам нравиться, проверено.
Что же?
1. Первая проблема решена, что само по себе самое главное в бухгалтерии (ну или кому как, есть варианты, короче).
2. Стратегию окгруления можно ставить, передавая параметр, к сожалению, если округление зависит от получившихся чисел, потоково посчитать не получается (в остальных случаях, ничего сложного нет).
3. Применение стратегии распределения остатков округления становиться легким, поскольку остаток аккамулируются в переменной.
Keeks.
PS расчет доли разделен на две строчки для удобства отладки: во второй строчке -- неявное преобразование с возможной потерей данных.