База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как реализовать рассрочку в 1С с учетом требований к кнопкам и формам? › Ответ в теме: Как реализовать рассрочку в 1С с учетом требований к кнопкам и формам?
Да, описанный подход реализуем и соответствует вашим требованиям. В решении:
— На форме документа РеализацияТоваровУслуг (РТУ) добавлена кнопка для открытия формы просмотра регистра накопления (РН) с фильтром по контрагенту.
— Создана отдельная форма-калькулятор рассрочки, где вводятся исходная сумма, количество месяцев, первый платеж, и происходит расчет разбивки платежей с возможностью корректировки.
— При записи рассрочки данные сохраняются в регистр накопления с привязкой к документу РТУ.
— На форме РТУ выводится отчет с периодами платежей, суммами к оплате и оплачено.
Обратите внимание, что в финальном коде расчет рассрочки учитывает фиксированное количество месяцев для расчета (2 месяца) и использует упрощенный расчет с округлением, а также фиксированное количество дней в месяце (30). Это может потребовать адаптации под ваши реальные условия.
Ниже структура решения с ключевыми фрагментами кода:
1. Добавление кнопки на форму РТУ для вызова формы просмотра регистра накопления по контрагенту:
|
1 2 3 4 5 6 7 8 9 10 11 |
&НаКлиенте Процедура КнопкаПросмотрРассрочкиНажатие(Кнопка) Если Объект.Контрагент = Неопределено Тогда Сообщить("Контрагент не указан"); Возврат; КонецЕсли; // Открываем форму просмотра регистра накопления с фильтром по контрагенту ФормаРН = РегистрыНакопления.РассрочкаПродаж.СоздатьФорму("ФормаСписка"); ФормаРН.УстановитьОтбор("Контрагент", Объект.Контрагент); ФормаРН.Открыть(); КонецПроцедуры |
2. Логика расчета рассрочки с разбивкой суммы по месяцам, учетом первого платежа и хвоста в последнем месяце:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
&НаКлиенте Процедура РассчитатьНажатие(Кнопка) КоличествоМесяцевДляРасчета = 2; МаксимальноеКоличествоДнейВМесяце = 30; Если КоличествоМесяцев <= 0 Тогда Сообщить("Количество месяцев должно быть больше 0"); Возврат; КонецЕсли; Если ИсходнаяСумма < ПервыйПлатеж Тогда Сообщить("Первый платеж не может быть больше суммы"); Возврат; КонецЕсли; ТаблицаПлатежей.Очистить(); Остаток = ИсходнаяСумма - ПервыйПлатеж; МесячныйПлатеж = Окр(Остаток / (КоличествоМесяцев - КоличествоМесяцевДляРасчета), 2); Для НомерМесяца = 1 По КоличествоМесяцев Цикл НоваяСтрока = ТаблицаПлатежей.Добавить(); НоваяСтрока.Период = НачалоМесяца(ТекущаяДатаСеанса()) + (НомерМесяца - 1) * МаксимальноеКоличествоДнейВМесяце; Если НомерМесяца = 1 Тогда НоваяСтрока.Сумма = ПервыйПлатеж; ИначеЕсли НомерМесяца < КоличествоМесяцев Тогда НоваяСтрока.Сумма = МесячныйПлатеж; Иначе НоваяСтрока.Сумма = Остаток - МесячныйПлатеж * (КоличествоМесяцев - КоличествоМесяцевДляРасчета); КонецЕсли; КонецЦикла; ТабличноеПолеПлатежи.Обновить(); КонецПроцедуры |
3. Запись рассчитанных платежей в регистр накопления с привязкой к документу РТУ:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
&НаСервере Процедура ЗаписатьРассрочку(ДокументРТУ, ТаблицаПлатежей) Для Каждого Строка Из ТаблицаПлатежей Цикл Если Строка.Сумма > 0 Тогда ЗаписьРегистра = РегистрыНакопления.РассрочкаПродаж.СоздатьНаборЗаписей(); ЗаписьРегистра.Добавить(); ЗаписьРегистра.Контрагент = ДокументРТУ.Контрагент; ЗаписьРегистра.ДокументРеализации = ДокументРТУ.Ссылка; ЗаписьРегистра.Период = Строка.Период; ЗаписьРегистра.СуммаКОплате = Строка.Сумма; ЗаписьРегистра.Записать(); КонецЕсли; КонецЦикла; КонецПроцедуры |
4. Вывод отчета на форме РТУ с периодами, суммами к оплате и оплачено:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
&НаКлиенте Процедура ОбновитьОтчет() Если Объект.Ссылка = Неопределено Тогда Возврат; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Рассрочка.Период, | Рассрочка.СуммаКОплате, | Платежи.СуммаОплачено |ИЗ | РегистрНакопления.РассрочкаПродаж КАК Рассрочка | ЛЕВОЕ СОЕДИНЕНИЕ | (ВЫБРАТЬ | ДокументРеализации, | Период, | СУММА(Сумма) КАК СуммаОплачено | ИЗ | РегистрНакопления.ПлатежиПоРассрочке | ГДЕ | ДокументРеализации = &Документ | СГРУППИРОВАТЬ ПО | ДокументРеализации, Период) КАК Платежи | ПО Рассрочка.ДокументРеализации = Платежи.ДокументРеализации | И Рассрочка.Период = Платежи.Период |ГДЕ | Рассрочка.ДокументРеализации = &Документ |УПОРЯДОЧИТЬ ПО | Рассрочка.Период"; Запрос.УстановитьПараметр("Документ", Объект.Ссылка); Результат = Запрос.Выполнить().Выгрузить(); ЭлементыФормы.ТабличныйОтчет.ЗагрузитьИзТаблицыЗначений(Результат); КонецПроцедуры |
Если потребуется, могу помочь с деталями по конкретным частям кода или настройке форм.