Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 15:04

Расчет стоимости обучения

Автор GanG031, 16 ноя 2015, 10:17

0 Пользователей и 1 гость просматривают эту тему.

GanG031

Доброго времени суток! Суть в следующем: Имеется процедура, которая рассчитывает сумму обучения за год. Вот скрин: Вот код:

Процедура Расчитать()

   тт=?((ДатаМесяц(ДатаДок)>=9) и (ДатаМесяц(ДатаДок)<=12),0,1); // учтем что перевод может быть после нового года
   Дата01_09 = Дата("01.09."+строка(ДатаГод(ДатаДок)-тт));
   Дата31_08 = ДобавитьМесяц(Дата01_09,12)-1;
   
   ВыбратьСтроки();
   Пока ПолучитьСтроку()=1 Цикл
      
      //нРасценка = ПолучитьРасценку(тФилиал,тФормаОбучения,тФакультет,тСпециальность,тСрокОбучения,тКурс);
      Если флЗаполнитьВсе = 1 Тогда
         НачПериод = ?(НачПериод = Дата(0),ДатаДок,НачПериод);
          тФилиал = тСтудент.Филиал.Получить(НачПериод);
         тСрокОбучения = тСтудент.ТочныйСрокОб.Получить(НачПериод);
         тФормаОбучения = тСтудент.ФормаОбучения.Получить(НачПериод);
         тФакультет = тСтудент.Факультет.Получить(НачПериод);   
         тСпециальность = тСтудент.СпециальностьОбучения.Получить(НачПериод);
          тКурс = тСтудент.Курс.Получить(НачПериод);
         тКонтрагент = тСтудент.Контр;
         СтоимостьГод = 0;
         СуммаЗадолж = 0;
         Скидка = 0;
         КонПериод = Дата(0);
      КонецЕсли;
      нРасценка = ПолучитьРасценку(тФилиал,тФормаОбучения,тФакультет,тСпециальность,тСрокОбучения,тКурс);
      Если нРасценка.Выбран()=0 Тогда
         Сообщить("Для строки "+НомерСтроки+" не определена расценка. Видимо приказ на зачисление сделан более поздней датой");
         Продолжить;
      КонецЕсли; 
      
      Состояние("Расчитывем данные по "+тСтудент);
      
      тзИстория = глПолучитьТаблицуИсторииРеквизитов(тСтудент, Дата01_09, ДатаДок,"Филиал,ФормаОбучения,Факультет,СпециальностьОбучения,ТочныйСрокОб,Курс,Скидка");
      ВсегоСтрок=тзИстория.КоличествоСтрок();
      Если ВсегоСтрок=0 Тогда
         Сообщить("Для студента в строке "+НомерСтроки+" не найден приказ на зачисление или дата начала учебного года.");
         Продолжить;
      КонецЕсли;
      
      Если нРасценка.Факультет.флФПК = 1 Тогда
         тзИстория.ВыбратьСтроки();
         Пока тзИстория.ПолучитьСтроку()=1 Цикл
            Если тзИстория.Документ.Вид()<>"_Приказ" Тогда Продолжить; КонецЕсли;
            Если тзИстория.Документ.ДатаДок > ДатаДок Тогда Продолжить; КонецЕсли;
            Если тзИстория.Филиал<>тФилиал Тогда Продолжить; КонецЕсли;
            Если тзИстория.ФормаОбучения<>тФормаОбучения Тогда Продолжить; КонецЕсли;
            Если тзИстория.Факультет<>тФакультет Тогда Продолжить; КонецЕсли;
            Если тзИстория.СпециальностьОбучения<>тСпециальность Тогда Продолжить; КонецЕсли;
            Если тзИстория.Курс<>тКурс Тогда Продолжить; КонецЕсли;
            Док_Приказ = тзИстория.Документ;
            НачалоУчебногоГода = Док_Приказ.ДатаДок;
            КонецУчебногоГода = НачалоУчебногоГода + нРасценка.Факультет.ЧислоДней - 1;         
         КонецЦикла; // по истории
         //История = СоздатьОбъект("Периодический");
         //История.ИспользоватьОбъект("Факультет",тСтудент);
         //История.НайтиЗначение(ДатаДок-1,-1);
         //Док_Приказ = История.ТекущийДокумент();
         //НачалоУчебногоГода = Док_Приказ.ДатаДок;
         //КонецУчебногоГода = НачалоУчебногоГода + нРасценка.Факультет.ЧислоДней - 1;         
        Иначе
         УчебныйГод = 12; //кол. месяцев в текущем учебном году;
         ПолныйКурс = нРасценка.Курс*12;
         ДнейВУчебномГоду = 0;
// если это последний курс то УчебныйГод может быть < 12 месяцев      
         Если нРасценка.ТочныйСрокОбучения.Выбран()=1 Тогда
            Если ПолныйКурс>нРасценка.ТочныйСрокОбучения.ЧислоМесяцев Тогда
               УчебныйГод = УчебныйГод - (ПолныйКурс-нРасценка.ТочныйСрокОбучения.ЧислоМесяцев);
            КонецЕсли;
         КонецЕсли;  // это кол мес в учебном году
// последний курс может быть не поным
         НачалоУчебногоГода = Дата(0);
         КонецУчебногоГода = Дата(0);
         НайденПриказНаЗачисления = 0;
         
         тзИстория.ВыбратьСтроки();
         Пока тзИстория.ПолучитьСтроку()=1 Цикл
            Если ПустоеЗначение(тзИстория.Документ)=1 Тогда Продолжить; КонецЕсли;
            Если тзИстория.Документ.Вид()<>"_Приказ" Тогда Продолжить; КонецЕсли;
            Если тзИстория.Документ.ДатаДок > ДатаДок Тогда Продолжить; КонецЕсли;
            Если тзИстория.Филиал<>тФилиал Тогда Продолжить; КонецЕсли;
            Если тзИстория.ФормаОбучения<>тФормаОбучения Тогда Продолжить; КонецЕсли;
            Если тзИстория.Факультет<>тФакультет Тогда Продолжить; КонецЕсли;
            Если тзИстория.СпециальностьОбучения<>тСпециальность Тогда Продолжить; КонецЕсли;
            Если тзИстория.Курс<>тКурс Тогда Продолжить; КонецЕсли;

            Если (тзИстория.Документ.ВидПриказа = Перечисление.ВидыПриказов.Зачисление) или
              (тзИстория.Документ.ВидПриказа = Перечисление.ВидыПриказов.ЗачислениеДопНаборПолнаяОплата) или
              (тзИстория.Документ.ВидПриказа = Перечисление.ВидыПриказов.ЗачислениеДопНаборЧастичнаяОплата) или
              (тзИстория.Документ.ВидПриказа = Перечисление.ВидыПриказов.Перевод) или
              (тзИстория.Документ.ВидПриказа = Перечисление.ВидыПриказов.ПереводДопНаборПолнаяОплата) или
              (тзИстория.Документ.ВидПриказа = Перечисление.ВидыПриказов.ПереводДопНаборЧастичнаяОплата)  Тогда
               тз = СоздатьОбъект("ТаблицаЗначений");
               тзИстория.Документ.ВыгрузитьТабличнуюЧасть(тз);
               поз="";
               Если тз.НайтиЗначение(тСтудент, поз, "тСтудент")=1 Тогда
                  НачалоУчебногоГода = тз.ПолучитьЗначение(поз, "нНачУчебногоГода");
                  КонецУчебногоГода = ДобавитьМесяц(НачалоУчебногоГода,УчебныйГод) - 1;
                  КонецУчебногоГода = Мин(КонецУчебногоГода, Дата31_08);
                  НачДатаЗачета = Макс(тзИстория.Документ.ДатаДок, НачМесяца(ДатаДок));
                  ПроцентСкидки = тзИстория.Скидка;
                  НайденПриказНаЗачисления = 1;
               КонецЕсли;
            КонецЕсли;
         КонецЦикла; // по истории
         
         Если (НайденПриказНаЗачисления = 0) или (КонецУчебногоГода - НачалоУчебногоГода + 1<=0) Тогда
            Сообщить("Для студента в строке "+НомерСтроки+" не найден приказ на зачисление или дата начала учебного года.");
            Продолжить;
         КонецЕсли;
      КонецЕсли;//флФПК = 1
      
      Если (КонПериод = Дата(0)) или (флЗаполнитьВсе = 1) Тогда
         КонПериод = КонецУчебногоГода;
      КонецЕсли;
      
      СтоимостьГод = 0;
      СуммаЗадолж = 0;
      Скидка = 0;
      нСуммаЗаГод=0;
      
// Для курсов ФПК начисляем   за период взятый из Спр.Факультеты. Там же стоимость всего периода
      Если  тФакультет.флФПК = 1 Тогда
         КонПериод = ?(КонПериод = Дата(0),НачПериод + тФакультет.ЧислоДней - 1,КонПериод);
         СтоимостьГод = тФакультет.СуммаКурса;
         СуммаЗадолж = СтоимостьГод*((КонПериод - НачПериод +1)/тФакультет.ЧислоДней);
         Скидка = тФакультет.СуммаКурса/тФакультет.ЧислоДней/100*ПроцентСкидки*(КонПериод-НачПериод+1);
         Продолжить;
      КонецЕсли;
           
      Если нРасценка.Выбран()=0 Тогда
         Сообщить("По строке "+НомерСтроки+" не определена расценка");
         Продолжить;
      КонецЕсли;
      нСуммаЗаГод = нРасценка.СтоимостьГодаОбучения.Получить(НачПериод);
// Если не ФПК то дальше по стандарту
// посчитаем сколько дней в учебном году с учетом курса.         
      Если УчебныйГод<=0 Тогда
         Сообщить("По строке "+НомерСтроки+" не задан точный срок обучения.");
         Продолжить;
      КонецЕсли;

// теперь найдем границы интервала начисления
      ДнейВУчебномГоду = КонецУчебногоГода - НачалоУчебногоГода + 1;// 365 (366)
      ЦенаДня = нСуммаЗаГод/(ДнейВУчебномГоду);
      
   СуммаНачислить = ЦенаДня*(КонПериод-НачПериод+1);
   
      СтоимостьГод = нСуммаЗаГод;
   
      СуммаЗадолж = СуммаНачислить; //СтоимостьГод/УчебныйГод;// получаем стоимость месяца;
      СкидкаЗаГод = СтоимостьГод/100*ПроцентСкидки;
      Скидка = СкидкаЗаГод/ДнейВУчебномГоду*(КонПериод-НачПериод+1);
      
   КонецЦикла;// по таб части
                         
КонецПроцедуры //Расчитать


Вот как я понимаю строка, в которой начисляется сама сумма : СуммаНачислить = ЦенаДня*(КонПериод-НачПериод+1); Начальство сказало переделать теперь процедуру начисления таким образом: Если сстудент зачисляется с 1 сентября по 31 декабря, то считает сумма будет равна 100 процентам, а если с 1 января, по 31 августа, то 50 процентам. Подскажите, как это реализовать? Не могу додуматься до данного кода. Думал с помощью переключателей сделать, если выбран первый допустим переключатель, то считает полную сумму, а если второй, то считает 50 процентов. Подскажите правильное рациональное решение! Заранее спасибо!

GanG031


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск