Имя: Пароль:
1C
1C 7.7
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. Есть только один минус. Отсутствует временная устойчивость. Точнее её можно сделать, если считать нарастающий за весь период - нарастающий за предыдущий период.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший