1. Создадим Начисление:
_Доплата за работу в кислотном цеху, Повременная оплата труда и надбавки, Только если введено значение показателя: ОтработаноЧасовВКислотномЦеху, Дополнительная оплата за уже оплаченное время, Вид времени: Явка, пп.3, ст.255 НК РФ, Формула: ТарифнаяСтавкаЧасовая * ОтработаноЧасовВКислотномЦеху * 50 / 100
Показатель ОтработаноЧасовВКислотномЦеху числовой, точность 2, Вводится единовременно документом ввода данных для расчета зарплаты
Показатель будем писать в
РС ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников 2. Создадим Начисление:
_Оплата отгула, Повременная оплата труда и надбавки, Только если введен вид учета времени: _Отгул, Дополнительная оплата за уже оплаченное время, Вид времени: _Отгул, Формула: ТарифнаяСтавкаЧасовая * ВремяВЧасах
Вид времени _Отгул имеет основное время - Выходные дни
Отгул будем писать в
РН РабочееВремяСотрудников 3. Создадим РС Отгулы (остатки) и РС РаботаВЦеху (обороты)
оба регистра имеют измерение: сотрудник, ресурс: время (в секундах). регистраторы документы: ДанныеПропускнойСистемы и Отгул
наверно нужно было сделать на одном регистре...
4. Документ
ДанныеПропускнойСистемы 4.1. Форма
Код
&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
Если ДиалогОткрытияФайла.Выбрать() Тогда
Объект.ДанныеВремени.Очистить();
ТекстФайла = Новый ТекстовыйДокумент;
ТекстФайла.Прочитать( ДиалогОткрытияФайла.ВыбранныеФайлы[0] );
ТекстФайла = ТекстФайла.ПолучитьТекст();
Для Счетчик = 1 По СтрЧислоСтрок( ТекстФайла ) Цикл
ТекСтрока = СтрПолучитьСтроку( ТекстФайла, Счетчик );
Строка = Объект.ДанныеВремени.Добавить();
Строка.Пропуск = Сред( ТекСтрока, 1, 4 );
ВходДень = Сред( ТекСтрока, 6, 2 );
ВходМесяц = Сред( ТекСтрока, 9, 2 );
ВходГод = Сред( ТекСтрока, 12, 4 );
ВходЧас = Сред( ТекСтрока, 17, 2 );
ВходМинута = Сред( ТекСтрока, 20, 2 );
ВыходДень = Сред( ТекСтрока, 23, 2 );
ВыходМесяц = Сред( ТекСтрока, 26, 2 );
ВыходГод = Сред( ТекСтрока, 29, 4 );
ВыходЧас = Сред( ТекСтрока, 34, 2 );
ВыходМинута = Сред( ТекСтрока, 37, 2 );
Строка.ВремяВхода = Дата( ВходГод + ВходМесяц + ВходДень + ВходЧас + ВходМинута + "00" );
Строка.ВремяВыхода = Дата( ВыходГод + ВыходМесяц + ВыходДень + ВыходЧас + ВыходМинута + "00" )
КонецЦикла;
КонецЕсли;
КонецПроцедуры
4.2. Модуль объекта
Код
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.РаботаВЦеху.Записывать = Истина;
Движения.Отгулы.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеПропускнойСистемыДанныеВремени.Пропуск КАК Пропуск,
| ДанныеПропускнойСистемыДанныеВремени.ВремяВхода,
| ДанныеПропускнойСистемыДанныеВремени.ВремяВыхода
|ПОМЕСТИТЬ ВТ
|ИЗ
| Документ.ДанныеПропускнойСистемы.ДанныеВремени КАК ДанныеПропускнойСистемыДанныеВремени
|ГДЕ
| ДанныеПропускнойСистемыДанныеВремени.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СотрудникиДополнительныеРеквизиты.Ссылка КАК Сотрудник,
| ВТ.ВремяВхода,
| ВТ.ВремяВыхода
|ИЗ
| ВТ КАК ВТ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники.ДополнительныеРеквизиты КАК СотрудникиДополнительныеРеквизиты
| ПО ВТ.Пропуск = СотрудникиДополнительныеРеквизиты.Значение
| И (СотрудникиДополнительныеРеквизиты.Свойство = &Свойство)";
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Номер пропуска") );
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Движение = Движения.РаботаВЦеху.Добавить();
Движение.Период = Выборка.ВремяВхода;
Движение.Сотрудник = Выборка.Сотрудник;
Движение.Время = Выборка.ВремяВыхода - Выборка.ВремяВхода;
Движение = Движения.Отгулы.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Выборка.ВремяВхода;
Движение.Сотрудник = Выборка.Сотрудник;
Движение.Время = Выборка.ВремяВыхода - Выборка.ВремяВхода;
КонецЦикла;
Движения.Записать();
ЗначенияПоУмолчанию = Новый Структура("Организация");
ЗарплатаКадры.ПолучитьЗначенияПоУмолчанию(ЗначенияПоУмолчанию, НачалоМесяца(Дата) );
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РаботаВЦехуОбороты.Сотрудник,
| ВЫРАЗИТЬ(ЕСТЬNULL(РаботаВЦехуОбороты.ВремяОборот, 0) / 3600 КАК ЧИСЛО(12, 2)) КАК Время
|ИЗ
| РегистрНакопления.РаботаВЦеху.Обороты(&НачалоПериода, &КонецПериода, Месяц, ) КАК РаботаВЦехуОбороты";
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Дата) );
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Дата) );
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;
Пока Выборка.Следующий() Цикл
Движение = Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Добавить();
Движение.ПериодДействия = НачалоМесяца(Дата);
Движение.Сотрудник = Выборка.Сотрудник;
Движение.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор","ОтработаноЧасовВКислотномЦеху");
Движение.Организация = ЗначенияПоУмолчанию.Организация;
Движение.Значение = Выборка.Время;
КонецЦикла;
КонецПроцедуры
5. Документ
Отгул реквизиты документа: ДатаНачалаПериода, ДатаОкончанияПериода, Организация, ИсправленныйДокумент, Подразделение,
короче взяты из документа ИндивидуальныйГрафик
Код
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Записать();
Движения.РабочееВремяСотрудников.Записывать = Истина;
Движения.Отгулы.Записывать = Истина;
ЗначенияПоУмолчанию = Новый Структура("Организация");
ЗарплатаКадры.ПолучитьЗначенияПоУмолчанию(ЗначенияПоУмолчанию, НачалоМесяца(Дата) );
ДатаНачалаПериода = НачалоМесяца(Дата);
ДатаОкончанияПериода = КонецМесяца(Дата);
Организация = ЗначенияПоУмолчанию.Организация;
ВыборкаДанныхОВремени = Документы.ИндивидуальныйГрафик.ДанныеОВремениСотрудников(ЭтотОбъект);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОтгулДанныеВремени.НомерСтроки,
| ОтгулДанныеВремени.Сотрудник КАК Сотрудник,
| ОтгулДанныеВремени.ДатаОтгула КАК ДатаОтгула
|ПОМЕСТИТЬ ВТДанныеВремени
|ИЗ
| Документ.Отгул.ДанныеВремени КАК ОтгулДанныеВремени
|ГДЕ
| ОтгулДанныеВремени.Ссылка = &Ссылка
|
|ИНДЕКСИРОВАТЬ ПО
| Сотрудник,
| ДатаОтгула
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДанныеТабеля.Сотрудник КАК Сотрудник,
| ДанныеТабеля.Дата КАК Дата,
| ДанныеТабеля.ВидУчетаВремени
|ПОМЕСТИТЬ ВТДанныеТабеля
|ИЗ
| &ДанныеТабеля КАК ДанныеТабеля
|
|ИНДЕКСИРОВАТЬ ПО
| Сотрудник,
| Дата
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТДанныеВремени.НомерСтроки,
| ВТДанныеТабеля.Сотрудник КАК СотрудникТабеля,
| ВТДанныеТабеля.Дата КАК Дата,
| ВЫРАЗИТЬ( ( ЕСТЬNULL(ОтгулыОстатки.ВремяОстаток, 0) / (4 * 60 * 60) ) - 0.5 КАК ЧИСЛО(12, 0)) КАК ОстатокОтгулов,
| ВТДанныеВремени.Сотрудник КАК СотрудникВремени,
| ОтгулыОстатки.ВремяОстаток
|ИЗ
| ВТДанныеВремени КАК ВТДанныеВремени
| ЛЕВОЕ СОЕДИНЕНИЕ ВТДанныеТабеля КАК ВТДанныеТабеля
| ПО ВТДанныеВремени.Сотрудник = ВТДанныеТабеля.Сотрудник
| И ВТДанныеВремени.ДатаОтгула = ВТДанныеТабеля.Дата
| И (ВТДанныеТабеля.ВидУчетаВремени = &ВидУчетаВремениЯвка)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Отгулы.Остатки(
| &КонецПериода,
| Сотрудник В
| (ВЫБРАТЬ
| ВТДанныеВремени.Сотрудник
| ИЗ
| ВТДанныеВремени КАК ВТДанныеВремени)) КАК ОтгулыОстатки
| ПО ВТДанныеВремени.Сотрудник = ОтгулыОстатки.Сотрудник
|ИТОГИ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Дата),
| МАКСИМУМ(ОстатокОтгулов)
|ПО
| СотрудникВремени";
Запрос.УстановитьПараметр("ДанныеТабеля", ВыборкаДанныхОВремени.Владелец().Выгрузить() );
Запрос.УстановитьПараметр("ВидУчетаВремениЯвка", ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка") );
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Дата) );
РезультатЗапроса = Запрос.Выполнить();
ВыборкаПоГруппам = РезультатЗапроса.Выбрать( ОбходРезультатаЗапроса.ПоГруппировкам );
Пока ВыборкаПоГруппам.Следующий() Цикл
Если ВыборкаПоГруппам.Дата > ВыборкаПоГруппам.ОстатокОтгулов Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "У сотрудника "+ВыборкаПоГруппам.СотрудникВремени+" осталось "+ВыборкаПоГруппам.ОстатокОтгулов+" прогулов, Вы запрашиваете: "+ВыборкаПоГруппам.Дата;
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Выборка = ВыборкаПоГруппам.Выбрать();
Пока Выборка.Следующий() Цикл
Если НЕ ЗначениеЗаполнено( Выборка.СотрудникТабеля ) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "На данную дату у этого сотрудника нет рабочего времени";
Сообщение.Поле = "ДанныеВремени["+(Выборка.НомерСтроки - 1)+"].ДатаОтгула";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
Иначе
Движение = Движения.РабочееВремяСотрудников.Добавить();
Движение.Период = Выборка.Дата;
Движение.Сотрудник = Выборка.СотрудникТабеля;
Движение.ВидУчетаВремени = Справочники.ВидыИспользованияРабочегоВремени.НайтиПоРеквизиту("БуквенныйКод","ОТГ");
Движение.ПериодРегистрации = НачалоМесяца(Дата);
Движение.Дней = 1;
Движение.Часов = 12;
Движение.План = Истина;
Движение = Движения.Отгулы.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Выборка.Дата;
Движение.Сотрудник = Выборка.СотрудникТабеля;
Движение.Время = 4*60*60;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
6. Отчет
Код
ВЫБРАТЬ
Начисления.ПериодДействия КАК ПериодДействия,
Начисления.Сотрудник КАК Сотрудник,
ЕСТЬNULL(Начисления.Результат, 0) КАК Результат
ПОМЕСТИТЬ ВТЗаРаботуВЦеху
ИЗ
РегистрРасчета.Начисления КАК Начисления
ГДЕ
Начисления.ВидРасчета = &ВидРасчетаЗаРаботуВЦеху
И Начисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода
И Начисления.Активность = ИСТИНА
И Начисления.Сторно = ЛОЖЬ
ИНДЕКСИРОВАТЬ ПО
Сотрудник,
ПериодДействия
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Начисления.ПериодДействия КАК ПериодДействия,
Начисления.Сотрудник КАК Сотрудник,
ЕСТЬNULL(Начисления.Результат, 0) КАК Результат
ПОМЕСТИТЬ ВТЗаОтгулы
ИЗ
РегистрРасчета.Начисления КАК Начисления
ГДЕ
Начисления.ВидРасчета = &ЗаОтгулы
И Начисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода
И Начисления.Активность = ИСТИНА
И Начисления.Сторно = ЛОЖЬ
ИНДЕКСИРОВАТЬ ПО
ПериодДействия,
Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТЗаРаботуВцеху.Сотрудник,
ВТЗаРаботуВцеху.ПериодДействия КАК Период,
ВЫРАЗИТЬ(ЕСТЬNULL(РаботаВЦехуОбороты.ВремяОборот, 0) / 3600 КАК ЧИСЛО(12, 2)) КАК ОтработаноЧасовВКислотномЦеху,
ВТЗаРаботуВцеху.Результат КАК НачисленоДоплаты,
ВЫРАЗИТЬ(ЕСТЬNULL(ОтгулыОстаткиИОбороты.ВремяНачальныйОстаток, 0) / (4 * 60 * 60) КАК ЧИСЛО(12, 2)) КАК ОстатокОтгуловНаНачалоПериода,
ВЫБОР
КОГДА ЕСТЬNULL(ОтгулыОстаткиИОбороты.ВремяРасход, 0) = 0
ТОГДА 0
ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ОтгулыОстаткиИОбороты.ВремяРасход, 0) / (4 * 60 * 60) - 0.5 КАК ЧИСЛО(12, 0))
КОНЕЦ КАК ПредоставленоОтгулов,
ВТЗаОтгулы.Результат КАК НачисленоЗаОтгулы,
ВЫРАЗИТЬ(ЕСТЬNULL(ОтгулыОстаткиИОбороты.ВремяКонечныйОстаток, 0) / (4 * 60 * 60) КАК ЧИСЛО(12, 2)) КАК ОстатокОтгуловНаКонецПериода
ИЗ
ВТЗаРаботуВЦеху КАК ВТЗаРаботуВцеху
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РаботаВЦеху.Обороты(
&НачалоПериода,
&КонецПериода,
Месяц,
Сотрудник В
(ВЫБРАТЬ
ВТЗаРаботуВцеху.Сотрудник
ИЗ
ВТЗаРаботуВцеху КАК ВТЗаРаботуВцеху)) КАК РаботаВЦехуОбороты
ПО ВТЗаРаботуВцеху.Сотрудник = РаботаВЦехуОбороты.Сотрудник
И ВТЗаРаботуВцеху.ПериодДействия = РаботаВЦехуОбороты.Период
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Отгулы.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
Месяц,
,
Сотрудник В
(ВЫБРАТЬ
ВТЗаРаботуВцеху.Сотрудник
ИЗ
ВТЗаРаботуВцеху КАК ВТЗаРаботуВцеху)) КАК ОтгулыОстаткиИОбороты
ПО ВТЗаРаботуВцеху.Сотрудник = ОтгулыОстаткиИОбороты.Сотрудник
И ВТЗаРаботуВцеху.ПериодДействия = ОтгулыОстаткиИОбороты.Период
ЛЕВОЕ СОЕДИНЕНИЕ ВТЗаОтгулы КАК ВТЗаОтгулы
ПО ВТЗаРаботуВцеху.ПериодДействия = ВТЗаОтгулы.ПериодДействия
И ВТЗаРаботуВцеху.Сотрудник = ВТЗаОтгулы.Сотрудник