Как обновить значение суммы в таблице значений после распределения?
Обновление значения суммы в таблице значений после пропорционального распределения предполагает, что вы уже рассчитали и округлили сумму, которую нужно распределить по строкам. Обычно это делается в контексте обработки, документа или отчёта, где таблица значений (ТаблицаЗначений) содержит, например, колонку "Количество" и новую колонку "Сумма". Цель — заполнить или обновить колонку "Сумма" распределёнными значениями на основе общего числа.
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;
Для Каждого Строка Из Таблица Цикл
ПроверочнаяСумма = ПроверочнаяСумма + Строка.Сумма;
КонецЦикла;
Если ПроверочнаяСумма <> ОбщаяСумма Тогда
Сообщить("Сумма распределена некорректно: " + ПроверочнаяСумма + " вместо " + ОбщаяСумма);
Иначе
Сообщить("Сумма распределена корректно.");
КонецЕсли;
Таким образом, значение суммы обновляется по каждой строке с учётом доли от общей суммы, корректируется до целого значения и при необходимости регулируется так, чтобы итог совпадал с исходной суммой. Всё это делается в цикле, где каждая строка таблицы значений получает новое значение суммы.