Помогите разобраться с модулем :'(
15.12.2008
13:04
#1
"Помогите пожалуйста!!!
Конфигурация 1С ХроноГраф Тарификация.
Справочник Тарифицирование сотрудников - Тарификационная карточка.
Если задана какая-то должность и Способ расчета оклада = Сумма (1000), то когда добавляем Начисление, к примеру "Доплата 10% от оклада" (способ расчета-"%от начисл") задаем в базе Должность,он считает правильно(100), а если добавить начисление допустим Северная надбавка 80%, где в базу уже помимо Должности добавляются и все остальные начисления, он считает такое...Берет оклад правильно=1000, Доплату 10% УЖЕ ставит = 1800, и в итоге получается Северн.надбавка = 2240 (вместо 1320)!!!
Тут кусок модуля:
лРезультат = СокрЛП(мРазмер_Текст);лНадбавкаЗаТетради = 0;
Если Начисление.СпособРасчета <> Перечисление.СпособыРасчета.ПроцентОтНачислений Тогда
Если(СпособРасчета<>Перечисление.СпособыРасчета.ПоТарифу)или(ПустоеЗначение(Примечание)=0)Тогда
лНачисленно = мБазоваяСумма();
КонецЕсли;
Иначе
мДеревоНадбавок.УдалитьСтроки();
лНачисленно = мРассчитатьСуммуНадбавки(Начисление);
лТекст = """";лДлина = 33;
Если(мДеревоНадбавок.КоличествоСтрок() > 0)Тогда
лНачислениеСотрудника = мДеревоНадбавок.ПолучитьЗначение(1, "НачислениеСотрудника");
лТаблицаНадбавок = мДеревоНадбавок.ПолучитьЗначение(1, "ТаблицаНадбавок");
лКоэффициент = мДеревоНадбавок.ПолучитьЗначение(1, "Коэффициент");
лБазоваяСумма = мДеревоНадбавок.ПолучитьЗначение(1, "БазоваяСумма");
БазаДляПроцентов.УдалитьСтроки();
Если лБазоваяСумма > 0 Тогда
Для Б = 1 По лТаблицаНадбавок.КоличествоСтрок() Цикл
лНачислениеСотрудникаДоп = лТаблицаНадбавок.ПолучитьЗначение(Б, "НачислениеСотрудника");
лБазоваяСуммаДоп = лТаблицаНадбавок.ПолучитьЗначение(Б, "БазоваяСумма");
лСумма = лТаблицаНадбавок.ПолучитьЗначение(Б, "Сумма");
лНомер = БазаДляПроцентов.НоваяСтрока();
БазаДляПроцентов.УстановитьЗначение(лНомер,"Начисление",СокрЛП(лНачислениеСотрудникаДоп.Начисление.Наименование));
БазаДляПроцентов.УстановитьЗначение(лНомер,"Сумма",лБазоваяСуммаДоп);
КонецЦикла;
лНомер = БазаДляПроцентов.НоваяСтрока();
БазаДляПроцентов.УстановитьЗначение(лНомер,"Начисление","Итого:");
БазаДляПроцентов.УстановитьЗначение(лНомер,"Сумма",лБазоваяСумма);
БазаДляПроцентов.ТекущаяСтрока(БазаДляПроцентов.КоличествоСтрок());
БазаДляПроцентов.ТекущаяКолонка(2);
КонецЕсли;
КонецЕсли;
КонецЕсли;"
Конфигурация 1С ХроноГраф Тарификация.
Справочник Тарифицирование сотрудников - Тарификационная карточка.
Если задана какая-то должность и Способ расчета оклада = Сумма (1000), то когда добавляем Начисление, к примеру "Доплата 10% от оклада" (способ расчета-"%от начисл") задаем в базе Должность,он считает правильно(100), а если добавить начисление допустим Северная надбавка 80%, где в базу уже помимо Должности добавляются и все остальные начисления, он считает такое...Берет оклад правильно=1000, Доплату 10% УЖЕ ставит = 1800, и в итоге получается Северн.надбавка = 2240 (вместо 1320)!!!
Тут кусок модуля:
лРезультат = СокрЛП(мРазмер_Текст);лНадбавкаЗаТетради = 0;
Если Начисление.СпособРасчета <> Перечисление.СпособыРасчета.ПроцентОтНачислений Тогда
Если(СпособРасчета<>Перечисление.СпособыРасчета.ПоТарифу)или(ПустоеЗначение(Примечание)=0)Тогда
лНачисленно = мБазоваяСумма();
КонецЕсли;
Иначе
мДеревоНадбавок.УдалитьСтроки();
лНачисленно = мРассчитатьСуммуНадбавки(Начисление);
лТекст = """";лДлина = 33;
Если(мДеревоНадбавок.КоличествоСтрок() > 0)Тогда
лНачислениеСотрудника = мДеревоНадбавок.ПолучитьЗначение(1, "НачислениеСотрудника");
лТаблицаНадбавок = мДеревоНадбавок.ПолучитьЗначение(1, "ТаблицаНадбавок");
лКоэффициент = мДеревоНадбавок.ПолучитьЗначение(1, "Коэффициент");
лБазоваяСумма = мДеревоНадбавок.ПолучитьЗначение(1, "БазоваяСумма");
БазаДляПроцентов.УдалитьСтроки();
Если лБазоваяСумма > 0 Тогда
Для Б = 1 По лТаблицаНадбавок.КоличествоСтрок() Цикл
лНачислениеСотрудникаДоп = лТаблицаНадбавок.ПолучитьЗначение(Б, "НачислениеСотрудника");
лБазоваяСуммаДоп = лТаблицаНадбавок.ПолучитьЗначение(Б, "БазоваяСумма");
лСумма = лТаблицаНадбавок.ПолучитьЗначение(Б, "Сумма");
лНомер = БазаДляПроцентов.НоваяСтрока();
БазаДляПроцентов.УстановитьЗначение(лНомер,"Начисление",СокрЛП(лНачислениеСотрудникаДоп.Начисление.Наименование));
БазаДляПроцентов.УстановитьЗначение(лНомер,"Сумма",лБазоваяСуммаДоп);
КонецЦикла;
лНомер = БазаДляПроцентов.НоваяСтрока();
БазаДляПроцентов.УстановитьЗначение(лНомер,"Начисление","Итого:");
БазаДляПроцентов.УстановитьЗначение(лНомер,"Сумма",лБазоваяСумма);
БазаДляПроцентов.ТекущаяСтрока(БазаДляПроцентов.КоличествоСтрок());
БазаДляПроцентов.ТекущаяКолонка(2);
КонецЕсли;
КонецЕсли;
КонецЕсли;"
15.12.2008
14:20
#2
Так вы в отладчике и пройдите по этому куску - увидите, откуда у программы такие суммы
18.12.2008
11:12
#4
"Вот еще кусочек может тут:
Функция РасчитатьСуммуСотрудника(Сотрудник)
//Функция производит подсчет суммы по тарификации сотрудника на текущую дату.
СпрНачисленияСотрудника.ИспользоватьВладельца(Сотрудник);
СпрНачисленияСотрудника.ВыбратьЭлементы();
Сумма = 0;
Пока СпрНачисленияСотрудника.ПолучитьЭлемент() <> 0 Цикл
Если (ДействуетНачислениеСотрудника(СпрНачисленияСотрудника.ТекущийЭлемент(),ТекДата) = 1) Тогда
лНачисленно = 0;
Если СпрНачисленияСотрудника.Начисление.СпособРасчета<>Перечисление.СпособыРасчета.ПроцентОтНачислений Тогда
бс=БазоваяСумма(СпрНачисленияСотрудника.ТекущийЭлемент(), ТекДата);
//бс=?(бс=-1,0,бс);
лНачисленно = бс;
Иначе
с=РассчитатьСуммуНадбавки(СпрНачисленияСотрудника.начисление, ПолучитьПустоеЗначение(), СпрНачисленияСотрудника.Владелец, ТекДата,0, СпрНачисленияСотрудника.ТекущийЭлемент());
лНачисленно = с;
КонецЕсли;
Сумма = Сумма + лНачисленно;
КонецЕсли;
КонецЦикла;
Возврат Сумма;
КонецФункции"
Функция РасчитатьСуммуСотрудника(Сотрудник)
//Функция производит подсчет суммы по тарификации сотрудника на текущую дату.
СпрНачисленияСотрудника.ИспользоватьВладельца(Сотрудник);
СпрНачисленияСотрудника.ВыбратьЭлементы();
Сумма = 0;
Пока СпрНачисленияСотрудника.ПолучитьЭлемент() <> 0 Цикл
Если (ДействуетНачислениеСотрудника(СпрНачисленияСотрудника.ТекущийЭлемент(),ТекДата) = 1) Тогда
лНачисленно = 0;
Если СпрНачисленияСотрудника.Начисление.СпособРасчета<>Перечисление.СпособыРасчета.ПроцентОтНачислений Тогда
бс=БазоваяСумма(СпрНачисленияСотрудника.ТекущийЭлемент(), ТекДата);
//бс=?(бс=-1,0,бс);
лНачисленно = бс;
Иначе
с=РассчитатьСуммуНадбавки(СпрНачисленияСотрудника.начисление, ПолучитьПустоеЗначение(), СпрНачисленияСотрудника.Владелец, ТекДата,0, СпрНачисленияСотрудника.ТекущийЭлемент());
лНачисленно = с;
КонецЕсли;
Сумма = Сумма + лНачисленно;
КонецЕсли;
КонецЦикла;
Возврат Сумма;
КонецФункции"
26.12.2008
14:53
#6
"Функция мБазоваяСумма(лНачисление = """",лТипНагрузки = """", лПроценты = """", лНадбавка_Руб = """", лНадбавка_Проц = """") Экспорт
Если(ПустоеЗначение(лНачисление) = 1)Тогда
лНачисление = Начисление;
КонецЕсли;
Если(ПустоеЗначение(лТипНагрузки) = 1)Тогда
лТипНагрузки = ТипНагрузки;
КонецЕсли;
Если(лПроценты = """")Тогда
лПроценты = Проценты;
КонецЕсли;
Если(лНадбавка_Руб = """")Тогда
лНадбавка_Руб = Надбавка_Руб;
КонецЕсли;
Если(лНадбавка_Проц = """")Тогда
лНадбавка_Проц = Надбавка_Проц;
КонецЕсли;
лВидТарифнойСетки = ВидТарифнойСетки;
Если СпособРасчетаЧасВНед(лНачисление.СпособРасчета) = 1 Тогда
Возврат мРасчитатьсяЗаЧасы(лНачисление.СпособРасчета);
ИначеЕсли лНачисление.СпособРасчета=Перечисление.СпособыРасчета.СтавкаПоРазряду Тогда
лСтавка = ПолучитьСуммуИзЕТС (Разряд, лВидТарифнойСетки, ТекДата,БезМестныхНадбавок,БезДоплат);
лСтавка = лСтавка + лНадбавка_Руб + лСтавка * лНадбавка_Проц/100;
лСтавка = размер * лСтавка;
Если Коэффициент <> 0 Тогда
лСтавка = лСтавка * Коэффициент;
КонецЕсли;
лСтавка = Окр(лСтавка,2);
Возврат лСтавка;
ИначеЕсли лНачисление.СпособРасчета=Перечисление.СпособыРасчета.ПроцентОтСтавки Тогда
лСтавка = ПолучитьСуммуИзЕТС (Разряд, лВидТарифнойСетки,ТекДата,БезМестныхНадбавок,БезДоплат);
лСтавка = лСтавка + лНадбавка_Руб + лСтавка * лНадбавка_Проц/100;
лСтавка = лСтавка * проценты/100;
Если Коэффициент <> 0 Тогда
лСтавка = лСтавка * Коэффициент;
КонецЕсли;
лСтавка = Окр(лСтавка,2);
Возврат лСтавка;
ИначеЕсли лНачисление.СпособРасчета=Перечисление.СпособыРасчета.СуммаФиксированная Тогда
лСтавка = размер;
Если Коэффициент <> 0 Тогда
лСтавка = лСтавка * Коэффициент;
КонецЕсли;
Возврат Окр(лСтавка,2);
ИначеЕсли лНачисление.СпособРасчета=Перечисление.СпособыРасчета.ПроцентОтНагрузки Тогда
Возврат мРасчитатьсяЗаЧасы(лТипНагрузки,лПроценты, лНадбавка_Руб, лНадбавка_Проц);
КонецЕсли;
КонецФункции
Функция мРассчитатьСуммуНадбавки (лНачисление, доб = 0) Экспорт
нач_сотр=СоздатьОбъект("Справочник.НачисленияСотрудника");
нач_сотр.ИспользоватьВладельца(Владелец);
коэф=проценты/100+доб;
лНайдено = 0;лНомерСтрокиДерева = 0;
Если(ТипЗначенияСтр(мДеревоНадбавок)="ТаблицаЗначений")Тогда
лНомер = """";
Если(мДеревоНадбавок.НайтиЗначение(ТекущийЭлемент(), лНомер, "НачислениеСотрудника")=1)Тогда
лТаблицаНадбавок = мДеревоНадбавок.ПолучитьЗначение(лНомер, "ТаблицаНадбавок");
лНайдено = 1;
КонецЕсли;
КонецЕсли;
Если(лНайдено = 0)Тогда
лТаблицаНадбавок = СоздатьОбъект("ТаблицаЗначений");
лТаблицаНадбавок.НоваяКолонка("НачислениеСотрудника");
лТаблицаНадбавок.НоваяКолонка("БазоваяСумма");
лТаблицаНадбавок.НоваяКолонка("Сумма");
Если(ТипЗначенияСтр(мДеревоНадбавок)="ТаблицаЗначений")Тогда
лНомерСтрокиДерева = мДеревоНадбавок.НоваяСтрока();
мДеревоНадбавок.УстановитьЗначение(лНомерСтрокиДерева, "НачислениеСотрудника", ТекущийЭлемент());
мДеревоНадбавок.УстановитьЗначение(лНомерСтрокиДерева, "ТаблицаНадбавок", лТаблицаНадбавок);
мДеревоНадбавок.УстановитьЗначение(лНомерСтрокиДерева, "Коэффициент", коэф);
КонецЕсли;
КонецЕсли;
база=СоздатьОбъект("Справочник.БазаНачисления");
база.ИспользоватьВладельца(Начисление);
база.ВыбратьЭлементы();
сум=0;лБазоваяСумма = 0;
Пока база.ПолучитьЭлемент()<>0 Цикл
нач_сотр.ВыбратьЭлементыПоРеквизиту("Начисление",база.начисление);
Пока нач_сотр.ПолучитьЭлемент()>0 Цикл
Если(нач_сотр.Должность = Должность)и(ТекущийЭлемент() <> нач_сотр.ТекущийЭлемент())Тогда
Если ДействуетНачислениеСотрудника (нач_сотр.ТекущийЭлемент(), ТекДата)=1 Тогда
//Если (ПустоеЗначение(Источник)=1) или (нач_сотр.Источник=Источник) Тогда
лНомер = """";
Если(лТаблицаНадбавок.НайтиЗначение(нач_сотр.ТекущийЭлемент(), лНомер, "НачислениеСотрудника")=0)Тогда
лНомер = лТаблицаНадбавок.НоваяСтрока();
лТаблицаНадбавок.УстановитьЗначение(лНомер, "НачислениеСотрудника", нач_сотр.ТекущийЭлемент());
Если база.Начисление.СпособРасчета=Перечисление.СпособыРасчета.ПроцентОтНачислений Тогда
бс = мРассчитатьСуммуНадбавки(база.Начисление,1);
Иначе
бс=БазоваяСумма(нач_сотр.ТекущийЭлемент(), ТекДата);
КонецЕсли;
лТаблицаНадбавок.УстановитьЗначение(лНомер, "БазоваяСумма", бс);
Иначе
бс = лТаблицаНадбавок.ПолучитьЗначение(лНомер, "БазоваяСумма");
КонецЕсли;
лБазоваяСумма = лБазоваяСумма + бс;
лНадбавка = коэф*бс;
сум=сум+лНадбавка;
лТаблицаНадбавок.УстановитьЗначение(лНомер, "Сумма", Число(лТаблицаНадбавок.ПолучитьЗначение(лНомер, "Сумма")) + лНадбавка);
//КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если(лНомерСтрокиДерева > 0)Тогда
мДеревоНадбавок.УстановитьЗначение(лНомерСтрокиДерева, "БазоваяСумма", лБазоваяСумма);
КонецЕсли;
Если Коэффициент <> 0 Тогда
Сум = Сум * Коэффициент;
КонецЕсли;
Возврат Окр(Сум,2);
КонецФункции"
Если(ПустоеЗначение(лНачисление) = 1)Тогда
лНачисление = Начисление;
КонецЕсли;
Если(ПустоеЗначение(лТипНагрузки) = 1)Тогда
лТипНагрузки = ТипНагрузки;
КонецЕсли;
Если(лПроценты = """")Тогда
лПроценты = Проценты;
КонецЕсли;
Если(лНадбавка_Руб = """")Тогда
лНадбавка_Руб = Надбавка_Руб;
КонецЕсли;
Если(лНадбавка_Проц = """")Тогда
лНадбавка_Проц = Надбавка_Проц;
КонецЕсли;
лВидТарифнойСетки = ВидТарифнойСетки;
Если СпособРасчетаЧасВНед(лНачисление.СпособРасчета) = 1 Тогда
Возврат мРасчитатьсяЗаЧасы(лНачисление.СпособРасчета);
ИначеЕсли лНачисление.СпособРасчета=Перечисление.СпособыРасчета.СтавкаПоРазряду Тогда
лСтавка = ПолучитьСуммуИзЕТС (Разряд, лВидТарифнойСетки, ТекДата,БезМестныхНадбавок,БезДоплат);
лСтавка = лСтавка + лНадбавка_Руб + лСтавка * лНадбавка_Проц/100;
лСтавка = размер * лСтавка;
Если Коэффициент <> 0 Тогда
лСтавка = лСтавка * Коэффициент;
КонецЕсли;
лСтавка = Окр(лСтавка,2);
Возврат лСтавка;
ИначеЕсли лНачисление.СпособРасчета=Перечисление.СпособыРасчета.ПроцентОтСтавки Тогда
лСтавка = ПолучитьСуммуИзЕТС (Разряд, лВидТарифнойСетки,ТекДата,БезМестныхНадбавок,БезДоплат);
лСтавка = лСтавка + лНадбавка_Руб + лСтавка * лНадбавка_Проц/100;
лСтавка = лСтавка * проценты/100;
Если Коэффициент <> 0 Тогда
лСтавка = лСтавка * Коэффициент;
КонецЕсли;
лСтавка = Окр(лСтавка,2);
Возврат лСтавка;
ИначеЕсли лНачисление.СпособРасчета=Перечисление.СпособыРасчета.СуммаФиксированная Тогда
лСтавка = размер;
Если Коэффициент <> 0 Тогда
лСтавка = лСтавка * Коэффициент;
КонецЕсли;
Возврат Окр(лСтавка,2);
ИначеЕсли лНачисление.СпособРасчета=Перечисление.СпособыРасчета.ПроцентОтНагрузки Тогда
Возврат мРасчитатьсяЗаЧасы(лТипНагрузки,лПроценты, лНадбавка_Руб, лНадбавка_Проц);
КонецЕсли;
КонецФункции
Функция мРассчитатьСуммуНадбавки (лНачисление, доб = 0) Экспорт
нач_сотр=СоздатьОбъект("Справочник.НачисленияСотрудника");
нач_сотр.ИспользоватьВладельца(Владелец);
коэф=проценты/100+доб;
лНайдено = 0;лНомерСтрокиДерева = 0;
Если(ТипЗначенияСтр(мДеревоНадбавок)="ТаблицаЗначений")Тогда
лНомер = """";
Если(мДеревоНадбавок.НайтиЗначение(ТекущийЭлемент(), лНомер, "НачислениеСотрудника")=1)Тогда
лТаблицаНадбавок = мДеревоНадбавок.ПолучитьЗначение(лНомер, "ТаблицаНадбавок");
лНайдено = 1;
КонецЕсли;
КонецЕсли;
Если(лНайдено = 0)Тогда
лТаблицаНадбавок = СоздатьОбъект("ТаблицаЗначений");
лТаблицаНадбавок.НоваяКолонка("НачислениеСотрудника");
лТаблицаНадбавок.НоваяКолонка("БазоваяСумма");
лТаблицаНадбавок.НоваяКолонка("Сумма");
Если(ТипЗначенияСтр(мДеревоНадбавок)="ТаблицаЗначений")Тогда
лНомерСтрокиДерева = мДеревоНадбавок.НоваяСтрока();
мДеревоНадбавок.УстановитьЗначение(лНомерСтрокиДерева, "НачислениеСотрудника", ТекущийЭлемент());
мДеревоНадбавок.УстановитьЗначение(лНомерСтрокиДерева, "ТаблицаНадбавок", лТаблицаНадбавок);
мДеревоНадбавок.УстановитьЗначение(лНомерСтрокиДерева, "Коэффициент", коэф);
КонецЕсли;
КонецЕсли;
база=СоздатьОбъект("Справочник.БазаНачисления");
база.ИспользоватьВладельца(Начисление);
база.ВыбратьЭлементы();
сум=0;лБазоваяСумма = 0;
Пока база.ПолучитьЭлемент()<>0 Цикл
нач_сотр.ВыбратьЭлементыПоРеквизиту("Начисление",база.начисление);
Пока нач_сотр.ПолучитьЭлемент()>0 Цикл
Если(нач_сотр.Должность = Должность)и(ТекущийЭлемент() <> нач_сотр.ТекущийЭлемент())Тогда
Если ДействуетНачислениеСотрудника (нач_сотр.ТекущийЭлемент(), ТекДата)=1 Тогда
//Если (ПустоеЗначение(Источник)=1) или (нач_сотр.Источник=Источник) Тогда
лНомер = """";
Если(лТаблицаНадбавок.НайтиЗначение(нач_сотр.ТекущийЭлемент(), лНомер, "НачислениеСотрудника")=0)Тогда
лНомер = лТаблицаНадбавок.НоваяСтрока();
лТаблицаНадбавок.УстановитьЗначение(лНомер, "НачислениеСотрудника", нач_сотр.ТекущийЭлемент());
Если база.Начисление.СпособРасчета=Перечисление.СпособыРасчета.ПроцентОтНачислений Тогда
бс = мРассчитатьСуммуНадбавки(база.Начисление,1);
Иначе
бс=БазоваяСумма(нач_сотр.ТекущийЭлемент(), ТекДата);
КонецЕсли;
лТаблицаНадбавок.УстановитьЗначение(лНомер, "БазоваяСумма", бс);
Иначе
бс = лТаблицаНадбавок.ПолучитьЗначение(лНомер, "БазоваяСумма");
КонецЕсли;
лБазоваяСумма = лБазоваяСумма + бс;
лНадбавка = коэф*бс;
сум=сум+лНадбавка;
лТаблицаНадбавок.УстановитьЗначение(лНомер, "Сумма", Число(лТаблицаНадбавок.ПолучитьЗначение(лНомер, "Сумма")) + лНадбавка);
//КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если(лНомерСтрокиДерева > 0)Тогда
мДеревоНадбавок.УстановитьЗначение(лНомерСтрокиДерева, "БазоваяСумма", лБазоваяСумма);
КонецЕсли;
Если Коэффициент <> 0 Тогда
Сум = Сум * Коэффициент;
КонецЕсли;
Возврат Окр(Сум,2);
КонецФункции"
Читают тему
(гостей: 1)