В начало

Число месяцев долга нарастающим итогом

 

            Есть регистр сведений «Начисления». Необходимо рассчитать число месяцев долга нарастающим итогом в разрезе контрагентов.

Рис. Независимый регистр сведений «Начисления»

 

            Создаем внешнюю обработку, добавляем на нее Форму, реквизит «Контрагент» и команду «Рассчитать».

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

 

            Далее в модуле формы обработки описываем необходимые действия в обработчике команды «Рассчитать». Создаем запрос с обработкой результата в серверной части обработчика событий команды «Рассчитать». В запросе обращаемся к регистру сведений «Начисления», после чего выгружаем данные в таблицу значений.

            Алгоритм нахождения числа месяцев долга примерно следующий:

1)     с помощью метода «Итог» таблицы значений рассчитываем итоговую сумму начислений и оплат;

2)     далее сравниваем итоговые суммы начислений и оплат, если сумма оплат превышает сумму начислений, то долга нет, а следовательно и месяцев долга тоже нет;

3)     если же сумма начислений превышает сумму оплат, то нарастающим итогом вычисляем сумму начислений и сравниваем ее с суммой оплат до тех пор, пока она не превышает ее, при этом увеличиваем количество оплаченных месяцев;

4)     получив таким образом, число оплаченных месяцев можно рассчитать число месяцев долга, вычтя из общего числа месяцев количество оплаченных.

 

Листинг. Содержимое модуля формы внешней обработки

 

&НаСервере

Функция РассчитатьНаСервере(Знач Контрагент)

            Запрос = Новый Запрос;

            Запрос.Текст =

                        "ВЫБРАТЬ

                        |         Начисления.Контрагент КАК Контрагент,

                        |         Начисления.МесяцНачисления КАК МесяцНачисления,

                        |         СУММА(Начисления.Начислено) КАК Начислено,

                        |         СУММА(Начисления.Оплачено) КАК Оплачено,

                        |         СУММА(Начисления.СальдоКонечное) КАК СальдоКонечное,

                        |         СУММА(Начисления.СальдоНачальное) КАК СальдоНачальное

                        |ИЗ

                        |         РегистрСведений.Начисления КАК Начисления

                        |ГДЕ

                        |         Начисления.Контрагент = &Контрагент

                        |

                        |СГРУППИРОВАТЬ ПО

                        |         Начисления.Контрагент,

                        |         Начисления.МесяцНачисления";

           

            Запрос.УстановитьПараметр("Контрагент", Контрагент);

            Результат = Запрос.Выполнить();

            ТЗ = Результат.Выгрузить();

           

            ИтогоНачислено = ТЗ.Итог("Начислено");

            ИтогоОплачено = ТЗ.Итог("Оплачено");

            ВсегоМесяцев = ТЗ.Количество();

           

            //Если сумма оплат превышает сумму начислений то долга нет

            //или начислений вообще нет, а значит и долга быть не может

            Если ИтогоОплачено >= ИтогоНачислено Или

                         ИтогоНачислено <=0 Тогда

                        Возврат 0;

            КонецЕсли;

           

            //Иначе рассчитываем число месяцев ОПЛАТЫ         

            ОплаченоМесяцев = 0;

            Начислено = 0;

            Для Каждого Стр Из ТЗ Цикл

                        Начислено = Начислено + Стр.Начислено;

                       

                        //Проверяем нарастающий итог начислений

                        Если Начислено <= ИтогоОплачено Тогда

                                   ОплаченоМесяцев = ОплаченоМесяцев + 1;

                        КонецЕсли;

            КонецЦикла;         

           

            //Рассчитываем число месяцев долга

            Возврат ВсегоМесяцев - ОплаченоМесяцев;

 

КонецФункции

 

&НаКлиенте

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

            Сообщить("Число месяцев долга: " + РассчитатьНаСервере(Объект.Контрагент));

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

 

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

 

Рис. Проверка правильности расчета

 

            Все верно, число месяцев долга равно двум.