|
v7: 7.7 Не получается раскидать сумму по списку сотрудников | ☑ | ||
---|---|---|---|---|
0
ИУБиПовиц
15.07.11
✎
13:46
|
Есть таблицаЗначений("Сотрудник","СуммаУдержанно")
И её копия ВременнаяТаблица = СоздатьОбъект("ТаблицаЗначений"); ТаблицаНалогов.Выгрузить(ВременнаяТаблица); ТаблицаНалогов.ВыбратьСтроки(); Пока ТаблицаНалогов.ПолучитьСтроку()=1 Цикл НомСтроки = НомСтроки +1; ПредСумма = ОКР(ТаблицаНалогов.СуммаУдержано * Коэффициент,0); //Если сумма будет отрицательна то нужно её раскидать по остальным ТаблицаНалогов.СуммаУдержано = Макс(ПредСумма,0); РаскидатьПолюдям = РаскидатьПолюдям +(0 - Мин(ПредСумма,0)); Если МаксСумма < ТаблицаНалогов.Сумма Тогда МаксСумма = ТаблицаНалогов.Сумма; НомСтрокиМаксСуммы = НомСтроки; КонецЕсли; КонецЦикла; колПр = 0; распределитьПоЛюдям(ТаблицаНалогов,ВременнаяТаблица,Коэффициент,РаскидатьПолюдям,КолПр); Процедура распределитьПоЛюдям(ТабНал,ВремТаб,коэф,РаскидатьПоЛюдям,колПроходов) Если КолПроходов > 20 тогда //бесконечный цикл, выход возврат; КонецЕсли; КолПроходов = КолПроходов + 1; ТабНал.ВыбратьСтроки(); Пока ТабНал.ПолучитьСтроку() = 1 цикл ВремТаб.НоваяСтрока(); ВремТаб.Сотрудник = ТабНал.Сотрудник; ВремТаб.Сумма = -ТабНал.Сумма; ВремТаб.СуммаУдержано = -ТабНал.СуммаУдержано; КонецЦикла; ВремТаб.Свернуть("Сотрудник","Сумма,СуммаУдержано"); //во временной таблице у меня суммы которые можно перечислить ВремТаб.ВыбратьСтроки(); Пока ВремТаб.ПолучитьСтроку() = 1 цикл ТабНал.новаяСтрока(); ТабНал.Сотрудник = ВремТаб.Сотрудник; ТабНал.Сумма = ВремТаб.Сумма; //ПозСтр = 0; // //табНал.НайтиЗначение(ВремТаб.Сотрудник,позСтр,"Сотрудник"); //табНал.УдалитьСтроку(позСтр); // ТабНал.СуммаУдержано = ОКР(ВремТаб.СуммаУдержано*коэф,0); РаскидатьПоЛюдям = РаскидатьПоЛюдям - ТабНал.СуммаУдержано ; КонецЦикла; ТабНал.Свернуть("Сотрудник","Сумма,СуммаУдержано"); Если РаскидатьПоЛюдям > 0 тогда РаспределитьПоЛюдям(ТабНал,ВремТаб,коэф,РаскидатьПоЛюдям,колПроходов); КонецЕсли; КонецПРоцедуры Всю сумму почему то закидывает на одного человека |
|||
1
NikVars
15.07.11
✎
14:38
|
А что говорит отладчик?!
|
|||
2
Креатив
15.07.11
✎
22:21
|
(0)Давненько не читал такого заморочного кода.
Обычные алгоритмы уже не в моде? |
|||
3
Индиго
15.07.11
✎
22:23
|
(0)А ты думал -все просто?
|
|||
4
zak555
15.07.11
✎
22:24
|
ТаблицаПартий.ВыбратьСтроки();
Пока ТаблицаПартий.ПолучитьСтроку()=1 Цикл Сч=Сч+1; Регистр.ПартииНаличие.Фирма = ТаблицаПартий.Фирма; Регистр.ПартииНаличие.МОЛ = ТаблицаПартий.МОЛ; Регистр.ПартииНаличие.Номенклатура = ТаблицаПартий.Номенклатура; Регистр.ПартииНаличие.СтатусПартии = ТаблицаПартий.СтатусПартии; Регистр.ПартииНаличие.Партия = ТаблицаПартий.Партия; Регистр.ПартииНаличие.ДатаПартии = ТаблицаПартий.ДатаПартии; Регистр.ПартииНаличие.ЦенаПрод = ТаблицаПартий.ЦенаПрод; Если Сч = КолПартий Тогда Регистр.ПартииНаличие.СуммаУпр = ОстСуммаУпр; Регистр.ПартииНаличие.СуммаРуб = ОстСуммаРуб; Регистр.ПартииНаличие.СуммаБезНДС = ОстСуммаБезНДС; Иначе Регистр.ПартииНаличие.СуммаУпр = ТаблицаПартий.СуммаУпр * КоэффУпр; Регистр.ПартииНаличие.СуммаРуб = ТаблицаПартий.СуммаРуб * КоэффРуб; Регистр.ПартииНаличие.СуммаБезНДС = ТаблицаПартий.СуммаРуб * КоэффНДС; КонецЕсли; // Если мы приходуем доп. расходы по поступлению материалов, то они всегда проводятся как // дополнительные расходы, которые в налоговом учете относятся на себестоимость. // Если мы приходуем товары, то это либо косвенные, либо транспортные расходы (в зависимости // от выбранного вида операции) Если (Лев(ТаблицаПартий.СтатусПартии.Идентификатор(), 2) = "М_") и (ВидОперации <> Перечисление.КодыОпераций.ДополнительныеРасходыВнереализационные) Тогда Регистр.ПартииНаличие.КодОперации = Перечисление.КодыОпераций.ДополнительныеРасходы; ИначеЕсли ВидОперации = Перечисление.КодыОпераций.ДополнительныеРасходы Тогда Регистр.ПартииНаличие.КодОперации = Перечисление.КодыОпераций.ДополнительныеРасходыКосвенные; Иначе Регистр.ПартииНаличие.КодОперации = ВидОперации; // Транспортные или внереализационные КонецЕсли; Регистр.ПартииНаличие.ДвижениеПриходВыполнить(); ОстСуммаУпр = ОстСуммаУпр - Окр(Регистр.ПартииНаличие.СуммаУпр,2,1); ОстСуммаРуб = ОстСуммаРуб - Окр(Регистр.ПартииНаличие.СуммаРуб,2,1); ОстСуммаБезНДС = ОстСуммаБезНДС- Окр(Регистр.ПартииНаличие.СуммаБезНДС,2,1); КонецЦикла; |
|||
5
andrewks
15.07.11
✎
22:25
|
Если КолПроходов > 20 тогда
//бесконечный цикл, выход возврат; КонецЕсли; зачёт... >20 = бесконечный |
|||
6
Индиго
15.07.11
✎
22:26
|
(4)>> Если (Лев(ТаблицаПартий.СтатусПартии.Идентификатор(), 2) = "М_")
Уже садись. Два. |
|||
7
zak555
15.07.11
✎
22:26
|
(6) это типовой код
|
|||
8
Индиго
15.07.11
✎
22:27
|
(7)Нет.
|
|||
9
andrewks
15.07.11
✎
22:27
|
(6) мдэ... это к г-ну Нуралиеву?
|
|||
10
Индиго
15.07.11
✎
22:27
|
(9):-)... Не воспримет.
Поэтому- просто так. |
|||
15
zak555
15.07.11
✎
22:32
|
жесть
|
|||
16
Sk0rp
15.07.11
✎
22:32
|
Честное распределение суммы по таблице значений:
http://infostart.ru/public/16630/ |
|||
17
Креатив
15.07.11
✎
22:58
|
(16)Баловался я таким алгоритмом году этак в 2005. Есть только один минус. Отсутствует временная устойчивость. Точнее её можно сделать, если считать нарастающий за весь период - нарастающий за предыдущий период.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |