База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как написать функцию на 1С для пропорционального распределения суммы?
- В этой теме 1 ответ, 2 участника, последнее обновление 1 час, 39 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
24 апреля 2026 в 18:38 #36810
Есть Сумма к распределению. Есть Таблица значений(База) с Колонками: Показатель,КодIC,Сумма. Напиши функцию Которая распределит Сумму к распределению пропорционально Сумме в строках таблицы значений(База). На выходе должен получить таблицу значений с итогом по колонке Сумма = Сумма к распределению;
-
24 апреля 2026 в 18:38 #36811
Вот пример функции на 1С (BSL), которая пропорционально распределит заданную сумму по строкам таблицы значений (База) по колонке «Сумма». Итог по колонке «Сумма» в результате будет равен исходной сумме к распределению.
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960Функция РаспределитьПропорционально(СуммаКРаспределению, ТаблицаБаза)Если ТаблицаБаза = Неопределено Или ТаблицаБаза.Количество() = 0 ТогдаВозврат Новый ТаблицаЗначений;КонецЕсли;// Считаем сумму по колонке "Сумма" в базеОбщаяСумма = 0;Для Каждого Строка Из ТаблицаБаза ЦиклОбщаяСумма = ОбщаяСумма + Строка.Сумма;КонецЦикла;Если ОбщаяСумма = 0 Тогда// Если сумма базы 0, то распределить нельзя, возвращаем копию с нулямиРезультат = ТаблицаБаза.Скопировать();Для Каждого Строка Из Результат ЦиклСтрока.Сумма = 0;КонецЦикла;Возврат Результат;КонецЕсли;// Создаем новую таблицу для результатаРезультат = Новый ТаблицаЗначений;Результат.Колонки.Добавить("Показатель");Результат.Колонки.Добавить("КодIC");Результат.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));// Для корректного распределения с учетом округленияСуммаРаспределена = 0;ИндексМаксимума = 0;МаксимальноеЗначение = -1;// Найдем индекс строки с максимальной суммой (для компенсации погрешности округления)Для Номер = 0 По ТаблицаБаза.Количество() - 1 ЦиклЕсли ТаблицаБаза[Номер].Сумма > МаксимальноеЗначение ТогдаМаксимальноеЗначение = ТаблицаБаза[Номер].Сумма;ИндексМаксимума = Номер;КонецЕсли;КонецЦикла;// Распределяем сумму пропорциональноДля Номер = 0 По ТаблицаБаза.Количество() - 1 ЦиклСтрока = ТаблицаБаза[Номер];РаспределеннаяСумма = Окр(СуммаКРаспределению * Строка.Сумма / ОбщаяСумма, 2, Истина);НоваяСтрока = Результат.Добавить();НоваяСтрока.Показатель = Строка.Показатель;НоваяСтрока.КодIC = Строка.КодIC;НоваяСтрока.Сумма = РаспределеннаяСумма;СуммаРаспределена = СуммаРаспределена + РаспределеннаяСумма;КонецЦикла;// Корректируем погрешность округления на строку с максимальным значениемРазница = СуммаКРаспределению - СуммаРаспределена;Если Разница <> 0 ТогдаРезультат[ИндексМаксимума].Сумма = Результат[ИндексМаксимума].Сумма + Разница;КонецЕсли;Возврат Результат;КонецФункцииКак использовать:
1С (Код)123456789101112ТаблицаБаза = Новый ТаблицаЗначений;ТаблицаБаза.Колонки.Добавить("Показатель");ТаблицаБаза.Колонки.Добавить("КодIC");ТаблицаБаза.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));// Заполнить ТаблицаБаза даннымиСуммаКРаспределению = 10000; // напримерРаспределеннаяТаблица = РаспределитьПропорционально(СуммаКРаспределению, ТаблицаБаза);// В РаспределеннаяТаблица сумма по колонке "Сумма" будет равна 10000Функция учитывает округление до 2 знаков и компенсирует погрешность на строку с максимальным значением, чтобы итоговая сумма была точной.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.