пятница, 20 марта 2015 г.

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

Решение:
1) Определимся с тем какие виды расчета потребуются.
Оклад,Вахта, КомпенсацияПитания, ИсполнительныйЛист.
Пристроим ВР по ПВР
Оклад,Вахта - ПВР "Основные начисления" (Вахта вытесняет оклад)
КомпенсацияПитания -  ПВР "Дополнительные начисления"  (база - Оклад,Вахта)
ИсполнительныйЛист - ПВР "Удержания"  (база - Оклад,Вахта,КомпенсацияПитания)

2) В справочник сотрудники добавим реквизиты "ДатаПриемаНаРаботу", и "СтадДоПриемаНаРаботу".

3) Заполним с помощью обработки "Заполнение графика" графики работы + заполним график "Вахта",  у которого все дни рабочие.

4) Для того чтобы обеспечить кратность вахты равной неделе при вводе конечной даты повесим обработчик события.

&НаКлиенте
Процедура ОсновныеНачисленияДатаОкончанияПриИзменении(Элемент)
ТекДанные = Элементы.ОсновныеНачисления.ТекущиеДанные;
ДлительностьДней = 1+(ТекДанные.ДатаОкончания - ТекДанные.ДатаНачала)/86400;
Если ЭтоВахта(ТекДанные.ВидРасчета ) И (Цел(ДлительностьДней/7)<>ДлительностьДней/7) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Вахта должна быть кратна неделе";
Сообщение.Сообщить();
ТекДанные.ДатаОкончания = Дата(1,1,1);
КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЭтоВахта(ВидРасчета)
 Возврат ?(ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Вахта, Истина, Ложь);
КонецФункции

5) Начисление ЗП

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

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

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

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

6) Диаграмма Ганта.




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

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