Аттестация "1С:Специалист" > Аттестация "1С:Специалист" ЗУП

ЗУП 3.0 Специалист Билет 5

<< < (2/4) > >>

arthur2003:

--- Цитата: FireAlex от Ноябрь 16, 2015, 07:56:28 pm ---"Сделал иначе, на случай если на экзамене будет этот релиз."

я тоже покопался немного в нашем случае в РР  ВремяВЧасах= Истина, а в РС.ГрафикиРаботыПоВидамВремени пишется измерение ВремяВЧасах = ложь, поэтому не можем получить ни норму, ни отработанное время по графику. Может так задумывалось, не знаю.

Подскажи, как можно вытащить норму в отчете по другому, если получилось?

--- Конец цитаты ---

присоединяюсь к вопросу. Та же самая проблема и в этом билете и во 2-м.
Не вижу что решение предложенное IgorXML устраняет данную проблему

imp521:
Я прошу прощения, не могу понять уважаемые, почему в решении Demos для документа РасписаниеГрупповыхЗанятий используется данные о времени взятые из Документы.ИндивидуальныйГрафик.ДанныеОВремениСотрудников(ЭтотОбъект), а для документа ПерсональныеТренировки данные берутся из Документы.ТабельУчетаРабочегоВремени.ДанныеОВремениСотрудников(ЭтотОбъект). Почему в одном случае одно, в другом другое? У меня вроде получилось все данные брать из Документы.ИндивидуальныйГрафик.ДанныеОВремениСотрудников(ЭтотОбъект)

imp521:
По поводу "РР  ВремяВЧасах= Истина, а в РС.ГрафикиРаботыПоВидамВремени пишется измерение ВремяВЧасах = ложь". Тут 2 варианта похоже - получить данные фактически отработанных часов из базы ОтработаноЧасов, а часов в дежурстве посчитать соединением по графику работы т.е. самому. Он более быстрый и не несет доп. нагрузок на систему как второй вариант - создать подписку на РР ПриЗаписи и там поменять для индивидуальных графиков(Тип графика Сотрудники) РС.ВремяВЧасах=Истина дополнительно поменяв местами значения ресурсов ОсновноеЗначение<->ДополнительноеЗначение и ОсновноеЗначениеНорма<->ДополнительноеЗначениеНорма, тем самым позволив в РР.ДанныеГрафика видеть фактически отработанные часы из ОсновноеЗначениеФактическийПериодДействия. Но учитывая, что тот же документ Начисление зарплаты  обращается к записи РР не один раз(что-то вызывался он у меня и при заполнении ТЧ документа и при проведении) это делает дополнительную нагрузку на систему. Мне кажется что примут и первый вариант, т.к. индивидуальные графики в 1С учитываются почему-то всегда по дням.

mkanaev:
Мое решение:
Описание.
1. Создал виды времени "Индивидуальные тренировки", "Групповые тренировки" вывел из в константы для получения в документах.
2. Создал константы:
   - Показатель_ОкладПоДолжности - автоматической установки ставок по    сотруднику в документах.
   - Начисление_ГрупповыеЗанятия - для использования в отчете
   - Начисление_ИндивидуальныеЗанятия - для использования в отчете
   - Начисление_Оклад - для использования в отчете

3. Создал начисления:
   - Групповые занятия с формулой "ВремяВЧасах * ОкладПоДолжности", вводиться    только если введено значение табеля
   - Групповые занятия с формулой "ВремяВЧасах * ОкладПоДолжности * 1.2",    вводиться только если введено значение табеля.

4. Создал не периодический регистр сведений "СтавкиПоДолжности" для получения ставок по каждой должности.

5. Создал не периодический регистр сведений "ПериодыГрупповыхТренировок", для выполнения контроля "во время групповой тренировки индивидуальная тренировка не проводится".

6. Создал документ "РасписаниеГрупповыхЗанятий". Документ формирует движения в регистр накопления "ДанныеОперативногоУчетаРабочегоВремениСотрудников", "ПериодыГрупповыхТренировок" и если необходимо ввести ставку по должности то в регистр сведений "ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников". В РН "ДанныеОперативногоУчетаРабочегоВремениСотрудников" заносятся две записи + вид времени групповых тренировок, - вид времени явка, так как в задачи сказано что в период групповых тренировок сотрудник получает ЗП по тарифной ставки от должности. Перед проведением проверяются достаточно ли часов работы за день в который вносится групповая тренировка. Разработал процедуры проверки вводимых данных на предмет пересечения периодов и не корректных периодов.

7. Создал документ "ИндивидуальныеТренировки". Документ формирует движения в регистр накопления "ДанныеОперативногоУчетаРабочегоВремениСотрудников" и если необходимо ввести ставку по должности то в регистр сведений "ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников". Перед проведением проверяется не приходится ли время тренировки на групповое занятие. Проверяется корректность данных в документе.

8. Разработал отчет, данные брал из регистра расчета "Начисления", вирт. таблица "ДанныеГрафика", т.к. индивидуальный график не формируется для начислений в часах, если в строке начисления задан индивидуальный график то норму беру из регистра сведений "ГрафикиРаботыПоВидамВремени" и факт с учетом вирт. таблицы "ФактическийПериодДействия", так как это делается в типовых процедурах расчета заработанной платы 1С ЗУП, в модуле "РасчетЗарплатыРасширенный".

9. Ввел данные по 2 сотрудникам за три месяца.

mkanaev:
Модуль документа "расписание групповых тренировок"

--- Код: ---Процедура ОбработкаПроведения(Отказ, Режим)

Если Константы.ВидВремени_ГрупповыеТренировки.Получить().Пустая() Тогда

СообщениеПользвателю = Новый СообщениеПользователю;
СообщениеПользвателю.Текст = "Не установлена константа ""ВидВремени_ГрупповыеТренировки""";
СообщениеПользвателю.Сообщить();
Отказ = Истина;

КонецЕсли;

Если Константы.Показатель_ОкладПоДолжности.Получить().Пустая() Тогда

СообщениеПользвателю = Новый СообщениеПользователю;
СообщениеПользвателю.Текст = "Не установлена константа ""Показатель_ОкладПоДолжности""";
СообщениеПользвателю.Сообщить();
Отказ = Истина;

КонецЕсли;

Если Отказ Тогда

Возврат;

КонецЕсли;

Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Записать();

ДанныеТабеля = Документы.ТабельУчетаРабочегоВремени.ДанныеОВремениСотрудников(ЭтотОбъект, Данные.ВыгрузитьКолонку("Сотрудник")).Владелец().Выгрузить();

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("ДанныеТабеля", ДанныеТабеля);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Показатель_ОкладПоДолжности", Константы.Показатель_ОкладПоДолжности.Получить());
Запрос.Текст = "ВЫБРАТЬ
               | ДТ.Сотрудник,
               | ДТ.Дата,
               | ДТ.Часы
               |ПОМЕСТИТЬ ДанныеТабеля
               |ИЗ
               | &ДанныеТабеля КАК ДТ
               |ГДЕ
               | ДТ.ВидУчетаВремени = ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.Явка)
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               | ДанныеТабеля.Сотрудник,
               | ДанныеТабеля.Дата,
               | СУММА(ДанныеТабеля.Часы) КАК Часы
               |ПОМЕСТИТЬ Табель
               |ИЗ
               | ДанныеТабеля КАК ДанныеТабеля
               |
               |СГРУППИРОВАТЬ ПО
               | ДанныеТабеля.Сотрудник,
               | ДанныеТабеля.Дата
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               | ВЗ.Сотрудник КАК Сотрудник,
               | ВЗ.День КАК День,
               | ВЗ.НачалоПериода,
               | ВЗ.КонецПериода,
               | ВЗ.Часов КАК Часов,
               | ВЗ.НазваниеЗанятия,
               | ВЗ.ЧасовПоТабелю КАК ЧасовПоТабелю,
               | МАКСИМУМ(ВЫБОР
               | КОГДА ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Период ЕСТЬ 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));

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

--- Конец кода ---

Навигация

[0] Главная страница сообщений

[#] Следующая страница

[*] Предыдущая страница

Перейти к полной версии