четверг, 19 марта 2015 г.

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

Решение.

1) "Разбросаем"   ВР по разным ВР и настроим зависимости.
"Гарантированный Оклад" - в Дополнительные начисления.
Оклад - в Основные
Невыход-в Основные( для того чтобы вытеснял оклад и сверхурочные)
Сверхурочные - в Основные
2) Доработаем обработку "Заполнение графиков" и заполним графики. (подробнее)
3) Заведем РС "Гарантированные оклады" с периодичностью квартал.
4) Создаем регистры расчета.
5)Дорабатываем документ "Начисление ЗП", в обработке проведения формируем первичные записи. Для "Гарантированного оклада" сразу же в документе и заполним значение.
остальные записи рассчитаем в общем модуле

Сверхурочные рассчитываются так:
В ТЧ "Основные начисления" для реквизитов "ДатаНачала" и "ДатаОкончания" изменяем состав на "Дата и время". Таким образом можем в запросе получить количество часов отработанных сверхурочно с помощью выражения:

ВЫБОР
КОГДА НачислениеЗарплатыОсновныеНачисления.ВидРасчета = &Сверхурочные
ТОГДА РАЗНОСТЬДАТ(НачислениеЗарплатыОсновныеНачисления.ДатаНачала, НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ЧАС)
ИНАЧЕ 0
КОНЕЦ КАК Сверхурочные




Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)   ;
ПериодРегистрации = НачалоМесяца(ПериодРегистрации);
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ОсновныеНачисления.Записывать = Истина;
Движения.ДополнительныеНачисления.Записывать = Истина;

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

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



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

Если Выборка.ВидРасчета  = ПланыВидовРасчета.ОсновныеНачисления.Сверхурочные Тогда 
Движение.ИсходныеДанные = Выборка.Сверхурочные ;
Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации,-1) ;
Движение.БазовыйПериодКонец  =  ПериодРегистрации -1;
КонецЕсли;

КонецЦикла;
КонецЕсли;

Результат = ПакетРезультатов[1];
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Движение = Движения.ДополнительныеНачисления.Добавить();
ЗаполнитьЗначенияСвойств(Движение, Выборка);
Движение.Результат = Выборка.ГарантированныйОклад;
КонецЦикла;
КонецЕсли;

Движения.ОсновныеНачисления.Записать();
Движения.ДополнительныеНачисления.Записать();

СотрудникиОсн =  ПакетРезультатов[2].Выгрузить().ВыгрузитьКолонку("Сотрудник");
СотрудникиДоп =  ПакетРезультатов[3].Выгрузить().ВыгрузитьКолонку("Сотрудник");

Если ОсновныеНачисления.Найти(ПланыВидовРасчета.ОсновныеНачисления.Невыход,"ВидРасчета")<> Неопределено Тогда 
Рассчет.РассчитатьНачисления(Движения.ОсновныеНачисления,ПланыВидовРасчета.ОсновныеНачисления.Невыход,СотрудникиОсн);   
Движения.ОсновныеНачисления.Записать(,Истина);
КонецЕсли;

Если ОсновныеНачисления.Найти(ПланыВидовРасчета.ОсновныеНачисления.Оклад,"ВидРасчета")<> Неопределено Тогда 
Рассчет.РассчитатьНачисления(Движения.ОсновныеНачисления,ПланыВидовРасчета.ОсновныеНачисления.Оклад,СотрудникиОсн);   
Движения.ОсновныеНачисления.Записать(,Истина);
КонецЕсли;

Если ОсновныеНачисления.Найти(ПланыВидовРасчета.ОсновныеНачисления.Сверхурочные,"ВидРасчета")<> Неопределено Тогда 
Рассчет.РассчитатьНачисления(Движения.ОсновныеНачисления,ПланыВидовРасчета.ОсновныеНачисления.Сверхурочные,СотрудникиОсн);   
Движения.ОсновныеНачисления.Записать(,Истина);
КонецЕсли;


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

Процедура общего модуля

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

КонецЦикла;
КонецЕсли;
КонецПроцедуры


7) Отчет.
Из отчета исключаем невыходы.

ВЫБРАТЬ
ОсновныеНачисления.ПериодРегистрации КАК Период,
ОсновныеНачисления.ВидРасчета,
ОсновныеНачисления.Сотрудник,
ОсновныеНачисления.Подразделение,
СУММА(ОсновныеНачисления.Результат) КАК Результат
ИЗ
РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
ГДЕ
ОсновныеНачисления.ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания
И ЕСТЬNULL(ОсновныеНачисления.Результат, 0) <> 0
И ОсновныеНачисления.ВидРасчета <> &Невыход

СГРУППИРОВАТЬ ПО
ОсновныеНачисления.Сотрудник,
ОсновныеНачисления.ВидРасчета,
ОсновныеНачисления.Подразделение,
ОсновныеНачисления.ПериодРегистрации

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ДополнительныеНачисления.ПериодРегистрации,
ДополнительныеНачисления.ВидРасчета,
ДополнительныеНачисления.Сотрудник,
ДополнительныеНачисления.Подразделение,
СУММА(ДополнительныеНачисления.Результат)
ИЗ
РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
ГДЕ
ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания

СГРУППИРОВАТЬ ПО
ДополнительныеНачисления.Подразделение,
ДополнительныеНачисления.Сотрудник,
ДополнительныеНачисления.ВидРасчета,
ДополнительныеНачисления.ПериодРегистрации


Скачать решение задачи 3.25 (1с специалист)

Комментариев нет:

Отправить комментарий