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