Как получить количество часов по графику

1. PoZiTiFFF 915 22.05.13 17:53 Сейчас в теме
Здравствуйте,получил фактически отработанное время (в часах) по сотрудникам, необходима информация по количеству часов по графику. Подскажите, пожалуйста, как эту информацию правильно получить. Заранее спасибо.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. user1183761 18.04.19 07:44 Сейчас в теме
//------------------------У меня аналогичная ситуация решил таким образом-------------------------

Перем ПериодРегистрации;
Перем СоответствиеСотрудникГрафик;
Перем СоответствиеГрафикНорма;

Функция ПолучитьНормуВремениПоДню(Сотрудник, НомерДня, Период)
// Здесь добавить //----------------------------------------------------
	СоответствиеСотрудникГрафик = Новый Соответствие;
	СоответствиеГрафикНорма = Новый Соответствие;
	ПериодРегистрации = Период;      
//----------------------------------------------------------------------------     
	ГрафикСотрудника = СоответствиеСотрудникГрафик.Получить(Сотрудник);
	Если ГрафикСотрудника = Неопределено Тогда
		// Графика по этому сотруднику еще нет, нужно получить

//------------------------------------------------После вызов функции--------------------------------------------------------
Сотрудник = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию("Иванов Иван Иванович"); //ФИО
НомерДня = Число(1);                                                                                                                                     //День
Период = НачалоМесяца(ТекущаяДата());                                                                                                   //Месяц
Часов =  ПолучитьНормуВремениПоДню(Сотрудник, НомерДня, Период);
Показать
2. PoZiTiFFF 915 22.05.13 20:20 Сейчас в теме
3. RealSurfer 35 23.05.13 09:56 Сейчас в теме
(2) PoZiTiFFF,

Для получения информации о кол-ве часов по графику сотрудника используется предопределенный показатель Норма времени часах. Не совсем понятно, где (в отчете, в произвольной формуле для описания вида расчета) вам нужно получать эту информацию?
4. pankwinto 102 23.05.13 12:03 Сейчас в теме
(2) PoZiTiFFF,

Например так:


Перем СоответствиеГрафикНорма;
СоответствиеГрафикНорма = Новый Соответствие;

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

Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот