Пропорциональное деление
Пропорциональное деление — деление какой-нибудь величины на части, прямо или обратно пропорциональные данным числам.
Чтобы разделить число на части пропорционально нескольким данным числам, надо разделить его на сумму этих чисел и частное умножить на каждое из них.
Деление числа на пропорциональные части
Пример 1. Разделить число 50 на части пропорционально числам 2 и 3.
Решение: Надо найти такие два слагаемых числа 50, которые будут относиться друг к другу так, как 2:3. Первое слагаемое должно содержать 2 части числа, а второе 3, значит, число 50 содержит 5 таких частей (2 + 3 = 5), следовательно, каждая такая часть будет равна:
Число 10 — одна часть. Теперь надо умножить эту часть на числа, пропорционально которым требовалось разделить число 50:
Ответ: 2:3 = 20:30.
Пример 2. Разделить число 90 на три слагаемых пропорционально числам 1, 2 и 3.
90 : (1 + 2 + 3) = 90 : 6 = 15;
Ответ: 1:2:3 = 15:30:45.
Длинные отношения вида 1:2:3 называются сложными. Сложные отношения — это условные записи, показывающие, сколько долей содержит каждая часть. Если члены сложного отношения дробные, то, приведя их к общему знаменателю и умножив на него, можно заменить отношение дробных чисел отношением целых.
Пример. Разделить число 66 на такие три части, чтобы первая относилась ко второй, как 3:2, а вторая к третьей, как 5:4.
Первый способ: обозначим искомые части буквами a, b и c. Так как отношение не изменится, если оба члена умножить на одно и то же число, то умножим члены первого отношения на 5, а второго на 2:
a:b = 3:2 = 15:10;
b:c = 5:4 = 10:8;
значит a:b:c = 15:10:8. Так как 15 + 10 + 8 = 33, то
a = (66 : 33) · 15 = 30;
b = (66 : 33) · 10 = 20;
c = (66 : 33) · 8 = 16.
Второй способ: обозначим искомые части буквами a, b и c:
a:b = 3:2;
b:c = 5:4.
Если первая часть a равна 3, вторая b равна 2, то третью часть c можно определить из пропорции:
Следовательно, c равно:
| c = | 2 · 4 | = | 8 | , |
| 5 | 5 |
| a:b:c = 3:2: | 8 | . |
| 5 |
Умножив все члены полученного сложного отношения на 5, чтобы избавиться от дробного члена, получим:
a:b:c = 15:10:8,
так как 15 + 10 + 8 = 33, то
a = (66 : 33) · 15 = 30;
b = (66 : 33) · 10 = 20;
c = (66 : 33) · 8 = 16.
Деление на части, обратно пропорциональные числам
Пример. Разделить число 62 на три части обратно пропорционально числам 2, 3 и 5, то есть разложить на три части, которые относились бы между собой, как
| 1 | : | 1 | : | 1 | . |
| 2 | 3 | 5 |
Решение: Обозначим искомые части буквами a, b и c. Приведём члены отношения к общему знаменателю и заменим дробные члены на целые числа:
| a:b:c = | 1 | : | 1 | : | 1 | = | 15 | : | 10 | : | 6 | = 15:10:6, |
| 2 | 3 | 5 | 30 | 30 | 30 |
так как 15 + 10 + 6 = 31, то
a = (62 : 31) · 15 = 30;
b = (62 : 31) · 10 = 20;
c = (62 : 31) · 6 = 12.
Свобода в действии
Допустим, интернет-магазин предоставляет клиенту скидку на заказ (по бонусной карте, купону или ещё как-то). Скидка даётся на весь заказ, но её действие нужно пропорционально распределить по товарам, чтобы, например, правильно сформировать кассовый чек (в нём каждую позицию чека нужно расписать: цена до применения скидки и сумма с учётом скидки).
Пример:
1) Товар №1 — цена 1500 руб.
2) Товар №2 — цена 1700 руб.
Итого сумма заказа получается 3200 руб. Допустим, клиенту предоставляется скидка 10%. В данном случае легко посчитать, что скидка в процентах будет одинаковой для каждого товара:
1) Товар №1 — цена со скидкой 1500 — 10% = 1350 руб.
2) Товар №2 — цена со скидкой 1700 — 10% = 1530 руб.
Это лёгкий пример, где никакого распределения не потребовалось. Теперь изменим условия примера. Допустим, скидка на заказ предоставляется не в процентах, а в рублях, — например, 500 руб. Как её учесть в стоимостях товаров? Вот тут уже требуется распределение. Да, можно было бы скидку целиком вписать в один какой-то товар — но это было бы некрасиво; да к тому же не универсально, ведь все товары в заказе могли бы стоить меньше, чем сумма скидки — что ж теперь отрицательную цену делать?! Нет конечно.
Итак распределяем. Очевидно, что первый товар стоит дешевле, значит, и скидку не него надо сделать меньше, чем на второй товар. Считаем сумму заказа, а потом долю стоимости каждого товара в заказе. Полученную долю умножаем на скидку на заказ.
1) Товар №1 1500 * 100 / 3200 = 46,875% — такова доля стоимости первого товар в общем заказе
2) Товар №2 1700 * 100 / 3200 = 53,125%. Проверим, что мы не ошиблись в округлении и не потеряли какой-нибудь доли заказа: 46,875 + 53,125 = 100% — всё верно.
Скидка распределяется согласно полученным долям:
1) 500 * 46,875 / 100 = 234,375. Получилось не очень-то красивое число. Во-первых, суммы допустимо указывать с копейками, а копейки — это только сотые доли. А тут получились тысячных. Во-вторых, в интернет магазине вообще могут не захотеть иметь дела с копейками. Требуется округление. Приводим к скидке 234 руб. Т.е. цена товара с учётом скидки равна 1500 — 234 = 1266 руб.
2) 500 * 53,125 / 100 = 265,625 — аналогично математическим округлением получаем 266 руб. Цена с учётом скидки 1200 — 266 = 934 руб.
Проверим, все ли 500 рублей мы вписали в виде отдельных скидок по товарам: 234 + 266 = 500 — всё верно.
Это простой пример, который довольно легко поддаётся алгоритмизации и составлению функции. Подобные функции для различных языков мне попадались в интернете. Но есть тут и подвохи, не будь которых — не было бы и статьи.
Подводные камни
Подвоха два:
1. Округление — не всегда округление скидок по товарам в сумме даёт скидку заказа. С этим авторы многих функций решают путём проверки и учёта разницы в последнем или самом дорогом товаре. Алгоритм моей функции навеян функцией отсюда Распределение суммы прапорционально
2. Не все скидки вообще возможно распределить. Это справедливо, когда требуется учитывать ещё и количество товара — т.е. цена товара никогда не должна быть с точностью больше двух десятичных знаков (т.е. копеек), а в большинстве случаев реальных магазинов — вообще без копеек. Т.е. нужна заданная точность. Невозможно ведь иметь три штуки товара в сумме 1000 руб. — тогда каждый из товаров стоил бы 333,(3) (три в периоде) руб. Вот этот момент вообще нигде не нашёл в сети. Автоматическое распределение алгоритмом, как показан выше вполне может выдать такой неделимый результат. Значит алгоритм требует доработки.
Функция распределения
Мой вариант функции (для языка PHP 7) учитывает количество по каждой позиции и заданную точность. Возвращаемый результат — всегда массив с таким же порядком и количеством элементов, что и входящий массив. А все неразрешимые ситуации генерируют исключение. Таким образом функцию не безопасно использовать обычным образом, — требуется организация перехвата исключения и какая-то реакция на исключительное поведение.
Какие могут быть варианты реакций на неразрешимые распределения? Если распределяется некая скидка по купону, то можно пойти на встречу клиенту и в неразрешимой ситуации накинуть рубль или два к скидке — этого вполне может хватить чтобы подыскать ближайший возможный вариант распределения. Потребуется перебор возможных вариантов.
Если это применение бонусов с личного счёта клиента, то неправильно было бы применить больше, чем есть на счёте — тут наоборот нужно подыскать первый доступный вариант с уменьшением скидки (и не забыть пояснить клиенту, что скидка именно такая по математическим и бухгалтерским причинам).
А если, например, первоначальный взнос клиента по кредиту невозможно равномерно распределить по товарам (для печати чека, например), то тут уже надо запрашивать алгоритм действия у бухгалтерии и руководства.
Варианты всегда есть — нужно просто помнить об исключительных ситуациях и адекватно на них реагировать.
Вот сама функция:
/** * Метод выполняет пропорциональное распределение суммы в соответствии с заданными коэффициентами распределения. * Также может выполняться проверка полного деления суммы коэффициента на его количество. Например, * при нулевой точности для чётного количества штук товара было неправильно получить нечётную сумму * после распределения, - правильно немного увеличить сумму распределения (в ущерб пропорциональности), * чтобы добиться ровного распределения по количеству. * Используется, например, при распределении скидки равномерно по позициям корзины. * @param float $sum Распределяемая сумма * @param array $arCoefficients Массив коэффициентов распределения, где ключи - определённые значения, * которые также будут возвращены в виде ключей результирующего массива. Значения - массив с ключами: * "sum" - величина коэффициента (сумма, а не цена) * "count" - количество для коэффициента * @param int $precision Точность округления при распределении. Если передать 0, * то все суммы после распределения будут целыми числами * @throws Exception Выбрасывается исключение в случае, * если невозможно ровно распределить по заданным параметрам * @return array Массив, где сохранены ключи исходного массива $arCoefficients, а значения - массив с ключами: * "init" - начальная сумма, равная соответствующему входному коэффициенту * "final" - сумма после распределения */ public static function getProportionalSums(float $sum, array $arCoefficients, int $precision) : array < $arResult = []; /** * @var float Сумма значений всех коэффициентов */ $sumCoefficients = 0.0; /** * @var float Значение максимального коэффициента по модулю */ $maxCoefficient = 0.0; /** * @var mixed Ключ массива для максимального коэффициента по модулю */ $maxCoefficientKey = null; /** * @var float Распределённая сумма */ $allocatedAmount = 0; foreach ($arCoefficients as $keyCoefficient =>$coefficient) < if (is_null($maxCoefficientKey)) < $maxCoefficientKey = $keyCoefficient; >$absCoefficient = abs($coefficient['sum']); if ($maxCoefficient < $absCoefficient) < $maxCoefficient = $absCoefficient; $maxCoefficientKey = $keyCoefficient; >$sumCoefficients += $coefficient['sum']; > if (!empty($sumCoefficients)) < /** * @var float Шаг, который прибавляем в попытках распределить сумму с учётом количества */ $addStep = (0 === $precision) ? 1 : (1 / pow(10, $precision)); foreach ($arCoefficients as $keyCoefficient =>$coefficient) < /** * @var boolean Флаг, удалось ли подобрать сумму распределения для текущего коэффициента */ $isOk = false; /** * @var integer Количество попыток подобрать сумму распределения */ $i = 0; // Далее вычисляем сумму распределения с учётом заданного количества do < $result = round(($sum * $coefficient['sum'] / $sumCoefficients), $precision) + $i * $addStep; // Проверим распределённую сумму коэффициента относительно его количества if (isset($coefficient['count']) && $coefficient['count'] >0) < if (round($result / $coefficient['count'], $precision) != ($result / $coefficient['count'])) < // Не прошли проверку по количеству - ровно по заданному количеству не распределяется >else < $isOk = true; >> else < // Количество не задано, значит не проверяем распределение по количеству $isOk = true; >$i++; if ($i > 100) < // Мы старались долго. Пора признать, что ничего не выйдет throw new Exception( 'Не удалось распределить сумму для коэффициента ' . $keyCoefficient ); >> while (!$isOk); // Если сюда дошли, значит удалось вычислить сумму распределения $arResult[$keyCoefficient] = [ 'init' => $coefficient['sum'], 'final' => (0 === $precision) ? intval($result) : $result, 'count' => $coefficient['count'] ]; $allocatedAmount += $result; > if ($allocatedAmount != $sum) < // Есть погрешности округления, которые надо куда-то впихнуть $tmpRes = $arResult[$maxCoefficientKey]['final'] + $sum - $allocatedAmount; if (!isset($arResult[$maxCoefficientKey]['count']) || (isset($arResult[$maxCoefficientKey]['count']) && 1 === $arResult[$maxCoefficientKey]['count']) || (isset($arResult[$maxCoefficientKey]['count']) && $arResult[$maxCoefficientKey]['count'] >0 && (round($tmpRes / $arResult[$maxCoefficientKey]['count'], $precision) == ($tmpRes / $arResult[$maxCoefficientKey]['count'])) ) ) < // Погрешности округления отнесём на коэффициент с максимальным весом $arResult[$maxCoefficientKey]['final'] = (0 === $precision) ? intval($tmpRes) : $tmpRes; >else < // Погрешности округления нельзя отнести на коэффициент с максимальным весом // Надо подыскать другой коэффициент $isOk = false; foreach ($arCoefficients as $keyCoefficient =>$coefficient) < if ($keyCoefficient != $maxCoefficientKey) < // Пробуем погрешность округления впихнуть в текущий коэффициент $tmpRes = $arResult[$keyCoefficient]['final'] + $sum - $allocatedAmount; if (!isset($arResult[$keyCoefficient]['count']) || (isset($arResult[$keyCoefficient]['count']) && 1 === $arResult[$keyCoefficient]['count']) || (isset($arResult[$keyCoefficient]['count']) && $arResult[$keyCoefficient]['count'] >0 && (round($tmpRes / $arResult[$keyCoefficient]['count'], $precision) == ($tmpRes / $arResult[$keyCoefficient]['count'])) ) ) < // Погрешности округления отнесём на коэффициент с максимальным весом $arResult[$keyCoefficient]['final'] = (0 === $precision) ? intval($tmpRes) : $tmpRes; $isOk = true; break; >> > if (!$isOk) < throw new Exception('Не удалось распределить погрешность округления'); >> > > return $arResult; >
Проверим на тестовых значениях:
Пример, где всё распределяется без дробной части:
$arProduct = [ [ 'sum' => 1000, 'count' => 1 ], [ 'sum' => 2000, 'count' => 2 ] ]; $arResult = getProportionalSums(1000, $arProduct, 0); echo ''; print_r($arResult); echo '';
Array ( [0] => Array ( [init] => 1000 [final] => 332 [count] => 1 ) [1] => Array ( [init] => 2000 [final] => 668 [count] => 2 ) )Пример, где невозможно распределить без дробной части:
$arProduct = [ [ 'sum' => 1000, 'count' => 3 ], [ 'sum' => 2000, 'count' => 3 ] ]; $arResult = getProportionalSums(1111, $arProduct, 0); echo ''; print_r($arResult); echo '';
Pro Rata: Что это значит, как рассчитать и примеры
Если вы работаете в бухгалтерии или в другой области, требующей применения финансовых принципов, вам может быть знаком термин пропорциональный расчет . Пропорциональный расчет предполагает определение пропорционального распределения фиксированной суммы. Знание того, как рассчитать эту цифру, может помочь вам оформить дивидендные выплаты, определить страховые взносы или рассчитать зарплату за неполный рабочий день.
В этой статье мы объясним, что такое пропорциональная доля, обсудим ее применение, приведем шаги по ее расчету и поделимся примерами.
- Pro rata — это расчет, который определяет справедливое распределение фиксированной суммы.
- Эти расчеты распространены при выдаче дивидендов и определении зарплаты для неполного рабочего дня.
- Вы можете рассчитать пропорционально, определив долю получателя платежа и умножив ее на общую фиксированную сумму.
Что такое пропорциональная оплата труда?
Pro rata, или prorated , — это латинское слово, используемое для описания пропорционального распределения или присвоения стоимости. Pro rata переводится как пропорционально и означает распределение суммы в эквивалентных соотношениях. Хотя этот термин может означать, что все части равны, он также может означать, что части неравны, если каждая часть пропорциональна в отношении распределения.
Пропорциональное соотношение используется в деловых целях в отношении расходов, распределения доходов, капитала и других финансовых сценариев, которые предполагают предоставление или получение денег от одного физического или юридического лица. Предприятия используют пропорциональную оплату для обеспечения точного и справедливого анализа и распределения финансовых показателей. Предприятия также могут использовать пропорциональный метод при расчете зарплаты сотрудника, работающего неполный рабочий день. В данном случае определяется процент, который работник, занятый неполный рабочий день, зарабатывал бы, если бы работал полный рабочий день.
Когда использовать пропорциональную оплату
Несколько наиболее распространенных случаев, когда человек или компания могут использовать пропорциональную оценку, включают:
- Выплата дивидендов или денежных выплат акционерам организации
- Определение общей суммы подлежащей уплате премии по страховому полису, который был реализован при неполном сроке страхования
- Распределение нужной части годовой процентной ставки в течение срока, который меньше одного года
- Расчет зарплаты сотрудника, работающего неполный рабочий день, с тем, сколько бы он зарабатывал, если бы работал полный рабочий день
- Распределение расходов между определенным количеством людей на установленный период
- Корректировка платежей по кредитам, чтобы они выплачивались ежемесячно, а не ежегодно
- установление квот на выручку для отдельных географических точек
- Планирование бюджета проекта, включающего расходы на различные отделы и нужды
Как рассчитать пропорционально
Вот как рассчитать пропорциональную долю с помощью формулы:
Пропорциональное распределение = пропорциональная доля x количество соответствующих предметов
Для эффективного использования формулы вы можете следовать приведенным ниже шагам:
1. Соберите необходимые данные
При определении пропорционального соотношения формула обычно требует сбора следующих трех данных:
- Количество истинных предметов
- Максимальное количество общих предметов
- Количество связанных предметов
Рассмотрим пример, когда арендатор платит за 10 дней аренды в январе. Поскольку арендатор платит только часть месячной арендной платы, количество истинных статей расходов равно 10. Максимальное количество общих предметов — 31, так как типичная ежемесячная арендная плата за январь будет рассчитана на 31 день. Количество сопутствующих товаров составляет $500, что представляет собой обычный ежемесячный платеж за январь.
2. Рассчитать пропорциональную долю
Вы можете рассчитать пропорциональную долю, разделив количество истинных предметов на максимальное количество общих предметов. Используя тот же пример, вы разделите 10 на 31, чтобы получить примерно 32%. Этот процент представляет собой часть задолженности арендатора от общей суммы ежемесячной арендной платы.
3. Рассчитайте пропорциональное распределение
Чтобы рассчитать пропорциональное распределение, умножьте пропорциональную долю на количество сопутствующих товаров. В этом примере вы умножите 32% на 500 долларов. В результате получается около $161, что представляет собой сумму, которую арендатор должен за 10 дней январской аренды.
В качестве альтернативы можно рассчитать пропорциональное распределение, разделив количество соответствующих товаров на максимальное количество всех товаров и умножив это число на истинное количество. Используя тот же пример, вы разделите $500 на 31 день января, чтобы получить примерно $16.13. Эта сумма представляет собой стоимость аренды в день, поэтому вы можете умножить ее на 10 дней аренды, чтобы получить ту же сумму в $161.
Пример пропорционального расчета
Вот несколько примеров пропорциональных расчетов:
Для выплаты дивидендов
Вот пример расчета пропорциональной доли для выплаты дивидендов:
Компания планирует выплатить $500 000 в виде денежных дивидендов на свои акции. Общее количество акций составляет 100 000, при этом каждая акция дает одинаковые выплаты. Компания делит $500 000 на 100 000, что равно 500. Таким образом, каждая выплата дивидендов составит $500.
Для страховых взносов
Вот как можно рассчитать пропорциональные страховые взносы:
Полис страхования жилья на один год стоит 500 долларов. Страховая компания требует от страхователя оплаты полиса только за 200 дней из года, потому что страхователь хочет перейти на другой тарифный план. Страховая компания делит 200 на 365 и умножает эту цифру на $500, получая $273.97, представляющий собой сумму задолженности страхователя.
Для сотрудников, работающих неполный рабочий день
Вот пример пропорционального расчета для сотрудников, работающих неполный рабочий день:
Сотрудник, работающий неполный рабочий день, зарабатывает в среднем 40 000 долларов в год. Разделите это число на 52, чтобы получить $769.23. Это то, сколько сотрудник зарабатывает в среднем каждую неделю. Если сотрудник работает в среднем 15 часов в неделю, разделите $769.23 на 15, чтобы получить $51.30, то есть сколько сотрудник будет зарабатывать на почасовой основе.
Для прибыли компании
Вот как можно рассчитать пропорциональную долю прибыли компании:
Шон и Том владеют местным тренажерным залом. Том вложил больше средств в операцию на начальном этапе развития бизнеса, поэтому он владеет большей долей собственности, чем Шон: Том владеет 60%, а Шон — 40%. В конце финансового года чистый доход спортзала составил $200 000. Они делят этот доход пропорционально, исходя из долей владения двух владельцев. Том зарабатывает в общей сложности $120 000 (60% от $200 000), а Шон — $80 000 (40% от $200 000).
Ключевые слова:
- indeed.com
Как посчитать пропорциональное распределение
(3)Формулой это типа:
Ч1 = 150
Ч2 = 100
Ч3 = 50
Сумма = Ч2 / (Ч1 + Ч3)
Ч1 = Ч1 + Ч1 * Сумма
Ч3 = Ч3 + Ч3 * Сумма
Все понятно, всем спасибо.
(8) Чтобы не путаться в понятиях:
Коэффициент = Ч2 / (Ч1 + Ч3)
Ч1 = Ч1 + Ч1 * Коэффициент
Ч3 = Ч3 + Ч3 * Коэффициент
(8) А зачем так:
Ч1 = Ч1 + Ч1 * Коэффициент ?
Функция РассчитатьДельту(СуммаВходящая,ВсегоСуммаВходящая,СуммаРаспределения)
ПроцентОтОбщей=СуммаВходящая /(ВсегоСуммаВходящая/100);
Дельта=Окр(СуммаРаспределения/100*ПроцентОтОбщей,2,РежимОкругления.Окр15как20);
Возврат Дельта;
КонецФункции
+ потом если последняя сумма надо не функцию вызывать а тупо прибавлять оставшийся хвост. а то копейки остаются
мдэ. а что, в Советское время тоже образование хромало?
(12) хвост в виде лишней копейки, если коэффициент вида 0,3333333333333, лучше не к последней сумме прибавлять, а к максимальной. Аккуратнее получается. 🙂
(0) «программист»-гуманитарий?
(0) это шутка ?
(14)Можно и так 🙂
есть 2 (два) осажденных города.
в одном 150 защитников. в другом 50 защитников.
им на подмогу идет обоз с мукой.
везут 100 кг.
Задача: сколько муки нужно завезти в каждый город через подземный ход чтобы всем защитникам досталось поровну?
Решение:
Складываем всех защитников города, делим всю муку на кол-во всех защитников, находим сколько муки приходится на 1 защитника по норме.
Умножаем норму на кол-во защитников в каждом городе.
разделяем всю муку на 2 части ПРОПОРЦИОНАЛЬНО полученной норме для каждого города.
(14) В социальном государстве лучше прибавлять к минимальной сумме.
а теперь в запросе и так, чтобы копейки не терялись :)))
лично у меня — УГ получилось 🙂
(20)
declare t table (id int, b decimal)
declare @sum as decimal
insert t values (1, 100), (2, 50)
select
cast(@sum / (SUM(b) OVER()) * b as decimal(15,2)) AS t
from
t
Усложним задачу:
Есть главный документ.
Сумма документа = 150
Нал = 50
БезНал = 100
Он делится на 2 документа.
Первый Документ
Сумма = 80
Нал = ?
БезНал = ?
Второй Документ
Сумма = 70
Нал = ?
БезНал = ?
Вот как тут рассчитать оплату из главного документа ?
(22) распредели сумму в 100 пропорционально между 3 одинаковимы значениями, чтобы копейки не потерялись
*одинаковыми
типа
100 + 100 + 100 + 100 => 133,34 + 133,33 + 133,33
(14) В исходной задаче две суммы. В случае, если у одной суммы будет 0,3333333333333 — значит у другой 0,6666666666666. В общем, при округлении все будет хорошо. Вот если было три суммы (и более). Возникла бы ситуёвина, когда одному 0,3333333333333, другому 0,3333333333333 и третьему столько же. В результате копеечки могут и не бить.
(27) решение таки должно быть универсальным
(0) размазывать нужно как в (6) но с одной оговоркой
отсортировать суммы по убыванию и последней сумме добавить остаток
Суть этого гемора такова:
Определенный товар продается на ИП, остальной на ООО (одна касса работает с двумя фискальниками), до того пока не подключили банк все было нормально, вчера подключили.
т.е.
Один Чек ККМ делится на два в зависимости от товара.
Для Каждого Строка Из ТЗ Цикл
Результат = НужныйРезультат * Строка.Основание / База + Отклонение;
Отклонение = (Результат — Окр(Результат, 2));
Строка.Результат = Окр(Результат, 2);
КонецЦикла;
Это 1с розница, программно деление чека выглядит так:
Если Константы.ДваФР.Получить() Тогда
Запрос = Новый Запрос(»
|ВЫБРАТЬ * ПОМЕСТИТЬ ТабТов ИЗ &ТабТов КАК ТТ;
|ВЫБРАТЬ *
|ИЗ
| ТабТов КАК Товары
|ГДЕ
| Товары.Номенклатура.ТоварОрганизации = &Организация»);
Запрос.УстановитьПараметр(«ТабТов», Товары.Выгрузить());
ВремКассаККМ = КассаККМ;
Оплаты = Оплата.Выгрузить();
Организации = Справочники.Организации.Выбрать();
Пока Организации.Следующий() Цикл
Если Организации.Ссылка = Магазин.ОсновнойСклад.Организация Тогда;
Организация = Справочники.Организации.ПустаяСсылка();
Иначе
Организация = Организации.Ссылка;
КонецЕсли;
Запрос.УстановитьПараметр(«Организация», Организация);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
ЭтотОбъект.Товары.Загрузить(Результат.Выгрузить());
ФР = ПолучитьСерверТО().ПолучитьИдентификаторПоИдКассы(Организация);
Если ЗначениеЗаполнено(Организация) И Не ПустаяСтрока(ФР) Тогда
КассаККМ = ПолучитьСерверТО().ПолучитьКассуККМ(ФР);
Иначе
КассаККМ = ВремКассаККМ;
КонецЕсли;
ИтогСуммы = Товары.Итог(«Сумма»);
ИтогОплат = Оплаты.Итог(«Сумма»);
Если ИтогСуммы <> ИтогОплат Тогда
ЭтотОбъект.Оплата.Загрузить(Оплаты);
Для Каждого ФормаОплат Из Оплата Цикл
КонецЦикла;
КонецЕсли;
ЗавершитьЗакрытиеЧека2(Печать, РучнойРежим, ВыбратьДокументПечати, ФР);
КонецЕсли;
КонецЦикла;
Иначе
ЗавершитьЗакрытиеЧека2(Печать, РучнойРежим, ВыбратьДокументПечати);
КонецЕсли;
(32) запросом же
(34)Если использовать временные таблицы, то можно распределить результат, а остаток оставить на максимальной/минимальной строке
Получилось как то так:
.
Для Каждого ФормаОплат Из Оплата Цикл
Если ПервыйПроход Тогда
СуммаОплаты = ИтогСуммы * Окр(ФормаОплат.Сумма / ИтогОплат, 2);
СписокОплат.Добавить(ФормаОплат.Сумма — СуммаОплаты);
ФормаОплат.Сумма = СуммаОплаты;
Иначе
ФормаОплат.Сумма = СписокОплат.Получить(ФормаОплат.НомерСтроки — 1).Значение;
КонецЕсли;
КонецЦикла;
ПервыйПроход = 0;
.
(36) В УТ или УПП глянь документ доп. расходы. Там есть алгоритм распределения суммы по кол-ву или объему
