Как обновить значение суммы в таблице значений после распределения?

Обновление значения суммы в таблице значений после пропорционального распределения предполагает, что вы уже рассчитали и округлили сумму, которую нужно распределить по строкам. Обычно это делается в контексте обработки, документа или отчёта, где таблица значений (ТаблицаЗначений) содержит, например, колонку "Количество" и новую колонку "Сумма". Цель — заполнить или обновить колонку "Сумма" распределёнными значениями на основе общего числа.

1. Структура таблицы значений

Пример структуры таблицы:

Номенклатура Количество Сумма
1 Товар1 5 ?
--- --- --- ---
2 Товар2 10 ?
--- --- --- ---
3 Товар3 25 ?
--- --- --- ---

Общая сумма: 400 рублей.

2. Шаги обновления колонки "Сумма"

Шаг 1: Подсчитать итог по количеству (база распределения)

БазаРаспределения = 0;
Для Каждого Строка Из Таблица Цикл
БазаРаспределения = БазаРаспределения + Строка.Количество;
КонецЦикла;

Шаг 2: Вычислить коэффициент

Если БазаРаспределения = 0 Тогда
Возврат; // Распределение невозможно
КонецЕсли;
Коэффициент = ОбщаяСумма / БазаРаспределения;

Шаг 3: Начальное распределение и сохранение дробных остатков

СуммаОкругленная = 0;
Остатки = Новый ТаблицаЗначений;
Остатки.Колонки.Добавить("Индекс");
Остатки.Колонки.Добавить("ДробнаяЧасть");
Индекс = 0;
Для Каждого Строка Из Таблица Цикл
ИсходнаяСумма = Строка.Количество \* Коэффициент;
ОкругленнаяСумма = Окр(ИсходнаяСумма, 0);
Строка.Сумма = ОкругленнаяСумма;
СуммаОкругленная = СуммаОкругленная + ОкругленнаяСумма;
НовСтр = Остатки.Добавить();
НовСтр.Индекс = Индекс;
НовСтр.ДробнаяЧасть = ИсходнаяСумма - ОкругленнаяСумма;
Индекс = Индекс + 1;
КонецЦикла;

Шаг 4: Корректировка округления

Разница = ОбщаяСумма - СуммаОкругленная;
Если Разница > 0 Тогда
Остатки.СортироватьПоУбыванию("ДробнаяЧасть");
Для Инд = 0 По Разница - 1 Цикл
Таблица\[Остатки\[Инд\].Индекс\].Сумма = Таблица\[Остатки\[Инд\].Индекс\].Сумма + 1;
КонецЦикла;
ИначеЕсли Разница < 0 Тогда
Остатки.СортироватьПоВозрастанию("ДробнаяЧасть");
Для Инд = 0 По Модуль(Разница) - 1 Цикл
Таблица\[Остатки\[Инд\].Индекс\].Сумма = Таблица\[Остатки\[Инд\].Индекс\].Сумма - 1;
КонецЦикла;
КонецЕсли;

3. Особенности обновления

  • Столбец "Сумма" должен существовать в таблице. Если его нет — нужно создать:
Если Не Таблица.Колонки.Найти("Сумма") Тогда
Таблица.Колонки.Добавить("Сумма", Тип("Число", 15, 2));
КонецЕсли;
  • Значения можно обновлять напрямую:
Строка.Сумма = НовоеЗначение;
  • При необходимости использовать именной доступ:
Таблица.Получить(Индекс).Сумма = Значение;

4. Проверка после распределения

Желательно проверить, что итоговое распределение совпадает с исходной суммой:

ПроверочнаяСумма = 0;
Для Каждого Строка Из Таблица Цикл
ПроверочнаяСумма = ПроверочнаяСумма + Строка.Сумма;
КонецЦикла;
Если ПроверочнаяСумма <> ОбщаяСумма Тогда
Сообщить("Сумма распределена некорректно: " + ПроверочнаяСумма + " вместо " + ОбщаяСумма);
Иначе
Сообщить("Сумма распределена корректно.");
КонецЕсли;

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