IE 2016

Честное распределение суммы по таблице значений (3.1.4.1)

Опубликовал alexk-is в раздел Программирование - Практика программирования

Варианты "честного" распределения суммы по таблице значений (табличной части)
Только качественный контент

Вы, наверное замечали, что при большом количестве строк распределяемая сумма распределяется не "по честному".

В данной обработке приведены несколько методов распределения суммы по таблице значений. При изменении суммы распределения и порядка строк базы можно получать совершенно разные результаты.«Охрана труда» для 1С:Предприятия 8.2

Распределение сумм по таблице значений


Вариант 1. "Стандартный" с отнесением не распределенных сумм на последнюю строку. Чаще всего встречается в программах 1С.

Вариант 2. "По эффективному остатку". Остаток округления распределяется повторно по новому коэффициенту на столько строк сколько осталось копеек. Пока все остатки не распределятся. При этом выбираются строки с наибольшей базой.

Вариант 3. "С пересчетом базы распределения". Строки сортируются по базе распределения. После распределения по строке уточняется база распределения для последующих строк. Работает сравнительно быстро с учетом объема математики.

Вариант 4. "Статистический". Как мне кажется наиболее точный. Остаток округления распределяется на столько строк сколько осталось копеек. При этом выбираются строки с наибольшей погрешностью в округлении. Реализован несколькими способами, в т.ч. с использованием всего одного пакетного запроса.

Колонка "Сумма" рассчитана с использованием коэффициента. С математической точки зрения результат правильный, но распределена не вся сумма из за ошибок округления. Колонка "Сумма 4" рассчитана с использованием 4 варианта. Как видите погрешность в расчетах, возникающая при округлении, полностью устранена, а результат наиболее близок к "математическому", т.е. при проверке по строкам мы будем получать минимальную погрешность в округлении.

Процедурки можно легко прикрутить к любой таблице значений или табличной части. Примеры вызовов внутри.

Для четвертого варианта есть четыре реализации: по таблице значений, по табличной части и по таблице значений через запросы. 


Примеры использования для типовых конфигураций 1С:Предприятия 8.1

В обработке ОбработкаТабличнойЧастиТовары изменил процедуру РаспределитьСуммуПоКолонке. Исправлены ошибки распределения сумм типовых конфигураций.

  • Пример использования в УТ на базе типовой обработки из версии 10.3.6.8
  • Пример использования в УПП на базе типовой обработки из версии 1.2.21.1
  • Пример использования в БП на базе типовой обработки из версии 1.6.14.4


Примеры использования для типовых конфигураций 1С:Предприятия 7.7

В обработке ГрупповаяОбработкаМнЧДокументов изменил функцию РаспределитьСуммуПоКолонке и обработку константы РозничныйТипЦен в процедуре ПересчитатьСтрокуТаблицы. Работает "правильнее" (исправлены ошибки) и быстрее типовой.

  • Пример использования в ТиС на базе типовой обработки из версии 7.70.954
  • Пример использования в Комплексной на базе типовой обработки из версии 7.70.487

Обработки для ТиС и Комплексной абсолютно одинаковые, поэтому можно использовать любой архив.


Инструкция по установке для 1С:Предприятия 7.7

Для установки обработок в конфигурации 1С:Предприятия 7.7 можно использовать следующий порядок действий:

  1. Проверить соответствие версии конфигурации и обработки. 7.70.954
  2. Скачать с сайта обработку и сохранить, например, на рабочий стол
  3. Запустить 1С:Предприятие 7.7 в режиме "Конфигуратор" и выбрать соответствующую базу
  4. Сделать архивную копию. В меню "Администрирование" - "Сохранить данные..." указать имя файла архива, например: db_20090220-1512.zip
  5. Открыть конфигурацию. В меню "Конфигурация" - "Открыть конфигурацию"
  6. В дереве конфигурации выделить строку "Обработки" - "ГрупповаяОбработкаМнЧДокументов"
  7. В меню "Действия" - "Внешний отчет(обработка)" - "Заменить на внешний отчет(обработку)..." и указать имя скаченного файла на рабочем столе
  8. Сохранить конфигурацию. В меню "Файл" - "Сохранить"
  9. Закрыть конфигуратор и запустить базу в режиме 1С:Предприятия
  10. Проверить работу обработки в документе реализация с заполненными строками. Нажать кнопку "Действия..." - "Изменить спецификацию". Сменить режим работы "Установить ставку НДС" на "Распределить сумму по суммам". Ввести сумму. Нажать "Выполнить". Проверить результат

 

[03.11.2008] Добавлен вариант 4 (самый "честный"
[09.11.2008] Пример для УТ 8.
[10.11.2008] Пример для ТиС 7.
[06.01.2009] Пример для УПП 8.
[16.01.2009] Пример для БП 8.1

Файлы

Наименование Файл Версия Размер Кол. Скачив.
Распределение сумм по таблице значений (3.1.4.1)
.epf 20,05Kb
22.11.13
1209
.epf 20,05Kb 1209 Скачать
ОбработкаТабличнойЧастиТовары для УПП 1.2
.1231240790 54,73Kb
22.11.13
188
.1231240790 54,73Kb 188 Скачать
ОбработкаТабличнойЧастиТовары для БП 1.6
.1232111211 38,70Kb
22.11.13
197
.1232111211 38,70Kb 197 Скачать
ОбработкаТабличнойЧастиТовары для УТ 10.3
.1226181377 51,84Kb
22.11.13
319
.1226181377 51,84Kb 319 Скачать
ГрупповаяОбработкаМнЧДокументов для Комплексной 4.2
.1236084208 34,54Kb
22.11.13
95
.1236084208 34,54Kb 95 Скачать
ГрупповаяОбработкаМнЧДокументов для ТиС 9.2
.1226328763 24,56Kb
22.11.13
258
.1226328763 24,56Kb 258 Скачать

См. также

Лучшие комментарии

33. alexk-is 23.03.2012 00:37
(29) Про погрешность. Считаем по строкам сумму отклонений от "идеальной", т.е. максимально математически точную:
БазаПоСтроке * СуммаДляРаспределения / ВсегоБаза
На 3000 строк раскидываем 10 рублей

Вариант 1. Сумма отклонений: 2,20999953732376972592242046022
Вариант 2. Сумма отклонений: 1,2641759109412526656930230297
Вариант 3. Сумма отклонений: 0,63393937726647997736821462216
Вариант 4. Сумма отклонений: 0,3776659164007059985008264175
Ваш вариант. Сумма отклонений: 2,73341800769621530044471409828

Вариант 5 дает с 10 рублей 2.73 рубля отлонений от "идеальной".
Да, конечно, во всех 5 вариантах распределяютя все 10 рублей до копеечки. Но поделить-то можно по разному - поровну, по чесному или просто свалить всё на одну строку.
Ответили: (34) (60)
# Ответить

Комментарии

1. seermak 31.10.2008 16:05
у меня есть что-то подобное ( при расчете сумм выслуги дается определенная сумма на организацию и надо ее всем распределить, ключая проценты снижения, и разные коэффициенты в зависимости от стажа работы). если интересно могу поделиться
Ответили: (61)
# Ответить
2. Shaman100M 01.11.2008 16:22
у меня тоже, правда для семерки, третий вариант.
http://infostart.ru/profile/8196/projects/840/
# Ответить
3. alexk-is 03.11.2008 16:06
Добавил еще один вариант. Назвал условно "Статистический". Методика распределения направлена на снижение средней ошибки округления, путем корректировки строк с наибольшей ошибкой (отклонением) при округлении.
Вариант реализации с запросом работает эффективно только при большом количестве строк (более нескольких десятков тысяч).
Ответили: (58)
# Ответить
4. Трактор 04.11.2008 22:07
Прикольно. Плюс за постановку вопроса.
# Ответить
5. alexk-is 09.11.2008 01:17
Добавил пример использования в УТ на базе типовой обработки из версии 10.3.6.8. В обработке ОбработкаТабличнойЧастиТовары изменил процедуру РаспределитьСуммуПоКолонке.
Для использования можно заменить или процедуру РаспределитьСуммуПоКолонке, или целиком обработку ОбработкаТабличнойЧастиТовары.
# Ответить
6. alexk-is 10.11.2008 18:03
Добавил пример использования в ТиС на базе типовой обработки из версии 7.70.954. В обработке ГрупповаяОбработкаМнЧДокументов изменил функцию РаспределитьСуммуПоКолонке и обработку константы РозничныйТипЦен в процедуре ПересчитатьСтрокуТаблицы.
Для использования можно заменить или процедуру РаспределитьСуммуПоКолонке, или целиком обработку ГрупповаяОбработкаМнЧДокументов.
# Ответить
7. alexk-is 06.01.2009 14:25
Добавил пример использования в УПП на базе типовой обработки из версии 1.2.9.1. В обработке ОбработкаТабличнойЧастиТовары изменил процедуру РаспределитьСуммуПоКолонке.
Для использования можно заменить целиком обработку ОбработкаТабличнойЧастиТовары или только процедуру РаспределитьСуммуПоКолонке.
# Ответить
8. alexk-is 16.01.2009 16:13
Добавил пример использования в БП на базе типовой обработки из версии 1.6.11.7. В обработке ОбработкаТабличнойЧастиТовары изменил процедуру РаспределитьСуммуПоКолонке.
Для использования можно заменить целиком обработку ОбработкаТабличнойЧастиТовары или только процедуру РаспределитьСуммуПоКолонке.
# Ответить
9. Сафик 20.02.2009 12:28
а можно получить подробную инструкцию добавления отчета для ТиС 9.2? Я не прогаммист и поэтому тяжеловато, а очень нужно :-(
Ответили: (10)
# Ответить
10. alexk-is 20.02.2009 13:16
(9) Это не отчет, а обработка...
1. Проверить соответствие версии конфигурации и обработки. 7.70.954
2. Скачать с сайта обработку и сохранить, например, на рабочий стол
3. Запустить 1С:Предприятие 7.7 в режиме "Конфигуратор" и выбрать соответствующую базу
4. Сделать архивную копию. В меню "Администрирование" - "Сохранить данные..." указать имя файла архива, например: db_20090220-1512.zip
5. Открыть конфигурацию. В меню "Конфигурация" - "Открыть конфигурацию"
6. В дереве конфигурации выделить строку "Обработки" - "ГрупповаяОбработкаМнЧДокументов"
7. В меню "Действия" - "Внешний отчет(обработка)" - "Заменить на внешний отчет(обработку)..." и указать имя скаченного файла на рабочем столе
8. Сохранить конфигурацию. В меню "Файл" - "Сохранить"
9. Закрыть конфигуратор и запустить базу в режиме 1С:Предприятия
10. Проверить работу обработки в документе реализация с заполненными строками. Нажать кнопку "Действия..." - "Изменить спецификацию". Сменить режим работы "Установить ставку НДС" на "Установить сумму по суммам". Ввести сумму. Нажать "Выполнить". Проверить результат
# Ответить
11. alexk-is 20.02.2009 13:24
+10 Не "Установить сумму по суммам", а "Распределить сумму по суммам" - опечатался...
# Ответить
12. Сафик 20.02.2009 13:35
спасибо, все получилось
# Ответить
13. Shaman100M 20.02.2009 14:59
Основательно
# Ответить
14. LS 16.04.2009 20:49
В качестве примера, думаю, пригодится, спасибо!
# Ответить
15. alexk-is 19.08.2009 11:08
Добавил распределение одним пакетным запросом для четвертого варианта.
# Ответить
16. RayCon 28.10.2010 02:10
Столько копий на эту тему сломано! Молодец, что взялся за решение проблемы!

Вот только остался открытым вопрос: а как правильно? :D
Было бы идеально, если ещё были бы даны рекомендации по применению каждого метода и озвучены ограничения на применение. И особенно важно осветить проблему не просто с точки зрения математики, а спроецировать математику на бухгалтерию и разобрать примеры с учётом сумм НДС.
Ответили: (19)
# Ответить
17. Worst 03.11.2010 14:26
Особенно интересно когда перегружаешь валютные документы в рублевые или наоборот...Спасибо автору за классификацию! Если бы еще бухгалтера могли понять это в своей массе! а то может случиться непонятка.
# Ответить
18. Worst 03.11.2010 15:34
Кстати у В Юровицкого - сподвижника Жириновского есть любопытная книженция по этой проблеме. Не то чтобы я с ним соглашаюсь, но там четко обозначается масштаб проблемы и подходы к решению.
# Ответить
19. alexk-is 03.11.2010 16:22
(16) С НДС шутки плохи. Суммы по НДС должны быть такими, как в строках счет-фактур. Любое отклонение - налоговое преступление.

Данное исследование проводилось для коммунальных служб. Всё остальное просто развитие темы.
Ответили: (20)
# Ответить
20. RayCon 03.11.2010 22:49
(19) Ну, так никто и не говорит о преступлении. :)
Речь идёт совсем о другом.

Поставщик оплатил продавцу некую сумму А, в т.ч. НДС=А*18/118. Продавец делает отгрузку из нескольких товарных позиций. Задача такова: каким образом рассчитать в накладной налогооблагаемую базу по НДС и сам НДС, чтобы итоговая сумма отгрузки без НДС была равна значению А*100/118, итоговая сумма НДС - значению А*18/118, а итоговая сумма, включая НДС, - значению А? При этом, естественно, по каждой строке сумма НДС должна составлять положенные по законодательству 18% от налогооблагаемой базы.

Поэтому вопрос о практическом применении предлагаемых алгоритмов можно рассматривать в следующей трактовке: какой из предложенных алгоритмов позволяет "размазать" округления по описанной выше матрице таким образом, чтобы решить поставленную задачу?
# Ответить
21. nika14 18.10.2011 16:44
Здоровенская обработка!
# Ответить
23. svbel85 06.02.2012 15:26
полезный пример , спасибо
# Ответить
25. Кошки рулят 22.03.2012 15:20
Я всегда при распределении делаю так:
СуммаДляРаспределения=1000;
ВсегоБаза=Табл.Итог("База");
Табл.ВыбратьСтроки();
Пока Табл.ПолучитьСтроку() = 1 Цикл
БазаПоСтроке=Табл.База;
РаспределеноПоСтроке=Окр(БазаПоСтроке*СуммаДляРаспределения/ВсегоБаза,2,1);

ВсегоБаза=ВсегоБаза-БазаПоСтроке;
СуммаДляРаспределения=СуммаДляРаспределения-РаспределеноПоСтроке;
КонецЦикла;

В результате никогда не остается никаких хвостов требующих каких-то еще повторных распределений да еще к тому же каких-то "честных". Что я делаю не правильно?
Обработку качать и смотреть западло, но судя по описанию - фуфло галимое.
Ответили: (26) (45) (47) (48)
+ 1 [ OksDallas; ]
− 3 [ awa; K_A_O; Altair777; ]
# Ответить
26. alexk-is 22.03.2012 16:18
(25)
> Я всегда при распределении делаю так:
Это почти вариант 3. Только без сортировки, а значит с большей погрешностью.

> В результате никогда не остается никаких хвостов требующих каких-то еще повторных распределений да еще к тому же каких-то "честных". Что я делаю не правильно?
Не берусь судить. Может быть дорогу переходите в неположенном месте?

> Обработку качать и смотреть западло
Разьве кто-то кого-то заставляет?

> но судя по описанию - фуфло галимое.
Ну, что же еще можно было ожидать от того, кто за два года не написал ни одного позитивного комментария и сам ничего так и не опубликовал...
Ответили: (27) (28) (45)
# Ответить
27. Кошки рулят 22.03.2012 17:25
(26) alexk-is, Не знаю что там в почти третьем варианте, да, собственно, и знать не хочу.
Мой вариант не требует никакой сортировки и не дает никаких погрешностей.
А если какие-то третьи варианты их дают, значит это фуфловые варианты и тратить время на эту обработку - это значит не уважать себя ...
− 1 [ Altair777; ]
# Ответить
28. Altair777 22.03.2012 18:36
(26) alexk-is,
Ну, что же еще можно было ожидать от того...

Верное замечание :) Тем более, что человек просто не понимает значения слова погрешность.
Метод, описанный в 25, не дает хвостов просто потому что он не может дать. Вся сумма будет распределена, но их погрешности могут быть большими.

А ведь даже самый лучший и "честный" метод может иметь непозволительные результаты.
Простой пример: распределить 3 коп на 2 строки, в каждой из которых по 1 коп. Точность - 1 коп.
Ответили: (29) (36) (49)
# Ответить
29. Кошки рулят 22.03.2012 18:53
(28) Altair777, Сдается мне, что это ты не понимаешь значение слова "погрешность". Понятие погрешность в данном контексте вообще бессмысленно.
Автор этой глупой обработки жонглирует какими-то псевдонаучными понятиями, а толпа лохов внимает изобретателю свинтопрульного аппарата ...
Ответили: (30) (33)
− 1 [ SirYozha; ]
# Ответить
30. Altair777 22.03.2012 19:14
(29) Кошки рулят,
Понятие погрешность в данном контексте вообще бессмысленно.

я же говорил - не понимаешь :)))
Ответили: (31)
# Ответить
33. alexk-is 23.03.2012 00:37
(29) Про погрешность. Считаем по строкам сумму отклонений от "идеальной", т.е. максимально математически точную:
БазаПоСтроке * СуммаДляРаспределения / ВсегоБаза
На 3000 строк раскидываем 10 рублей

Вариант 1. Сумма отклонений: 2,20999953732376972592242046022
Вариант 2. Сумма отклонений: 1,2641759109412526656930230297
Вариант 3. Сумма отклонений: 0,63393937726647997736821462216
Вариант 4. Сумма отклонений: 0,3776659164007059985008264175
Ваш вариант. Сумма отклонений: 2,73341800769621530044471409828

Вариант 5 дает с 10 рублей 2.73 рубля отлонений от "идеальной".
Да, конечно, во всех 5 вариантах распределяютя все 10 рублей до копеечки. Но поделить-то можно по разному - поровну, по чесному или просто свалить всё на одну строку.
Ответили: (34) (60)
# Ответить
34. Кошки рулят 23.03.2012 02:41
(33) alexk-is, (33) Бред сивой кабылы в ясную лунную ночь ...
Ответили: (35)
− 3 [ manlak; SirYozha; Altair777; ]
# Ответить
35. alexk-is 23.03.2012 07:18
(34) Серьёзный аргумент. А я уж было подумал, что претензии действительно серьёзные и придется что-то долго и нудно объяснять. А так просто смотрим картинку и считаем по строке 3043 для варианта 5.
БазаПоСтроке * СуммаДляРаспределения / ВсегоБаза
Расчет по варианту 5:
2 * 10 / 4754944.94 = 0.01
Расчет по формуле в табло 1С:
2 * 10 / 4754944.94 = 0.000004206147547946159813998
Отклонение по строке 3043 для варианта 5
0.01 - 0.000004206147547946159813998 = 0.009995793852452053840186002

Замечу, что только вариант 1 и вариант 5 дают столь неожиданные результаты. Разумеется, что ничего этого не будет при распределении больших сумм всего по нескольким строкам.
Здесь уместнее говорить о накапливаемой погрешности при округлении. В вариантах 1 и 5 этот момент не учтен.
Ответили: (45) (47)

Прикрепленные файлы:

002.png
# Ответить
36. alexk-is 23.03.2012 09:12
(28) Честно говоря из объяснения так и не понял за что минус?
Приведенный пример с распределением 3 копеек, наверное, не совсем корректен. При одинаковых базах распределения не важно куда будет отнесена копейка, лишь бы не потерялась.

Интереснее получается результат, когда базы распределения почти одинаковые.
Ответили: (37) (60)

Прикрепленные файлы:

003.png
# Ответить
37. Altair777 23.03.2012 12:01
(36) alexk-is, про какой минус ты говоришь?
Одинаковые базы я взял просто для примера, что бы кошкам легче было считать :)
Ответили: (38)
# Ответить
38. alexk-is 23.03.2012 12:38
(37) Какой минус? Обыкновенный. Точнее так, для меня это второй "обыкновенный" минус.

22.03.2012 19:29:13
Новый голос за "Честное распределение суммы по таблице значений (3.1.4.1)" от пользователя Altair777.
Оценка: -1


Как про тот минус не смог добиться ответа, так и про этот тоже не могу понять "за что"?
Тоже не нравится публикация? Тоже считаешь её "Бредом сивой кабылы в ясную лунную ночь"?
Ответили: (39)
# Ответить
39. Altair777 23.03.2012 14:09
(38) alexk-is, извини! Я промахнулся :)
уже исправил, причем дважды
Ответили: (40)
# Ответить
40. alexk-is 23.03.2012 14:22
(39) А-а-а-а, ну, тогда ладно...
Ответили: (41)
# Ответить
41. Altair777 23.03.2012 14:32
(40) alexk-is, а какой еще тот минус?
Ответили: (42)
# Ответить
42. alexk-is 23.03.2012 14:51
(41) Вот тут http://infostart.ru/public/66680/
Спросил в личку, молчит. Так я и не узнал, чем плохо поздравлять красавиц с 8 марта?
Ответили: (43)
# Ответить
43. Altair777 23.03.2012 14:53
(42) alexk-is, я уже подумал что ты про какой-то мой минус сказал
# Ответить
44. nickVZ 23.03.2012 17:10
А ведь даже самый лучший и "честный" метод может иметь непозволительные результаты.
Простой пример: распределить 3 коп на 2 строки, в каждой из которых по 1 коп. Точность - 1 коп.

Блестяще. А что "позволительно"? Применить "полторы копейки"? Здесь вариантов просто нет: 2+1. И если объекты распределения равнозначны, то иного и не будет. А перестановка объектов местами не имеет никакого отношения к алгоритму, ибо алгоритм не следит, на какой объект вы глядите более ласково.
Некорректными примерами доказывать корректность своих убеждений? Как НТВ?
P.S. Нет, меня не радует резкость персонажа "Кошки рулят". Но хоть какой бы не был этот персонаж отрицательным - он прав: для распределения числа по списку мало одного "веса", чтоб претендовать на "справедливость". Надо еще иметь параметры для сортировки списка. Коэффициент "все равны, а этот равнее на ххх.ххх".
Ответили: (46)
# Ответить
45. nickVZ 23.03.2012 17:45
(35) alexk-is, вообще-то, правильный аргумент, но не раскрытый.
Рассмотрим алгоритм в (25). Предположим, мы его запсочили в некую функцию, на входе в которую первым аргументом включаем сумму распределяемую, вторым - список с "весами". На выходе имеем список с распределенными суммами.
Как следует из (26), это и есть "вариант 3". "Предварительная сортировка" есть предварительная сортировка, никак не относящаяся к алгориту, а только определяющая список, как таковой.
Смотрим недостатки этой функции. Во-первых, и это существенно, нужны еще параметры: точность округления раз, и направление округления, два. Это когда надо заранее оговорить: 0.5 - это 1.0 или 0.0?
Во вторых, что много существеннее, надо предусмотреть деление на 0. Увы нам, но "база" из +1 и -1 обеспечит нам если не голубой экран, то неприятное сообщение точно :)
И вот тут, чтоб построить правильный алгоритм, надо представить данные "геометрически". Ну, как на каком-то графике. После этого понимаем, что нужны еще две манипуляции: сдвиг осей графика так, чтоб все точки оказались в правой верхней четверти, и, после распределения, вертание осей взад ;)
Приятного размышления :D
Ответили: (48) (49)
# Ответить
46. Altair777 23.03.2012 18:03
(44) nickVZ,
Коэффициент "все равны, а этот равнее на ххх.ххх".

ха-ха-ха :) у меня этот лозунг в профиле записан
Все животные равны, но некоторые равнее других
© Джордж Оруэлл "Скотный двор"


Кошки вообще ничего не говорили (тем более, кошки вообще говорить не умеют :) ) по поводу веса и справедливости. В том алгоритме - кто первый встал, того и тапочки.
А пример с 3 копейки как раз и утверждает, что справедливого на 100% алгоритма не может существовать. Там так и написано.
Ответили: (47)
# Ответить
47. alexk-is 23.03.2012 18:37
(46) Начнем с того, что с самого начала "честный" было написано в кавычках, т.е. уже 3,5 года.

По поводу "В том алгоритме - кто первый встал, того и тапочки".
А вот и нет. По варианту в (25) на больших массивах информации погрешность может активно накапливаться и "тапки" будут розданы самым неожиданным образом. См. картинку в (35)
# Ответить
48. alexk-is 23.03.2012 19:23
(45) Нужно как-то уже определяться.
Сначала приводите для примера не очень удачную реализацию (25). Потом хаете её, при этом утверждая, что автор варианта 5 хоть и груб, но во всем абсолютно прав. А потом описываете схему работы варианта 3 как желаемую. Хотя вариант 3 уже работает у меня по этой схеме лет этак 20.

И вообще, почему привязались к варианту 3? Все варианты (1,2,3) приведены в публикации только для того, чтобы можно было сравнить результаты их работы с вариантом 4. Именно варианту 4 в основном и посвящена эта публикация.

Если что-то и обсуждать, так это вариант 4. (самый "честный")
Ответили: (49)
# Ответить
49. nickVZ 23.03.2012 21:35
(48) alexk-is, Ну, если определятся, так давайте определятся. Вначале избавимся от слов-паразитов: "честный", "справедливый". Осетрина бывает или единственной свежести, или протухшей, калькулятор либо работающий, либо сломанный. Так что говорить о разработке конкретно готов при описании ее в профессиональных, однозначных терминах.
В (45) я хотел всего лишь показать, что задача распределения по списку, и задача составления списка (частный случай: сортировка) - это совершенно разные процедуры. Не надо их совмещать в один модуль. Комбинировать - да. В подавляющем большинстве - да. Но речь-то о распределении, нет?
В разговор встрял только потому, что заметил демагогию в (28).
О чем искренне сожалею. Не о том, что заметил, а о том, что встрял.
Приятной беседы.
Ответили: (50) (51)
− 1 [ Altair777; ]
# Ответить
50. alexk-is 23.03.2012 21:59
(49) Да, речь о распределении.
Интересно как можно разделить распределение по списку и составление списка для варианта 4?
# Ответить
51. Altair777 26.03.2012 14:08
(49) nickVZ, и в чем же демагогия?
# Ответить
52. dyh 25.04.2012 09:25
Скачал, вставил все варианты в печатную, предупредил о бессмысленности таких перераспределений, т.к. правильная сумма важнее, дал ссылок на статьи... Зато бух теперь играется - каким же вариантом получатся одинаковые суммы для равноценной номенклатуры? )) Как показывает практика, универсального рецепта нет. (

PS Пересчет из уе в руб при печати счетов на оплату.
# Ответить
54. розница.net 18.07.2012 15:50
А если в базе распределения будут не только положительные суммы а и отрицательные - алгоритмы корректно будут работать ?
Ответили: (55)
# Ответить
55. alexk-is 18.07.2012 16:02
(54) Конечно
# Ответить
56. Miha.L 06.12.2012 17:55
Варианты "честного" распределения суммы по таблице значений
Это от того, что последняя копейка все равно не ляжет правильно, или как ?
А вообще, интересная разработка.
Автор - молодец. Мой +
# Ответить
57. Synoecium 22.11.2013 09:09
Тема интересная, подход основательный, конечно плюс за такую работу.
Вот только что за куча файлов доступна для скачки, какой из них нужный?
Ответили: (59)
# Ответить
58. ildarovich 22.11.2013 17:03
(3) Тоже считаю лучшим вариант 4 (как я его понял по словесному описанию). Однако обоснование кажется не совсем точным. При использовании этого варианта достигается не "снижение средней ошибки округления", а минимизация максимальной ошибки округления. С точки зрения средней ошибки все варианты равноценны.
Ответили: (60)
# Ответить
59. alexk-is 22.11.2013 17:45
(57) Куда-то делись названия файлов. Исправил.
# Ответить
60. alexk-is 22.11.2013 18:10
(58) Это уже больше похоже на игры словами: "Кто точнее выразит мысль и сделает при этом меньше опечаток".

Мне больше всего нравится обоснование из поста (33)
В (36) тоже занятная картинка. Можно ли ее тоже считать обоснованием?
# Ответить
61. Synoecium 26.11.2013 06:43
Нашел ошибку в реализации способа 4 с помощью одного запроса (4_3). Если ввести 2 строки с одинаковым весом и попытаться распределить 1 копейку этим способом, то в обеих строках будет стоять по 1 копейке.
Исправил, заменив строку 382 в модуле объекта:
СУММА(1) КАК НомерСтрокиОкругления
на
КОЛИЧЕСТВО(ВременнаяТаблицаРасчетов1.ВеличинаОтклонения) КАК НомерСтрокиОкругления

П.С. Ваша обработка очень помогла)
# Ответить
62. endym 02.12.2013 16:46
Соглашусь что проблема не новая;)
Как обстоят дела с сверх малыми суммами?;)
ставится ли минимальное значение 0,01 или вообще 0?

З.Ы. распределение через коэффициент доли суммы строки из общей суммы, плюс нахождение наибольшего значения суммы (для уменьшения погрешности исчисления) для добавления последней распределенной по модулю копейки.
Ответили: (63)
# Ответить
63. alexk-is 02.12.2013 17:09
(62) А если взять, да попробовать, то как? Получилось?
# Ответить
64. jsmith 04.12.2013 12:04
спасибо
# Ответить
65. tailer2 18.08.2015 18:22
Оптимальность распределения - вещь в себе, однозначно :)
Ибо куда ни кинь, значение будет отличаться от округленного вычисленного по формуле.

Единственно возможный критерий - незаметность.

Ошибку округления нельзя устранить, ее можно только спрятать. Поэтому критерий - незаметность.

А незаметность достигается в цикле по единицам округления (копейкам).
Каждую копейку - отдельно по критерию незаметности на каждом шаге распределения.

А этого в одном запросе не достигнешь по той простой причине, что неизвестно количество копеек.

Значит, на сколько копеек надо поправить итог, столько раз пробегаем строки таблицы.

Вся фишка в том, чтобы найти, куда сунуть очередную копейку, за один проход.
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл






IE 2016