В начало

Документ «РассрочкаПлатежа»

 

            Необходимо раскидать сумму по заданным периодам с учетом первого платежа. В документе должно быть два периода (10 дней и месяц).

            Документ «Рассрочка платежа» имеет следующие реквизиты: ДатаНачала (тип Дата), ДатаОкончания (тип Дата), СуммаДолга (тип Число), п50 (тип Число), ПериодичностьОплаты (тип Число). Также есть табличная часть «ГрафикПлатежей» с реквизитами: Дата (тип Дата), Сумма (тип Число) и НадоОплатитьПоГрафику (тип Число).

Рис. Структура документа «Рассрочка платежа»

 

            Далее приведена форма документа «Рассрочка платежа».

Рис. Форма документа в конфигураторе

 

            Элемент формы «ПериодичностьОплаты» имеет свойства «РежимВыбораИзСписка» и заполнен «СписокВыбора».

Рис. Свойства элемента формы «ПериодичностьОплаты»

            Далее приведен список процедур в модуле формы.

 

Листинг. Содержимое модуля формы документа «Рассрочка платежа»

&НаКлиенте

Процедура ДатаНачалаПриИзменении(Элемент)           

            ПроверитьРеквизитыДляГрафика(); 

            ОбновитьОтображениеДанных(Элементы.ГрафикПлатежей);    

КонецПроцедуры

 

&НаКлиенте

Процедура ДатаОкончанияПриИзменении(Элемент)     

            ПроверитьРеквизитыДляГрафика();

КонецПроцедуры

 

&НаКлиенте

Процедура ПериодичностьОплатыПриИзменении(Элемент)     

            ПроверитьРеквизитыДляГрафика();            

КонецПроцедуры

 

&НаКлиенте

Процедура СуммаДолгаПриИзменении(Элемент)          

            ПроверитьРеквизитыДляГрафика();

КонецПроцедуры

 

&НаСервере

Процедура ПроверитьРеквизитыДляГрафика()

            Если  объект.СуммаДолга = 0 или

                          объект.ПериодичностьОплаты = 0 или

                          объект.ДатаНачала = Дата("00010101") или

                          объект.ДатаОкончания = Дата("00010101")  тогда

                       

            Иначе

                        РассчитатьГрафикПлатежей();

                        Об = РеквизитФормыВЗначение("Объект");

                        Об.РассчитатьГрафикПлатежей();  

            КонецЕсли;

КонецПроцедуры

 

Процедура РассчитатьГрафикПлатежей()

            Объект.ГрафикПлатежей.Очистить();

            РазницаВДнях = (НачалоДня(Объект.ДатаОкончания) - НачалоДня(Объект.ДатаНачала)) / (60 * 60 * 24);

            КоличествоЦелыхПериодов = Цел(РазницаВДнях/Объект.ПериодичностьОплаты) ;

            СуммаПлатежаЗаПериод = (Объект.СуммаДолга - объект.п50)/КоличествоЦелыхПериодов ;

           

            //Первый платеж

            нов = Объект.ГрафикПлатежей.Добавить();

            нов.Дата = Объект.ДатаНачала;

            нов.Сумма = объект.п50;

            нов.НадоОплатитьПоГрафику = нов.Сумма;

           

            н = 1;

            Если Объект.ПериодичностьОплаты = 10 Тогда

                        НоваяДата = Объект.ДатаНачала+ 60 * 60 * 24*Объект.ПериодичностьОплаты;

            ИначеЕсли Объект.ПериодичностьОплаты = 30 Тогда//Месяц

                        НоваяДата = Объект.ДатаНачала + 60*60*24*День(КонецМесяца(Объект.ДатаНачала));

            Иначе

            КонецЕсли;

           

           

            Пока н <= КоличествоЦелыхПериодов Цикл

                       

                        нов = Объект.ГрафикПлатежей.Добавить();

                        нов.Дата = НоваяДата;

                        нов.Сумма = СуммаПлатежаЗаПериод;

                        нов.НадоОплатитьПоГрафику = нов.Сумма;

                       

                        Если Объект.ПериодичностьОплаты = 10 Тогда

                                   НоваяДата = нов.Дата + 60*60*24*Объект.ПериодичностьОплаты;

                        ИначеЕсли Объект.ПериодичностьОплаты = 30 Тогда//Месяц

                                   НоваяДата = нов.Дата + 60*60*24*День(КонецМесяца(нов.Дата));

                        Иначе

                        КонецЕсли;

                       

                        н = н + 1;

                       

            КонецЦикла;

                       

            Если Объект.СуммаДолга < Объект.ГрафикПлатежей.Итог("Сумма") Тогда

                       

                        Объект.ГрафикПлатежей[Объект.ГрафикПлатежей.Количество()-1].Сумма = Объект.ГрафикПлатежей[Объект.ГрафикПлатежей.Количество()-1].Сумма

                        -  (Объект.ГрафикПлатежей.Итог("Сумма") - Объект.СуммаДолга) ;

                       

            КонецЕсли;

           

            Если Объект.СуммаДолга > Объект.ГрафикПлатежей.Итог("Сумма") Тогда

                       

                        Объект.ГрафикПлатежей[Объект.ГрафикПлатежей.Количество()-1].Сумма = Объект.ГрафикПлатежей[Объект.ГрафикПлатежей.Количество()-1].Сумма

                        +  (Объект.СуммаДолга - Объект.ГрафикПлатежей.Итог("Сумма")) ;

                       

                        Объект.ГрафикПлатежей[Объект.ГрафикПлатежей.Количество()-1].НадоОплатитьПоГрафику =

                        Объект.ГрафикПлатежей[Объект.ГрафикПлатежей.Количество()-1].Сумма;    

            КонецЕсли;

КонецПроцедуры

 

&НаКлиенте

Процедура ПриОткрытии(Отказ)

            этаФорма.Элементы.ОстатокДолгаНадпись.Заголовок = "Остаток долга: " + Объект.ОстатокДолга;

            этаФорма.Элементы.СтатусНадпись.Заголовок = "Статус: " + Объект.Статус;

КонецПроцедуры

 

&НаСервере

Процедура ГрафикПлатежейОплаченоПриИзмененииНаСервере()

           

            объект.ОстатокДолга = объект.ГрафикПлатежей.Итог("Сумма") - объект.ГрафикПлатежей.Итог("Оплачено");          

КонецПроцедуры

 

&НаКлиенте

Процедура ГрафикПлатежейОплаченоПриИзменении(Элемент)          

            ГрафикПлатежейОплаченоПриИзмененииНаСервере();

            этаФорма.Элементы.ОстатокДолгаНадпись.Заголовок = "Остаток долга: " + Объект.ОстатокДолга;         

            текДанные = этаФорма.Элементы.ГрафикПлатежей.ТекущиеДанные;

            ПЕресчитатьГрафикСУчетомОплаты(текДанные.Оплачено, текДанные.Сумма, текДанные.НомерСтроки);

КонецПроцедуры

 

Процедура ПересчитатьГрафикСУчетомОплаты(Оплачено, Сумма, НомерСтроки)

            Для каждого стр Из Объект.ГрафикПлатежей Цикл                     

                        стр.НадоОплатитьПоГрафику = стр.Сумма;                                                        

            КонецЦикла; 

           

            Долг = 0;

            Переплата = 0;

           

            Для каждого стр Из Объект.ГрафикПлатежей Цикл                     

                        Если Долг <> 0 тогда

                                   стр.НадоОплатитьПоГрафику = долг + стр.НадоОплатитьПоГрафику;

                                   Долг = 0;                                

                        КонецЕсли;

                       

                        Если (стр.Оплачено < стр.НадоОплатитьПоГрафику и стр.Оплачено <> 0) или Долг <> 0  Тогд                                Долг = Долг + (стр.НадоОплатитьПоГрафику - стр.Оплачено);                                        

                        КонецЕсли;

                       

                        Если стр.Оплачено > стр.НадоОплатитьПоГрафику  Тогда

                                  

                            сч = объект.ГрафикПлатежей.количество()-1;

                                   Переплата = стр.Оплачено - стр.НадоОплатитьПоГрафику;

                                  

                                   пока сч > НомерСтроки-1 цикл

                                              

                                               НадоОплатить = объект.ГрафикПлатежей[сч].НадоОплатитьПоГрафику;

                                              

                                               Если НадоОплатить  <> 0 и переплата<> 0 тогда

                                                          

                                                           Если переплата >=   НадоОплатить тогда

                                                                      

                                                                       объект.ГрафикПлатежей[сч].НадоОплатитьПоГрафику = 0;

                                                                       Переплата = переплата - НадоОплатить;

                                                                      

                                                           Иначе

                                                                      

                                                                       объект.ГрафикПлатежей[сч].НадоОплатитьПоГрафику = НадоОплатить - переплата;

                                                                       переплата = 0;

                                                                      

                                                           КонецЕсли;

                                                          

                                               КонецЕсли;

                                              

                                               сч = сч - 1;

                                              

                                   КонецЦикла;

                                  

                        КонецЕсли;

           

            КонецЦикла;

КонецПроцедуры

 

 

&НаКлиенте

Процедура п50ПриИзменении(Элемент)

           

            ПроверитьРеквизитыДляГрафика();

           

КонецПроцедуры

 

&НаСервере

Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

            этаФорма.Элементы.ОстатокДолгаНадпись.Заголовок = "Остаток долга: " + Объект.ОстатокДолга;

            этаФорма.Элементы.СтатусНадпись.Заголовок = "Статус: " + Объект.Статус;

 

КонецПроцедуры

 

&НаКлиенте

Процедура СуммаПервогоВзносаПриИзменении(Элемент)

            ПроверитьРеквизитыДляГрафика();

КонецПроцедуры

 

            Ниже приведено содержимое модуля объекта документа «Рассрочка платежа».

 

Листинг. Модуль объекта

Процедура РассчитатьГрафикПлатежей() Экспорт

            ГрафикПлатежей.Очистить();

            РазницаВДнях = (НачалоДня(ДатаОкончания) - НачалоДня(ДатаНачала)) / (60 * 60 * 24);

            КоличествоЦелыхПериодов = Цел(РазницаВДнях/ПериодичностьОплаты) ;

            СуммаПлатежаЗаПериод = (СуммаДолга - п50)/КоличествоЦелыхПериодов ;

           

            //Первый платеж

            нов = ГрафикПлатежей.Добавить();

            нов.Дата = ДатаНачала;

            нов.Сумма = п50;

            нов.НадоОплатитьПоГрафику = нов.Сумма;

           

            н = 1;

            Если ПериодичностьОплаты = 10 Тогда

                        НоваяДата = ДатаНачала+ 60 * 60 * 24*ПериодичностьОплаты;

            ИначеЕсли ПериодичностьОплаты = 30 Тогда//Месяц      

                        НоваяДата = ДатаНачала+ 60 * 60 * 24*День(КонецМесяца(ДатаНачала));

            Иначе

            КонецЕсли;

           

            Пока н <= КоличествоЦелыхПериодов Цикл

                       

                        нов = ГрафикПлатежей.Добавить();

                        нов.Дата = НоваяДата;

                        нов.Сумма = СуммаПлатежаЗаПериод;

                        нов.НадоОплатитьПоГрафику = нов.Сумма;

                       

                        Если ПериодичностьОплаты = 10 Тогда

                                   НоваяДата = нов.Дата + 60*60*24*ПериодичностьОплаты;

                        ИначеЕсли ПериодичностьОплаты = 30 Тогда//Месяц

                                   НоваяДата = нов.Дата + 60*60*24*День(КонецМесяца(нов.Дата));

                        Иначе

                        КонецЕсли;

                       

                        н = н + 1;

                       

            КонецЦикла;

           

            Если СуммаДолга < ГрафикПлатежей.Итог("Сумма") Тогда

                        ГрафикПлатежей[ГрафикПлатежей.Количество()-1].Сумма = ГрафикПлатежей[ГрафикПлатежей.Количество()-1].Сумма

                        -  (ГрафикПлатежей.Итог("Сумма") - СуммаДолга) ;                   

            КонецЕсли;

           

            Если СуммаДолга > ГрафикПлатежей.Итог("Сумма") Тогда

                        ГрафикПлатежей[ГрафикПлатежей.Количество()-1].Сумма = ГрафикПлатежей[ГрафикПлатежей.Количество()-1].Сумма

                        +  (СуммаДолга - ГрафикПлатежей.Итог("Сумма")) ;

                       

                        ГрафикПлатежей[ГрафикПлатежей.Количество()-1].НадоОплатитьПоГрафику =

                        ГрафикПлатежей[ГрафикПлатежей.Количество()-1].Сумма;                  

            КонецЕсли;

КонецПроцедуры

 

            Далее проверяем работу в пользовательском режиме.

Рис. Документ «Рассрочка платежа» с периодичностью оплаты 10 дней

 

Рис. Документ «Рассрочка платежа» с периодичностью оплаты 30 дней (месяц)

 

            Понятно, что 30 дней и 1 месяц не одно и тоже, но заказчики бывают разные, поэтому в данном случае при выборе периодичности 30 сумма будет раскидываться на одно и тоже число каждого месяца.