PDA

Просмотр полной версии : Расчетные задачи



Дмитрий357
18.11.2021, 20:12
Добрый день! Не могу решить расчетные задачи в общем и по частям. Текст задания: Список сотрудников хранится в справочнике "Физические лица". Каждому сотруднику полагается оклад, рассчитываемый как индивидуальная месячная ставка оклада, умноженная на количество отработанных дней и делённая на количество рабочих дней в месяце.

Сотрудникам могут выплачиваться разовые премии (подарки) произвольной величины. Расчётчик просто указывает размер подарка для данного сотрудника в документе начисления зарплаты.

Также сотрудникам выплачивается премия, зависящая от величины основных выплат (оклад + подарок) за прошлый месяц и вычисляемая как определённый процент от этой суммы. Величина процента указывается в документе начисления зарплаты.

Первую часть задания (оклад) я решил. Вот код:

Движения.ОсновныеНачислен� �я.Записывать=Истина;
Для Каждого ТекСтрокаНачисления Из Начисления Цикл
Движение=Движения.Основные Начисления.Добавить();
Движение.Сторно=Ложь;
ЗаполнитьЗначенияСвойств (Движение, ТекСтрокаНачисления);
Движение.ВидРасчета=ТекСтр окаНачисления.ВидНачислен� �я;
Движение.ПериодДействияНа� �ало=ТекСтрокаНачисления.Д� �таНачала;
Движение.ПериодДействияКо� �ец=КонецДня (ТекСтрокаНачисления.ДатаО кончания);
Движение.ПериодРегистраци� �=Дата;
КонецЦикла;
Движения.ОсновныеНачислен� �я.Записать();

//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБР� �БОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

Запрос.УстановитьПараметр("Дата", НачалоМесяца(Дата));
Запрос.УстановитьПараметр("Оклад", ПланыВидовРасчета.Основны� �Начисления.Оклад);
Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

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

Для Каждого СтрДвижение Из Движения.ОсновныеНачислен� �я Цикл
Если ВыборкаДетальныеЗаписи.Ок� �ад=0 Тогда
Сообщить ("Оклад для сотрудника "+ВыборкаДетальныеЗаписи.Со трудник+" не задан");
Отказ=Истина;
КонецЕсли;
ВыборкаДетальныеЗаписи.Сб� �осить();
ВыборкаДетальныеЗаписи.На� �тиСледующий(СтрДвижение.Н� �мерСтроки, "НомерСтроки");
СтрДвижение.Факт=ВыборкаДе тальныеЗаписи.ФактДни;
СтрДвижение.Результат=Выбо ркаДетальныеЗаписи.ФактДн� �/ВыборкаДетальныеЗаписи.Пл� �нДни*ВыборкаДетальныеЗапи си.Оклад;
КонецЦикла;
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБР� �БОТКОЙ_РЕЗУЛЬТАТА
Движения.ОсновныеНачислен� �я.Записать(,Истина);



Остальные части очень сложно идут. Либо неправильно идет расчет (выдает неправильное значение премии, не складывая с окладом размер подарка), либо возникают ошибки в коде. Подарок у меня является основным начислениям. Премия зависит от оклада и подарка, все настроено в планах видов расчета. Версия программы 1С:Предприятие 8.3, учебная версия (8.3.14.169