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