вторник, 10 марта 2015 г.

1c специалист задача 2.24

Условие из сборника:
Необходимо организовать возможность выдачи денежных займов сотрудникам компании. Факт выдачи такого займа отражается в системе документом «Выдача займа». В этом документе указывается, какому сотруднику компании, в каком размере, были выданы денежные средства. Также указывается срок, в который должен произойти возврат денежных средств. Документ «Выдача займа» реализует следующую проводку:
Дт «Кредиты и займы выданные» - Кт «Касса»
на сумму выданных средств. Наличие денег в кассе контролировать не
нужно. Возврат денежных средств регистрируется с помощью документа «Возврат займа». В этом документе указывается, какой сотрудник и, какую сумму вернул. Возвращаемая сумма рассчитывается по формуле:
Сумма возврата = Выданная сумма + Сумма штрафа. Сумма штрафа = Количество «полных» дней просрочки (день получения и день возвращения не считаются) Х (0,001 Х Выданная сумма). Займ не может погашаться частями, т.е. если вносимая сумма отличается от расчетной суммы возврата, то документ не должен проводиться. В случае досрочного возврата займа необходимо погасить выданную сумму займа. Сотруднику не могут выдать следующий займ до тех пор, пока он не вернет ранее выданный. Документ «Возврат займа» реализует следующие проводки:
Дт «Касса» - Кт «Кредиты и займы выданные» на сумму полученного
займа;
Дт «Касса» - Кт «Прибыли и убытки» на сумму штрафа. В системе должен быть предусмотрен отчет о выданных и погашенных займах.








Решение:

Так как задание очень похоже на предыдущее, то за основу взял предыдущую базу.

В документе "Возврат займа" на форму добавил команду "Рассчитать сумму штрафа", которая заполнит соотвествующий реквизит. Далее при обработке проведения 2 проводки на сумму долга и на сумму штрафа.

&НаСервере
Функция РассчитатьШтраф()  Экспорт
НачатьТранзакцию();
// БлокировкаДанных
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий");
ЭлементБлокировки.УстановитьЗначение("Субконто1", Сотрудник);
ЭлементБлокировки.УстановитьЗначение("Счет",  ПланыСчетов.Управленческий.КредитыИЗаймыВыданные);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();

Запрос =Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
| СУММА(ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0)) КАК Долг,
| УправленческийОстатки.Субконто2 КАК ПланируемаяДатаВозврата
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(&ТочкаИтогов, Счет = &Счет, &мсубконто, Субконто1 = &Сотрудник) КАК УправленческийОстатки
|
|СГРУППИРОВАТЬ ПО
| УправленческийОстатки.Субконто2";

Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.КредитыИЗаймыВыданные);
Запрос.УстановитьПараметр("Сотрудник",Сотрудник);
ТочкаИтогов =Новый Граница(МоментВремени(),ВидГраницы.Исключая);
Запрос.УстановитьПараметр("ТочкаИтогов",ТочкаИтогов);
мсубконто = Новый("Массив");
мсубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконто.Сотрудник);
мсубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата);
Запрос.УстановитьПараметр("мсубконто",мсубконто);
Результат = Запрос.Выполнить();
Если Не  Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
ДнейПросрочки = ((НачалоДня(Дата)-НачалоДня(Выборка.ПланируемаяДатаВозврата))/86400)-1;
СуммаШтрафа =(Выборка.Долг/100)*ДнейПросрочки;
КонецЕсли;
ЗафиксироватьТранзакцию();
Возврат СуммаШтрафа;

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


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();
// БлокировкаДанных
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий");
ЭлементБлокировки.УстановитьЗначение("Субконто1", Сотрудник);
ЭлементБлокировки.УстановитьЗначение("Счет",  ПланыСчетов.Управленческий.КредитыИЗаймыВыданные);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
БудемШтрафовать = Ложь;
Запрос =Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
| СУММА(ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0)) КАК Долг,
| УправленческийОстатки.Субконто2 КАК ПланируемаяДатаВозврата
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(&ТочкаИтогов, Счет = &Счет, &мсубконто, Субконто1 = &Сотрудник) КАК УправленческийОстатки
|
|СГРУППИРОВАТЬ ПО
| УправленческийОстатки.Субконто2";
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.КредитыИЗаймыВыданные);
Запрос.УстановитьПараметр("Сотрудник",Сотрудник);
ТочкаИтогов =?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, Новый Граница(МоментВремени(),ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ТочкаИтогов",ТочкаИтогов);
мсубконто = Новый("Массив");
мсубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконто.Сотрудник);
мсубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата);
Запрос.УстановитьПараметр("мсубконто",мсубконто);
Результат = Запрос.Выполнить();
Если Не  Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Если Выборка.Долг<> Сумма Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Проведение невозможно, сумма долга = "+ Выборка.Долг;
Сообщение.Сообщить();
КонецЕсли;
Если Выборка.ПланируемаяДатаВозврата< НачалоДня(Дата) И Выборка.Долг>1 Тогда 
БудемШтрафовать = Истина;
КонецЕсли;
КонецЕсли;
Если Не Отказ Тогда
Движение = Движения.Управленческий.Добавить();
Движение.СчетКт = ПланыСчетов.Управленческий.КредитыИЗаймыВыданные;
Движение.СчетДт = ПланыСчетов.Управленческий.Касса;
Движение.Период = Дата;
Движение.Сумма = Сумма;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата] = Дата;
КонецЕсли;
Если БудемШтрафовать Тогда 
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.КредитыИЗаймыВыданные;
Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.Период = Дата;
Движение.Сумма = СуммаШтрафа;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата] = Дата;
КонецЕсли;
КонецПроцедуры

Нужно немножко изменить отчет

ВЫБРАТЬ
Выдача.СубконтоДт1 КАК Сотрудник,
СУММА(Выдача.СуммаОборот) КАК СуммаЗайма,
Выдача.СубконтоДт2 КАК ПланируемаяДатаВозвращения
ПОМЕСТИТЬ Выдача
ИЗ
РегистрБухгалтерии.Управленческий.ОборотыДтКт(&ДатаНачала, &ДатаОкончания, , СчетДт = &Счет, , СчетКт = &СчетКасса, , ) КАК Выдача

СГРУППИРОВАТЬ ПО
Выдача.СубконтоДт1,
Выдача.СубконтоДт2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Выдача.Сотрудник,
Выдача.СуммаЗайма,
Выдача.ПланируемаяДатаВозвращения,
Штрафы.СуммаОборот КАК СуммаШтрафа,
Штрафы.СубконтоДт2 КАК РеальнаяДатаВозвращения
ИЗ
Выдача КАК Выдача
ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.ОборотыДтКт(&ДатаНачала, &ДатаОкончания, Авто, СчетДт = &Счет, , СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки), , ) КАК Штрафы

ПО Выдача.Сотрудник = Штрафы.СубконтоДт1

Скачать решение задачи 2.24

1 комментарий:

  1. Спасибо мистеру Бенджамину за помощь в получении ипотечной ссуды VA. Было здорово получить ссуду в размере 900 000 долларов США от этого кредитора. Меня зовут Красимир Тодор, я бельгиец. Я получил ссуду от этого авторитетного кредитора 20 ноября 2019 года, и я хочу быстро использовать это средство, чтобы сообщить всем здесь, что вы можете получить любой ссуду у этой надежной кредитной компании. Найти ссудодателя VA непросто, и он должен быть рекомендован Департаментом по делам ветеранов. Г-н Бенджамин предоставит вам ссуды под низкие проценты в размере 2% и очень быстро. Получите кредиты по электронной почте: 247officedept@gmail.com или по номеру WhatsApp: + 1-989-394-3740

    ОтветитьУдалить