Как получить количество часов по графику
По теме из базы знаний
- Методология i3 как основа новой экономики. Индустрия 5.0
- Как сдать экзамен 1С:Специалист по платформе?
- Фриланс: как получать московскую зарплату, живя в деревне у дедушки
- История одного админа в мире 1С. Как поиски причины тормозов 1С привели к созданию нового продукта
- Как пробудить в разработчике наставника
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
//------------------------У меня аналогичная ситуация решил таким образом-------------------------
Перем ПериодРегистрации;
Перем СоответствиеСотрудникГрафик;
Перем СоответствиеГрафикНорма;
Функция ПолучитьНормуВремениПоДню(Сотрудник, НомерДня, Период)
// Здесь добавить //----------------------------------------------------
СоответствиеСотрудникГрафик = Новый Соответствие;
СоответствиеГрафикНорма = Новый Соответствие;
ПериодРегистрации = Период;
//----------------------------------------------------------------------------
ГрафикСотрудника = СоответствиеСотрудникГрафик.Получить(Сотрудник);
Если ГрафикСотрудника = Неопределено Тогда
// Графика по этому сотруднику еще нет, нужно получить
//------------------------------------------------После вызов функции--------------------------------------------------------
Сотрудник = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию("Иванов Иван Иванович"); //ФИО
НомерДня = Число(1); //День
Период = НачалоМесяца(ТекущаяДата()); //Месяц
Часов = ПолучитьНормуВремениПоДню(Сотрудник, НомерДня, Период);
Показать
(2) PoZiTiFFF,
Например так:
Например так:
Перем СоответствиеГрафикНорма;
СоответствиеГрафикНорма = Новый Соответствие;
// Функция возвращает норму времени в часах на указанный день по указанному сотруднику
Функция ПолучитьНормуВремениПоДню(Сотрудник, Период, НомерДня)
Попытка
ПериодРегистрации = Период;
ГрафикСотрудника = СоответствиеСотрудникГрафик.Получить(Сотрудник);
Если ГрафикСотрудника = Неопределено Тогда
// Графика по этому сотруднику еще нет, нужно получить
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
Запрос.УстановитьПараметр("ПериодРегистрации", ПериодРегистрации);
ТекстЗапроса = "ВЫБРАТЬ
| ДатаТабеля
|
|ПОМЕСТИТЬ ВТДатыТабеля
| ИЗ (
| ВЫБРАТЬ
| ДАТАВРЕМЯ(" + Формат(Год(ПериодРегистрации), "ЧГ=4") + ", " + Месяц(ПериодРегистрации) + " , 1) КАК ДатаТабеля
| ";
Для ИндексДня = 2 По День(КонецМесяца(ПериодРегистрации)) Цикл
ТекстЗапроса = ТекстЗапроса +
"ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
| ДАТАВРЕМЯ(" + Формат(Год(ПериодРегистрации), "ЧГ=4")+ ", " + Месяц(ПериодРегистрации) + " ," + ИндексДня + ")
| ";
КонецЦикла;
ТекстЗапроса = ТекстЗапроса + ") КАК ДатыТабеля";
Запрос.Текст = ТекстЗапроса;
Запрос.Выполнить();
Запрос.Текст = "ВЫБРАТЬ
| РаботникиОрганизаций.Период,
| РаботникиОрганизаций.Сотрудник,
| РаботникиОрганизаций.ГрафикРаботы
|ПОМЕСТИТЬ ВТРаботникиОрганизаций
|ИЗ
| РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
|ГДЕ РаботникиОрганизаций.Сотрудник = &Сотрудник
| И РаботникиОрганизаций.Период > &ПериодРегистрации
| И РаботникиОрганизаций.Период <= КонецПериода(&ПериодРегистрации, МЕСЯЦ)
| И РаботникиОрганизаций.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РаботникиОрганизацийСрезПоследних.Период,
| РаботникиОрганизацийСрезПоследних.Сотрудник,
| РаботникиОрганизацийСрезПоследних.ГрафикРаботы
|ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ПериодРегистрации, Сотрудник = &Сотрудник) КАК РаботникиОрганизацийСрезПоследних
|ГДЕ
| РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)";
Запрос.Выполнить();
Запрос.Текст = "ВЫБРАТЬ
| ДатыИзмененияГрафика.ДатаТабеля,
| ДатыИзмененияГрафика.Сотрудник,
| ДатыИзмененияГрафика.Период,
| РаботникиОрганизаций.ГрафикРаботы
|ПОМЕСТИТЬ ВТДатыСотрудникГрафик
|ИЗ
| (ВЫБРАТЬ
| ВТДатыТабеля.ДатаТабеля КАК ДатаТабеля,
| ВТРаботникиОрганизаций.Сотрудник КАК Сотрудник,
| МАКСИМУМ(ВТРаботникиОрганизаций.Период) КАК Период
| ИЗ
| ВТДатыТабеля КАК ВТДатыТабеля
| ЛЕВОЕ СОЕДИНЕНИЕ ВТРаботникиОрганизаций КАК ВТРаботникиОрганизаций
| ПО (ВТРаботникиОрганизаций.Период <= ВТДатыТабеля.ДатаТабеля)
|
| СГРУППИРОВАТЬ ПО
| ВТДатыТабеля.ДатаТабеля,
| ВТРаботникиОрганизаций.Сотрудник) КАК ДатыИзмененияГрафика
| ЛЕВОЕ СОЕДИНЕНИЕ ВТРаботникиОрганизаций КАК РаботникиОрганизаций
| ПО (РаботникиОрганизаций.Период = ДатыИзмененияГрафика.Период)
| И (РаботникиОрганизаций.Сотрудник = ДатыИзмененияГрафика.Сотрудник)";
Запрос.Выполнить();
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ГрафикиРаботы.ГрафикРаботы,
| ГрафикиРаботы.Дата,
| ГрафикиРаботы.ОсновноеЗначение
|ПОМЕСТИТЬ ВТГрафикиРаботы
|ИЗ
| ВТРаботникиОрганизаций КАК РаботникиОрганизаций
|ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботы
|ПО
| (ГрафикиРаботы.ГрафикРаботы = РаботникиОрганизаций.ГрафикРаботы
| ИЛИ ГрафикиРаботы.ГрафикРаботы = РаботникиОрганизаций.Сотрудник)
| И ГрафикиРаботы.Месяц = &ПериодРегистрации
| И ГрафикиРаботы.План
| И ГрафикиРаботы.ВидУчетаВремени = ЗНАЧЕНИЕ(Перечисление.ВидыУчетаВремени.ПоЧасам)";
Запрос.Выполнить();
Запрос.Текст = "ВЫБРАТЬ
| ЕСТЬNULL(ИндивидуальныйГрафик.ГрафикРаботы, ОбщийГрафик.ГрафикРаботы) КАК ГрафикРаботы,
| ДЕНЬ(ДатыТабеля.ДатаТабеля) КАК НомерДня,
| ЕСТЬNULL(ИндивидуальныйГрафик.ОсновноеЗначение, ОбщийГрафик.ОсновноеЗначение) КАК НормаЧасов
|
|ИЗ
| ВТДатыСотрудникГрафик КАК ДатыТабеля
|
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ИндивидуальныйГрафик
|ПО
| ИндивидуальныйГрафик.ГрафикРаботы = ДатыТабеля.Сотрудник
| И ИндивидуальныйГрафик.Дата = ДатыТабеля.ДатаТабеля
| И ИндивидуальныйГрафик.Месяц = &ПериодРегистрации
| И ИндивидуальныйГрафик.ВидУчетаВремени = Значение(Перечисление.ВидыУчетаВремени.ПоЧасам)
| И ИндивидуальныйГрафик.План
|
|ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ОбщийГрафик
|ПО
| ОбщийГрафик.ГрафикРаботы = ДатыТабеля.ГрафикРаботы
| И ОбщийГрафик.Дата = ДатыТабеля.ДатаТабеля
| И ОбщийГрафик.Месяц = &ПериодРегистрации
| И ОбщийГрафик.ВидУчетаВремени = Значение(Перечисление.ВидыУчетаВремени.ПоЧасам)
| И ОбщийГрафик.План
| УПОРЯДОЧИТЬ ПО ГрафикРаботы, НомерДня, НормаЧасов";
РезультатЗапроса = Запрос.Выполнить();
МассивНормыДней = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("НормаЧасов");
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ГрафикРаботы = Выборка.ГрафикРаботы;
СоответствиеСотрудникГрафик.Вставить(Сотрудник, ГрафикРаботы);
СоответствиеГрафикНорма.Вставить(ГрафикРаботы, МассивНормыДней);
Возврат МассивНормыДней[НомерДня-1];
Иначе
МассивДней = СоответствиеГрафикНорма.Получить(ГрафикСотрудника);
Возврат МассивДней[НомерДня-1];
КонецЕсли;
Исключение
//номер дня неверный, (29,31...)
Возврат 0;
КонецПопытки;
Возврат 0;
КонецФункции // ПолучитьНормуВремениПоДню()
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот