Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
22 Сен 2017, 05:39
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Расчет стоимости обучения  (Прочитано 468 раз)

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

Оффлайн GanG031

  • ***
  • Сообщений: 150
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2015-10-28
  • Сайт: 
  • Профессия: Ученик 1С
Доброго времени суток! Суть в следующем: Имеется процедура, которая рассчитывает сумму обучения за год. Вот скрин: Вот код:

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

   тт=?((ДатаМесяц(ДатаДок)>=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

  • ***
  • Сообщений: 150
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2015-10-28
  • Сайт: 
  • Профессия: Ученик 1С
Уже решил проблему


Теги:
 


* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

oleg-x
162 Сообщений
alex0402
85 Сообщений
Геннадий ОбьГЭС Геннадий ОбьГЭС
81 Сообщений
Golickoff Golickoff
32 Сообщений
Kironten
29 Сообщений
ilyay ilyay
27 Сообщений
AIFrame
26 Сообщений
BuhRust
25 Сообщений
AsadRoman
22 Сообщений
Варвар
20 Сообщений

* Кто онлайн

  • Точка Гостей: 300
  • Точка Скрытых: 0
  • Точка Пользователей: 5
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal