Как рассчитать базу распределения (итог столбца количество)?

В платформе 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); // округление до рубля
КонецЦикла;

Итоговое поведение при расчёте базы: особенности

  • Метод Итог("Количество") удобен, когда структура таблицы стабильна.

  • При работе с временными таблицами из запроса (например, результат запроса Выгрузить()), также можно применять .Итог().

  • При большом объёме данных предпочтительнее использовать встроенные функции платформы (например, агрегацию прямо в запросе), а не обрабатывать вручную в цикле.

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