Добавлено (10.10.2014, 22:23)
---------------------------------------------
5. Документ ПерсональныеТренировки
Реквизиты: ДатаНачалаПериода, ДатаОкончанияПериода, ИсправленныйДокумент, Подразделение, Организация, ПериодРегистрации, скопированы с документа - Табель
ТабличнаяЧасть - ТаблицаТренировок: Тренер, ДатаНачала, ДатаОкончания
Документ будет проверять занятость времени по РС ГрупповыеЗанятия и писать в РН РабочееВремяСотрудников (как Табель)
Добавлено (10.10.2014, 22:23)
---------------------------------------------
4.Отчет
Подскажите, пожалуйста, один момент. Не могу разобраться, откуда берется значение показателя ЧасовойТарифПоДолжности .
Не надо РС Периодический заводить. Здесь показатель является часовой тарифной ставкой. При приеме на работу его надо ввести.Подскажите, пожалуйста, один момент. Не могу разобраться, откуда берется значение показателя ЧасовойТарифПоДолжности .
Сделал сегодня этот билет. Показатель этот судя по всему заносится вручную, в штатных такого не существует. Я создал документ, который заносит показатель в РС ПериодическиеПоказателиРасчетаЗарплатыСотрудника. Туда заносится показатель для каждого сотрудника и используется бессрочно или до смены пользователем. Это быстрый вариант для экзамена ограниченного по времени. Если делать основательно, то надо, чтобы документы проверяли его наличие в РС РазовыеПоказателиРасчетаЗарплатыСотрудника и, при отсутствии в данном месяце, писали его туда.
"Сделал иначе, на случай если на экзамене будет этот релиз."
я тоже покопался немного в нашем случае в РР ВремяВЧасах= Истина, а в РС.ГрафикиРаботыПоВидамВремени пишется измерение ВремяВЧасах = ложь, поэтому не можем получить ни норму, ни отработанное время по графику. Может так задумывалось, не знаю.
Подскажи, как можно вытащить норму в отчете по другому, если получилось?
Процедура ОбработкаПроведения(Отказ, Режим)
Если Константы.ВидВремени_ГрупповыеТренировки.Получить().Пустая() Тогда
СообщениеПользвателю = Новый СообщениеПользователю;
СообщениеПользвателю.Текст = "Не установлена константа ""ВидВремени_ГрупповыеТренировки""";
СообщениеПользвателю.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Константы.Показатель_ОкладПоДолжности.Получить().Пустая() Тогда
СообщениеПользвателю = Новый СообщениеПользователю;
СообщениеПользвателю.Текст = "Не установлена константа ""Показатель_ОкладПоДолжности""";
СообщениеПользвателю.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Записать();
ДанныеТабеля = Документы.ТабельУчетаРабочегоВремени.ДанныеОВремениСотрудников(ЭтотОбъект, Данные.ВыгрузитьКолонку("Сотрудник")).Владелец().Выгрузить();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("ДанныеТабеля", ДанныеТабеля);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Показатель_ОкладПоДолжности", Константы.Показатель_ОкладПоДолжности.Получить());
Запрос.Текст = "ВЫБРАТЬ
| ДТ.Сотрудник,
| ДТ.Дата,
| ДТ.Часы
|ПОМЕСТИТЬ ДанныеТабеля
|ИЗ
| &ДанныеТабеля КАК ДТ
|ГДЕ
| ДТ.ВидУчетаВремени = ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.Явка)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДанныеТабеля.Сотрудник,
| ДанныеТабеля.Дата,
| СУММА(ДанныеТабеля.Часы) КАК Часы
|ПОМЕСТИТЬ Табель
|ИЗ
| ДанныеТабеля КАК ДанныеТабеля
|
|СГРУППИРОВАТЬ ПО
| ДанныеТабеля.Сотрудник,
| ДанныеТабеля.Дата
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЗ.Сотрудник КАК Сотрудник,
| ВЗ.День КАК День,
| ВЗ.НачалоПериода,
| ВЗ.КонецПериода,
| ВЗ.Часов КАК Часов,
| ВЗ.НазваниеЗанятия,
| ВЗ.ЧасовПоТабелю КАК ЧасовПоТабелю,
| МАКСИМУМ(ВЫБОР
| КОГДА ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Период ЕСТЬ NULL
| ТОГДА ЕСТЬNULL(СтавкиПоДолжности.Сумма, 0)
| ИНАЧЕ 0
| КОНЕЦ) КАК Показатель
|ИЗ
| (ВЫБРАТЬ
| Док.Сотрудник КАК Сотрудник,
| Док.День КАК День,
| ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(Док.День, ЧАС, ЧАС(Док.ВремяНачало)), МИНУТА, МИНУТА(Док.ВремяНачало)) КАК НачалоПериода,
| ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(Док.День, ЧАС, ЧАС(Док.ВремяОкончание)), МИНУТА, МИНУТА(Док.ВремяОкончание)) КАК КонецПериода,
| РАЗНОСТЬДАТ(Док.ВремяНачало, Док.ВремяОкончание, СЕКУНДА) / (60 * 60) КАК Часов,
| Док.НазваниеЗанятия КАК НазваниеЗанятия,
| ЕСТЬNULL(Табель.Часы, 0) КАК ЧасовПоТабелю,
| МАКСИМУМ(КадроваяИсторияСотрудников.Период) КАК ПериодСрезаДоожности
| ИЗ
| Документ.РасписаниеГрупповыхЗанятий.Данные КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ Табель КАК Табель
| ПО Док.Сотрудник = Табель.Сотрудник
| И Док.День = Табель.Дата
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
| ПО Док.Сотрудник = КадроваяИсторияСотрудников.Сотрудник
| И (КОНЕЦПЕРИОДА(Док.День, ДЕНЬ) >= КадроваяИсторияСотрудников.Период)
| И (КадроваяИсторияСотрудников.ГоловнаяОрганизация = &Организация)
| ГДЕ
| Док.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| Док.Сотрудник,
| Док.День,
| ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(Док.День, ЧАС, ЧАС(Док.ВремяНачало)), МИНУТА, МИНУТА(Док.ВремяНачало)),
| ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(Док.День, ЧАС, ЧАС(Док.ВремяОкончание)), МИНУТА, МИНУТА(Док.ВремяОкончание)),
| РАЗНОСТЬДАТ(Док.ВремяНачало, Док.ВремяОкончание, СЕКУНДА) / (60 * 60),
| Док.НазваниеЗанятия,
| ЕСТЬNULL(Табель.Часы, 0)) КАК ВЗ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
| ПО ВЗ.Сотрудник = КадроваяИсторияСотрудников.Сотрудник
| И ВЗ.ПериодСрезаДоожности = КадроваяИсторияСотрудников.Период
| И (КадроваяИсторияСотрудников.ГоловнаяОрганизация = &Организация)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиПоДолжности КАК СтавкиПоДолжности
| ПО (ВЫБОР
| КОГДА КадроваяИсторияСотрудников.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
| ИЛИ КадроваяИсторияСотрудников.ДействуетДо > ВЗ.День
| ТОГДА КадроваяИсторияСотрудников.Должность
| ИНАЧЕ КадроваяИсторияСотрудников.ДолжностьПоОкончании
| КОНЕЦ = СтавкиПоДолжности.Должность)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников КАК ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников
| ПО ВЗ.Сотрудник = ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Сотрудник
| И (ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Организация = &Организация)
| И (ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Показатель = &Показатель_ОкладПоДолжности)
| И (ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Период МЕЖДУ НАЧАЛОПЕРИОДА(ВЗ.День, ДЕНЬ) И КОНЕЦПЕРИОДА(ВЗ.День, ДЕНЬ))
|
|СГРУППИРОВАТЬ ПО
| ВЗ.Сотрудник,
| ВЗ.День,
| ВЗ.НачалоПериода,
| ВЗ.КонецПериода,
| ВЗ.Часов,
| ВЗ.НазваниеЗанятия,
| ВЗ.ЧасовПоТабелю
|ИТОГИ
| СУММА(Часов),
| МАКСИМУМ(ЧасовПоТабелю),
| МАКСИМУМ(Показатель)
|ПО
| Сотрудник,
| День
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Док.НомерСтроки
|ИЗ
| Документ.РасписаниеГрупповыхЗанятий.Данные КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасписаниеГрупповыхЗанятий.Данные КАК Док1
| ПО (Док1.Ссылка = &Ссылка)
| И Док.НомерСтроки <> Док1.НомерСтроки
| И Док.Сотрудник = Док1.Сотрудник
| И Док.День = Док1.День
| И (Док.ВремяНачало < Док1.ВремяНачало
| И Док.ВремяОкончание > Док1.ВремяНачало
| ИЛИ Док.ВремяНачало < Док1.ВремяОкончание
| И Док.ВремяОкончание > Док1.ВремяОкончание
| ИЛИ Док.ВремяНачало > Док1.ВремяНачало
| И Док.ВремяОкончание < Док1.ВремяОкончание)
|ГДЕ
| Док.Ссылка = &Ссылка
| И (НЕ Док1.Ссылка ЕСТЬ NULL
| ИЛИ Док.ВремяНачало > Док.ВремяОкончание
| ИЛИ НАЧАЛОПЕРИОДА(Док.День, МЕСЯЦ) <> НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата, МЕСЯЦ, 1), МЕСЯЦ))
|
|СГРУППИРОВАТЬ ПО
| Док.НомерСтроки";
Результат = Запрос.ВыполнитьПакет();
ВыборкаПроверка = Результат[3].Выбрать();
Пока ВыборкаПроверка.Следующий() Цикл
СообщениеПользвателю = Новый СообщениеПользователю;
СообщениеПользвателю.Текст = "Не верно указан период в строке номер: " + Строка(ВыборкаПроверка.НомерСтроки);
СообщениеПользвателю.Сообщить();
Отказ = Истина;
КонецЦикла;
Если Отказ Тогда
Возврат;
КонецЕсли;
ВыборкаСотрудников = Результат[2].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСотрудников.Следующий() Цикл
ЗначениеПоказателя = 0;
НачалоПериода = Неопределено;
ВыборкаДень = ВыборкаСотрудников.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаДень.Следующий() Цикл
Если ВыборкаДень.ЧасовПоТабелю < ВыборкаДень.Часов Тогда
СообщениеПользвателю = Новый СообщениеПользователю;
СообщениеПользвателю.Текст = "Сотрудник " + Строка(ВыборкаСотрудников.Сотрудник) + " " + Формат(ВыборкаДень.День, "ДЛФ=DD") + " работает всего " + Строка(ВыборкаДень.ЧасовПоТабелю);
СообщениеПользвателю.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Движение = Движения.ДанныеОперативногоУчетаРабочегоВремениСотрудников.Добавить();
Движение.Период = ВыборкаДень.День;
Движение.Сотрудник = ВыборкаСотрудников.Сотрудник;
Движение.ПериодРегистрации = НачалоМесяца(ВыборкаДень.День);
Движение.ВидУчетаВремени = Константы.ВидВремени_ГрупповыеТренировки.Получить();
Движение.ВидДанных = Перечисления.ВидыДанныхУчетаВремениСотрудников.ДополнительноеВнутрисменноеВремя;
Движение.Часы = ВыборкаДень.Часов;
Движение = Движения.ДанныеОперативногоУчетаРабочегоВремениСотрудников.Добавить();
Движение.Период = ВыборкаДень.День;
Движение.Сотрудник = ВыборкаСотрудников.Сотрудник;
Движение.ПериодРегистрации = НачалоМесяца(ВыборкаДень.День);
Движение.ВидУчетаВремени = Справочники.ВидыИспользованияРабочегоВремени.Явка;
Движение.ВидДанных = Перечисления.ВидыДанныхУчетаВремениСотрудников.ДанныеВнутрисменныхНеявок;
Движение.Часы = ВыборкаДень.Часов * -1;
Выборка = ВыборкаДень.Выбрать();
Пока Выборка.Следующий() Цикл
Движение = Движения.ПериодыГрупповыхТренировок.Добавить();
ЗаполнитьЗначенияСвойств(Движение, Выборка);
КонецЦикла;
Если ЗначениеПоказателя = 0 Тогда
ЗначениеПоказателя = ВыборкаДень.Показатель;
НачалоПериода = ВыборкаДень.День;
Продолжить;
КонецЕсли;
Если ЗначениеПоказателя <> ВыборкаДень.Показатель И Не ЗначениеПоказателя = 0 Тогда
Движение = Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Добавить();
Движение.Период = НачалоПериода;
Движение.Сотрудник = ВыборкаСотрудников.Сотрудник;
Движение.Организация = Организация;
Движение.ФизическоеЛицо = ВыборкаСотрудников.Сотрудник.ФизическоеЛицо;
Движение.Показатель = Константы.Показатель_ОкладПоДолжности.Получить();
Движение.Значение = ЗначениеПоказателя;
Движение.ДействуетДо = ВыборкаДень.День;
ЗначениеПоказателя = ВыборкаДень.Показатель;
НачалоПериода = ВыборкаДень.День;
Продолжить;
КонецЕсли;
КонецЦикла;
Если Не ЗначениеПоказателя = 0 Тогда
Движение = Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Добавить();
Движение.Период = НачалоПериода;
Движение.Сотрудник = ВыборкаСотрудников.Сотрудник;
Движение.Организация = Организация;
Движение.ФизическоеЛицо = ВыборкаСотрудников.Сотрудник.ФизическоеЛицо;
Движение.Показатель = Константы.Показатель_ОкладПоДолжности.Получить();
Движение.Значение = ЗначениеПоказателя;
КонецЕсли;
КонецЦикла;
Если Не Отказ Тогда
Движения.ДанныеОперативногоУчетаРабочегоВремениСотрудников.Записывать = Истина;
Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;
Движения.ПериодыГрупповыхТренировок.Записывать = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Дата = Дата(Год(Дата), Месяц(Дата), 25);
ПериодРегистрации = НачалоМесяца(ДобавитьМесяц(Дата, 1));
ДатаНачалаПериода = НачалоМесяца(ДобавитьМесяц(Дата, 1));
ДатаОкончанияПериода = КонецМесяца(ДобавитьМесяц(Дата, 1));
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, Режим)
Если Константы.ВидВремени_ИндивидуальныеТренировки.Получить().Пустая() Тогда
СообщениеПользвателю = Новый СообщениеПользователю;
СообщениеПользвателю.Текст = "Не установлена константа ""ВидВремени_ИндивидуальныеТренировки""";
СообщениеПользвателю.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Константы.Показатель_ОкладПоДолжности.Получить().Пустая() Тогда
СообщениеПользвателю = Новый СообщениеПользователю;
СообщениеПользвателю.Текст = "Не установлена константа ""Показатель_ОкладПоДолжности""";
СообщениеПользвателю.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Записать();
ТаблицаДанные = Данные.Выгрузить(Новый Массив);
Для Каждого СтрокаДанные Из Данные Цикл
Если СтрокаДанные.НачалоПериода > СтрокаДанные.КонецПериода Тогда
СообщениеПользвателю = Новый СообщениеПользователю;
СообщениеПользвателю.Текст = "В строке номер: " + Строка(СтрокаДанные.НомерСтроки) + " не верно указан период";
СообщениеПользвателю.Сообщить();
Отказ = Истина;
Продолжить;
КонецЕсли;
НачалоПериода = СтрокаДанные.НачалоПериода;
Пока Год(НачалоПериода) <> Год(СтрокаДанные.КонецПериода)
Или Месяц(НачалоПериода) <> Месяц(СтрокаДанные.КонецПериода)
Или День(НачалоПериода) <> День(СтрокаДанные.КонецПериода) Цикл
СтрокаТаблицыДанные = ТаблицаДанные.Добавить();
СтрокаТаблицыДанные.сотрудник = СтрокаДанные.Сотрудник;
СтрокаТаблицыДанные.НачалоПериода = НачалоПериода;
СтрокаТаблицыДанные.КонецПериода = КонецДня(НачалоПериода);
НачалоПериода = НачалоДня(НачалоПериода + 60*60*24);
КонецЦикла;
СтрокаТаблицыДанные = ТаблицаДанные.Добавить();
СтрокаТаблицыДанные.сотрудник = СтрокаДанные.Сотрудник;
СтрокаТаблицыДанные.НачалоПериода = НачалоПериода;
СтрокаТаблицыДанные.КонецПериода = СтрокаДанные.КонецПериода;
КонецЦикла;
Если Отказ Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТаблицаДанных", ТаблицаДанные);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Показатель_ОкладПоДолжности", Константы.Показатель_ОкладПоДолжности.Получить());
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.Текст = "ВЫБРАТЬ
| Док.Сотрудник,
| Док.НачалоПериода,
| Док.КонецПериода
|ПОМЕСТИТЬ Данные
|ИЗ
| &ТаблицаДанных КАК Док
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЗ.Сотрудник КАК Сотрудник,
| ВЗ.День КАК День,
| ВЗ.НачалоПериода,
| ВЗ.КонецПериода,
| РАЗНОСТЬДАТ(ВЗ.НачалоПериода, ВЗ.КонецПериода, СЕКУНДА) / (60 * 60) КАК Часов,
| МАКСИМУМ(ВЫБОР
| КОГДА ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Период ЕСТЬ NULL
| ТОГДА ЕСТЬNULL(СтавкиПоДолжности.Сумма, 0)
| ИНАЧЕ 0
| КОНЕЦ) КАК Показатель
|ИЗ
| (ВЫБРАТЬ
| Данные.Сотрудник КАК Сотрудник,
| НАЧАЛОПЕРИОДА(Данные.НачалоПериода, ДЕНЬ) КАК День,
| Данные.НачалоПериода КАК НачалоПериода,
| Данные.КонецПериода КАК КонецПериода,
| МАКСИМУМ(КадроваяИсторияСотрудников.Период) КАК ПериодСрезаДоожности
| ИЗ
| Данные КАК Данные
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
| ПО Данные.Сотрудник = КадроваяИсторияСотрудников.Сотрудник
| И (КОНЕЦПЕРИОДА(Данные.НачалоПериода, ДЕНЬ) >= КадроваяИсторияСотрудников.Период)
| И (КадроваяИсторияСотрудников.ГоловнаяОрганизация = &Организация)
|
| СГРУППИРОВАТЬ ПО
| Данные.Сотрудник,
| НАЧАЛОПЕРИОДА(Данные.НачалоПериода, ДЕНЬ),
| Данные.НачалоПериода,
| Данные.КонецПериода) КАК ВЗ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
| ПО ВЗ.Сотрудник = КадроваяИсторияСотрудников.Сотрудник
| И ВЗ.ПериодСрезаДоожности = КадроваяИсторияСотрудников.Период
| И (КадроваяИсторияСотрудников.ГоловнаяОрганизация = &Организация)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиПоДолжности КАК СтавкиПоДолжности
| ПО (ВЫБОР
| КОГДА КадроваяИсторияСотрудников.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
| ИЛИ КадроваяИсторияСотрудников.ДействуетДо > ВЗ.День
| ТОГДА КадроваяИсторияСотрудников.Должность
| ИНАЧЕ КадроваяИсторияСотрудников.ДолжностьПоОкончании
| КОНЕЦ = СтавкиПоДолжности.Должность)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников КАК ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников
| ПО ВЗ.Сотрудник = ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Сотрудник
| И (ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Организация = &Организация)
| И (ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Показатель = &Показатель_ОкладПоДолжности)
| И (ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Период МЕЖДУ НАЧАЛОПЕРИОДА(ВЗ.День, ДЕНЬ) И КОНЕЦПЕРИОДА(ВЗ.День, ДЕНЬ))
|
|СГРУППИРОВАТЬ ПО
| ВЗ.Сотрудник,
| ВЗ.День,
| ВЗ.НачалоПериода,
| ВЗ.КонецПериода,
| РАЗНОСТЬДАТ(ВЗ.НачалоПериода, ВЗ.КонецПериода, СЕКУНДА) / (60 * 60)
|ИТОГИ
| СУММА(Часов),
| МАКСИМУМ(Показатель)
|ПО
| Сотрудник,
| День
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Док.НомерСтроки,
| МАКСИМУМ(ВЫБОР
| КОГДА ПериодыГрупповыхТренировок.Сотрудник ЕСТЬ NULL
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ) КАК ЕстьПересечение
|ИЗ
| Документ.ИндивидуальныеТренировки.Данные КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ИндивидуальныеТренировки.Данные КАК Док1
| ПО (Док1.Ссылка = &Ссылка)
| И Док.НомерСтроки <> Док1.НомерСтроки
| И Док.Сотрудник = Док1.Сотрудник
| И (Док.НачалоПериода < Док1.НачалоПериода
| И Док.КонецПериода > Док1.НачалоПериода
| ИЛИ Док.НачалоПериода < Док1.КонецПериода
| И Док.КонецПериода > Док1.КонецПериода
| ИЛИ Док.НачалоПериода > Док1.НачалоПериода
| И Док.КонецПериода < Док1.КонецПериода)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПериодыГрупповыхТренировок КАК ПериодыГрупповыхТренировок
| ПО Док.Сотрудник = ПериодыГрупповыхТренировок.Сотрудник
| И (Док.НачалоПериода < ПериодыГрупповыхТренировок.НачалоПериода
| И Док.КонецПериода > ПериодыГрупповыхТренировок.НачалоПериода
| ИЛИ Док.НачалоПериода < ПериодыГрупповыхТренировок.КонецПериода
| И Док.КонецПериода > ПериодыГрупповыхТренировок.КонецПериода
| ИЛИ Док.НачалоПериода > ПериодыГрупповыхТренировок.НачалоПериода
| И Док.КонецПериода < ПериодыГрупповыхТренировок.КонецПериода)
|ГДЕ
| Док.Ссылка = &Ссылка
| И (НЕ Док1.Ссылка ЕСТЬ NULL
| ИЛИ НЕ ПериодыГрупповыхТренировок.Сотрудник ЕСТЬ NULL )
|
|СГРУППИРОВАТЬ ПО
| Док.НомерСтроки";
Результат = Запрос.ВыполнитьПакет();
ВыборкаПроверка = Результат[2].Выбрать();
Пока ВыборкаПроверка.Следующий() Цикл
СообщениеПользвателю = Новый СообщениеПользователю;
Если Не ВыборкаПроверка.ЕстьПересечение Тогда
СообщениеПользвателю.Текст = "Не верно указан период в строке номер: " + Строка(ВыборкаПроверка.НомерСтроки);
Иначе
СообщениеПользвателю.Текст = "Не верно указан период в строке номер: " + Строка(ВыборкаПроверка.НомерСтроки) + " в это время есть групповое занятие";
КонецЕсли;
СообщениеПользвателю.Сообщить();
Отказ = Истина;
КонецЦикла;
Если Отказ Тогда
Возврат;
КонецЕсли;
ВыборкаСотрудников = Результат[1].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСотрудников.Следующий() Цикл
ЗначениеПоказателя = 0;
НачалоПериода = Неопределено;
ВыборкаДень = ВыборкаСотрудников.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаДень.Следующий() Цикл
Движение = Движения.ДанныеОперативногоУчетаРабочегоВремениСотрудников.Добавить();
Движение.Период = ВыборкаДень.День;
Движение.Сотрудник = ВыборкаСотрудников.Сотрудник;
Движение.ПериодРегистрации = НачалоМесяца(ВыборкаДень.День);
Движение.ВидУчетаВремени = Константы.ВидВремени_ИндивидуальныеТренировки.Получить();
Движение.ВидДанных = Перечисления.ВидыДанныхУчетаВремениСотрудников.ДополнительноеВнутрисменноеВремя;
Движение.Часы = ВыборкаДень.Часов;
Если ЗначениеПоказателя = 0 Тогда
ЗначениеПоказателя = ВыборкаДень.Показатель;
НачалоПериода = ВыборкаДень.День;
Продолжить;
КонецЕсли;
Если ЗначениеПоказателя <> ВыборкаДень.Показатель И Не ЗначениеПоказателя = 0 Тогда
Движение = Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Добавить();
Движение.Период = НачалоПериода;
Движение.Сотрудник = ВыборкаСотрудников.Сотрудник;
Движение.Организация = Организация;
Движение.ФизическоеЛицо = ВыборкаСотрудников.Сотрудник.ФизическоеЛицо;
Движение.Показатель = Константы.Показатель_ОкладПоДолжности.Получить();
Движение.Значение = ЗначениеПоказателя;
Движение.ДействуетДо = ВыборкаДень.День;
ЗначениеПоказателя = ВыборкаДень.Показатель;
НачалоПериода = ВыборкаДень.День;
Продолжить;
КонецЕсли;
КонецЦикла;
Если Не ЗначениеПоказателя = 0 Тогда
Движение = Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Добавить();
Движение.Период = НачалоПериода;
Движение.Сотрудник = ВыборкаСотрудников.Сотрудник;
Движение.Организация = Организация;
Движение.ФизическоеЛицо = ВыборкаСотрудников.Сотрудник.ФизическоеЛицо;
Движение.Показатель = Константы.Показатель_ОкладПоДолжности.Получить();
Движение.Значение = ЗначениеПоказателя;
КонецЕсли;
КонецЦикла;
Если Не Отказ Тогда
Движения.ДанныеОперативногоУчетаРабочегоВремениСотрудников.Записывать = Истина;
Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;
КонецЕсли;
КонецПроцедуры
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ВЗ.ПериодДействияНачало, МЕСЯЦ) КАК Месяц,
ВЗ.Сотрудник,
ВЗ.ПериодДействияНачало КАК ПериодСреза,
0 КАК ЧасовПоГрафикуДежурства,
ВЫБОР
КОГДА ВЗ.ВидРасчета = &Оклад
ТОГДА ВЗ.Результат
ИНАЧЕ 0
КОНЕЦ КАК Начислено_Дежурство,
ВЫБОР
КОГДА ВЗ.ВидРасчета = &ГрупповыеЗанятия
ТОГДА ВЗ.Результат
ИНАЧЕ 0
КОНЕЦ КАК Начислено_ГрупповыеЗанятия,
ВЫБОР
КОГДА ВЗ.ВидРасчета = &ИндивидуальныеЗанятия
ТОГДА ВЗ.Результат
ИНАЧЕ 0
КОНЕЦ КАК Начислено_ИндивидуальныеЗанятия,
ВЫБОР
КОГДА ВЗ.ВидРасчета = &Оклад
ТОГДА ВЫБОР
КОГДА ВЗ.ОтработаноЧасов ЕСТЬ NULL
ТОГДА ВЗ.ОтработаноЧасов_ИндивидуальныйГрафик
ИНАЧЕ ВЗ.ОтработаноЧасов
КОНЕЦ
ИНАЧЕ 0
КОНЕЦ КАК Часов_Дежурство,
ВЫБОР
КОГДА ВЗ.ВидРасчета = &ГрупповыеЗанятия
ТОГДА ВЫБОР
КОГДА ВЗ.ОтработаноЧасов ЕСТЬ NULL
ТОГДА ВЗ.ОтработаноЧасов_ИндивидуальныйГрафик
ИНАЧЕ ВЗ.ОтработаноЧасов
КОНЕЦ
ИНАЧЕ 0
КОНЕЦ КАК Часов_ГрупповыеЗанятия,
ВЫБОР
КОГДА ВЗ.ВидРасчета = &ИндивидуальныеЗанятия
ТОГДА ВЫБОР
КОГДА ВЗ.ОтработаноЧасов ЕСТЬ NULL
ТОГДА ВЗ.ОтработаноЧасов_ИндивидуальныйГрафик
ИНАЧЕ ВЗ.ОтработаноЧасов
КОНЕЦ
ИНАЧЕ 0
КОНЕЦ КАК Часов_ИндивидуальныеЗанятия
ПОМЕСТИТЬ Данные
ИЗ
(ВЫБРАТЬ
Начисления.Регистратор КАК Регистратор,
Начисления.НомерСтроки КАК НомерСтроки,
Начисления.Сотрудник КАК Сотрудник,
Начисления.ВидРасчета КАК ВидРасчета,
Начисления.ПериодДействияНачало КАК ПериодДействияНачало,
Начисления.ПериодДействияКонец КАК ПериодДействияКонец,
Начисления.Результат КАК Результат,
СУММА(ЕСТЬNULL(ГрафикиРаботыПоВидамВремени.ДополнительноеЗначение, 0)) КАК ОтработаноЧасов_ИндивидуальныйГрафик,
Начисления.ОсновноеЗначениеФактическийПериодДействия КАК ОтработаноЧасов
ИЗ
РегистрРасчета.Начисления.ДанныеГрафика(
ГоловнаяОрганизация = &Организация
И ВидРасчета В (&Оклад, &ГрупповыеЗанятия, &ИндивидуальныеЗанятия)) КАК Начисления
ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.Начисления.ФактическийПериодДействия(
ГоловнаяОрганизация = &Организация
И ВидРасчета В (&Оклад, &ГрупповыеЗанятия, &ИндивидуальныеЗанятия)) КАК ФактическийПриодДействия
ПО Начисления.Регистратор = ФактическийПриодДействия.Регистратор
И Начисления.НомерСтроки = ФактическийПриодДействия.НомерСтроки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
ПО (ГрафикиРаботыПоВидамВремени.ГрафикРаботы = ФактическийПриодДействия.ГрафикРаботы)
И (ГрафикиРаботыПоВидамВремени.ВидУчетаВремени = ФактическийПриодДействия.ВидУчетаВремени)
И (ГрафикиРаботыПоВидамВремени.Дата МЕЖДУ ФактическийПриодДействия.ПериодДействияНачало И ФактическийПриодДействия.ПериодДействияКонец)
И (НЕ ГрафикиРаботыПоВидамВремени.ВремяВЧасах)
И (ТИПЗНАЧЕНИЯ(ФактическийПриодДействия.ГрафикРаботы) = ТИП(Справочник.Сотрудники))
ГДЕ
Начисления.ПериодДействияНачало МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Начисления.Регистратор,
Начисления.НомерСтроки,
Начисления.Сотрудник,
Начисления.ВидРасчета,
Начисления.ПериодДействияНачало,
Начисления.ПериодДействияКонец,
Начисления.Результат,
Начисления.ОсновноеЗначениеФактическийПериодДействия) КАК ВЗ
ОБЪЕДИНИТЬ
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ВЗ.ПериодДействияНачало, МЕСЯЦ),
ВЗ.Сотрудник,
ВЗ.ПериодДействияНачало,
ВЫБОР
КОГДА ВЗ.ЧасовПоНорме ЕСТЬ NULL
ТОГДА ВЗ.ЧасовПоНорме_ИндивидуальныйГрафик
ИНАЧЕ ВЗ.ЧасовПоНорме
КОНЕЦ,
0,
0,
0,
0,
0,
0
ИЗ
(ВЫБРАТЬ
Начисления.Регистратор КАК Регистратор,
Начисления.НомерСтроки КАК НомерСтроки,
Начисления.Сотрудник КАК Сотрудник,
Начисления.ВидРасчета КАК ВидРасчета,
Начисления.ПериодДействияНачало КАК ПериодДействияНачало,
Начисления.ПериодДействияКонец КАК ПериодДействияКонец,
Начисления.ОсновноеЗначениеНормаПериодДействия КАК ЧасовПоНорме,
СУММА(ЕСТЬNULL(ГрафикиРаботыПоВидамВремени.ДополнительноеЗначениеНорма, 0)) КАК ЧасовПоНорме_ИндивидуальныйГрафик
ИЗ
РегистрРасчета.Начисления.ДанныеГрафика(
ГоловнаяОрганизация = &Организация
И ВидРасчета = &Оклад) КАК Начисления
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
ПО Начисления.ГрафикРаботы = ГрафикиРаботыПоВидамВремени.ГрафикРаботы
И Начисления.ВидУчетаВремени = ГрафикиРаботыПоВидамВремени.ВидУчетаВремени
И (ГрафикиРаботыПоВидамВремени.Дата МЕЖДУ Начисления.ПериодДействияНачало И Начисления.ПериодДействияКонец)
И (НЕ ГрафикиРаботыПоВидамВремени.ВремяВЧасах)
И (ТИПЗНАЧЕНИЯ(Начисления.ГрафикРаботы) = ТИП(справочник.Сотрудники))
ГДЕ
Начисления.ПериодДействияНачало МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Начисления.Регистратор,
Начисления.НомерСтроки,
Начисления.Сотрудник,
Начисления.ВидРасчета,
Начисления.ПериодДействияНачало,
Начисления.ПериодДействияКонец,
Начисления.ОсновноеЗначениеНормаПериодДействия) КАК ВЗ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Данные.Сотрудник,
Данные.ПериодСреза
ПОМЕСТИТЬ ТаблицаСреза
ИЗ
Данные КАК Данные
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ДАТАВРЕМЯ(1, 1, 1) КАК ПериодСреза,
ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность
ПОМЕСТИТЬ Представления_Должности
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Данные.Месяц,
Данные.Сотрудник,
Представления_Должности.Должность,
СУММА(Данные.ЧасовПоГрафикуДежурства) КАК ЧасовПоГрафикуДежурства,
СУММА(Данные.Начислено_Дежурство) КАК Начислено_Дежурство,
СУММА(Данные.Начислено_ГрупповыеЗанятия) КАК Начислено_ГрупповыеЗанятия,
СУММА(Данные.Начислено_ИндивидуальныеЗанятия) КАК Начислено_ИндивидуальныеЗанятия,
СУММА(Данные.Часов_Дежурство) КАК Часов_Дежурство,
СУММА(Данные.Часов_ГрупповыеЗанятия) КАК Часов_ГрупповыеЗанятия,
СУММА(Данные.Часов_ИндивидуальныеЗанятия) КАК Часов_ИндивидуальныеЗанятия
ИЗ
Данные КАК Данные
ЛЕВОЕ СОЕДИНЕНИЕ Представления_Должности КАК Представления_Должности
ПО Данные.Сотрудник = Представления_Должности.Сотрудник
И Данные.ПериодСреза = Представления_Должности.ПериодСреза
СГРУППИРОВАТЬ ПО
Данные.Месяц,
Данные.Сотрудник,
Представления_Должности.Должность
7. Создал документ "ИндивидуальныеТренировки". Документ формирует движения в регистр накопления "ДанныеОперативногоУчетаРабочегоВремениСотрудников"Круто, запись в этом регистре вытесняет все прочие виды времени. Это означает, что записав 1 час времени персональной тренировки в этот регистр, явка сотрудника в этот день тоже будет 1 час, с соответствующим уменьшением з/п при расчете.