Как рассчитать базу распределения (итог столбца количество)?
В платформе 1С при реализации алгоритма распределения суммы (например, суммы 40 рублей) пропорционально количеству, одной из ключевых операций является расчёт базы распределения, то есть суммы значений столбца Количество в таблице значений. Эта сумма используется для определения доли каждого элемента в общей массе, чтобы корректно вычислить, сколько рублей «принадлежит» каждой строке в таблице на основании её количества.
Что такое база распределения
База распределения — это сумма всех количеств (или другого показателя, по которому нужно распределять) по строкам таблицы. Эта сумма служит знаменателем при расчёте коэффициента или пропорции для каждой строки.
Например, если у нас есть таблица:
Номенклатура | Количество |
---|---|
Товар1 | 2 |
--- | --- |
Товар2 | 3 |
--- | --- |
Товар3 | 5 |
--- | --- |
База распределения = 2 + 3 + 5 = 10
Создание таблицы значений
Перед расчётом необходимо, чтобы таблица значений была заполнена и содержала колонку Количество.
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Количество");
Стр = ТЗ.Добавить();
Стр.Номенклатура = "Товар1";
Стр.Количество = 2;
Стр = ТЗ.Добавить();
Стр.Номенклатура = "Товар2";
Стр.Количество = 3;
Стр = ТЗ.Добавить();
Стр.Номенклатура = "Товар3";
Стр.Количество = 5;
Вариант 1: Расчёт базы через цикл
Самый прямой способ — пройтись по каждой строке таблицы и суммировать значения:
БазаРаспределения = 0;
Для Каждого Строка Из ТЗ Цикл
БазаРаспределения = БазаРаспределения + Строка.Количество;
КонецЦикла;
После выполнения этой конструкции в переменной БазаРаспределения будет находиться итоговая сумма по количеству.
Вариант 2: Использование метода Итог()
Объект ТаблицаЗначений поддерживает встроенный метод Итог(), который позволяет получить сумму значений конкретной колонки:
БазаРаспределения = ТЗ.Итог("Количество");
Метод Итог() возвращает сумму значений указанной колонки по всем строкам таблицы. Он работает быстрее и компактнее, чем ручной цикл, и предпочтителен в большинстве случаев.
Обработка пустых или некорректных значений
Важно удостовериться, что в колонке Количество нет пустых значений или значений, которые не могут быть интерпретированы как число (например, Неопределено или Null).
Если есть сомнения, можно добавить проверку:
БазаРаспределения = 0;
Для Каждого Строка Из ТЗ Цикл
Если ТипЗнч(Строка.Количество) = Тип("Число") Тогда
БазаРаспределения = БазаРаспределения + Строка.Количество;
КонецЕсли;
КонецЦикла;
Обработка нулевой базы распределения
Если итог по количеству равен 0, деление на такую базу при расчёте коэффициентов приведёт к ошибке или искажению результата. В этом случае обычно:
-
либо пропускают распределение (например, ничего не распределяется),
-
либо делают специальную обработку: распределяют равными частями,
-
либо информируют пользователя об ошибке.
Проверка:
Если БазаРаспределения = 0 Тогда
ВызватьИсключение "База распределения равна нулю. Распределение невозможно.";
КонецЕсли;
Применение базы распределения
После получения суммы можно использовать её для расчёта долей каждой строки:
ОбщаяСумма = 40;
Для Каждого Строка Из ТЗ Цикл
Коэффициент = Строка.Количество / БазаРаспределения;
Строка.Сумма = Окр(ОбщаяСумма \* Коэффициент, 0); // округление до рубля
КонецЦикла;
Итоговое поведение при расчёте базы: особенности
-
Метод Итог("Количество") удобен, когда структура таблицы стабильна.
-
При работе с временными таблицами из запроса (например, результат запроса Выгрузить()), также можно применять .Итог().
-
При большом объёме данных предпочтительнее использовать встроенные функции платформы (например, агрегацию прямо в запросе), а не обрабатывать вручную в цикле.
Таким образом, расчет базы распределения — это сумма значений одного из столбцов таблицы значений. Она необходима для пропорционального деления суммы между строками и должна быть рассчитана до начала основного распределения.