Табель учета рабочего времени (Т-13) / Модуль объекта

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	ЗарплатаКадрыОтчеты.ПередНачаломКомпоновкиРезультата(ЭтотОбъект);
	
	ДокументРезультат.Очистить();
	
	НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
	
	КлючВарианта = ЗарплатаКадрыОтчеты.КлючВарианта(КомпоновщикНастроек);
	ПараметрПериод = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПериодОтчета"));
	
	Если ПараметрПериод <> Неопределено Тогда
		НачалоПериода = ПараметрПериод.Значение.ДатаНачала;
		КонецПериода = ПараметрПериод.Значение.ДатаОкончания;
		
		ПараметрПериод.Использование = Истина;
	Иначе
		НачалоПериода = НачалоМесяца(ТекущаяДатаСеанса());
		КонецПериода = КонецМесяца(ТекущаяДатаСеанса());
		
		ПараметрПериод = НастройкиОтчета.ПараметрыДанных.Элементы.Добавить();
		ПараметрПериод.Значение = Новый СтандартныйПериод;
		ПараметрПериод.Значение.ДатаНачала = НачалоПериода;
		ПараметрПериод.Значение.ДатаОкончания = КонецПериода;
		ПараметрПериод.Использование = Истина;
	КонецЕсли;
		
	ПараметрДатаОтчета = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаОтчета"));
	Если ПараметрДатаОтчета = Неопределено Тогда
		ДатаОтчета = ТекущаяДатаСеанса();
		ПараметрДатаОтчета = НастройкиОтчета.ПараметрыДанных.Элементы.Добавить();
		ПараметрДатаОтчета.Использование = Истина;
		ПараметрДатаОтчета.Значение = ДатаОтчета; 
	Иначе
		ПараметрДатаОтчета.Использование = Истина;
		Если ЗначениеЗаполнено(ПараметрДатаОтчета.Значение) Тогда
			Если ТипЗнч(ПараметрДатаОтчета.Значение) = Тип("СтандартнаяДатаНачала") Тогда			
				ДатаОтчета = ПараметрДатаОтчета.Значение.Дата;
			Иначе
				ДатаОтчета = ПараметрДатаОтчета.Значение;
			КонецЕсли;	
		Иначе
			ДатаОтчета = ТекущаяДатаСеанса();
			ПараметрДатаОтчета.Значение = ДатаОтчета;
		КонецЕсли;	
	КонецЕсли;
	
	ПараметрПериодРегистрации = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПериодРегистрации"));
	
	Если ПараметрПериодРегистрации <> Неопределено Тогда
		ПараметрПериодРегистрации.Использование = Истина;
		ПараметрПериодРегистрации.Значение = НачалоМесяца(ДатаОтчета);
	КонецЕсли;
		
	ПараметрВыводитьПодразделения = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВыводитьВРазрезеПодразделений"));
		
	Если ПараметрВыводитьПодразделения <> Неопределено Тогда
		ПараметрВыводитьПодразделения.Использование = Истина;
	Иначе		
		ПараметрВыводитьПодразделения = НастройкиОтчета.ПараметрыДанных.Элементы.Добавить();
		ПараметрВыводитьПодразделения.Значение = Ложь;
	КонецЕсли;
	
	ОтборыПоПодразделению = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(НастройкиОтчета.Отбор, "Подразделение");
	
	Для Каждого ЭлементОтбора Из ОтборыПоПодразделению Цикл
		Если ЭлементОтбора.Использование Тогда
			ПараметрВыводитьПодразделения.Значение = Истина;
			Прервать;
		КонецЕсли;	
	КонецЦикла;	
	
	ЗаполнитьСписокВидовВремени(НастройкиОтчета);
	
	Если КлючВарианта = "УнифицированнаяФормаТ13" Тогда
		
		СтандартнаяОбработка = Ложь;
		
		// Параметры документа
		ДокументРезультат.ТолькоПросмотр = Истина;
		ДокументРезультат.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_УнифицированнаяФормаТ13";
		ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
		
		ПараметрРассчитыватьПлановоеВремя = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("РассчитыватьПлановоеВремя"));
		ПараметрРассчитыватьПлановоеВремя.Использование = Истина;
		ПараметрРассчитыватьПлановоеВремя.Значение = Истина;
		
		МакетКомпоновки = ЗарплатаКадрыОтчеты.МакетКомпоновкиДанныхДляКоллекцииЗначений(СхемаКомпоновкиДанных, НастройкиОтчета);
		
		ПараметрыПолученияДанных = УчетРабочегоВремениРасширенный.ПараметрыПолученияДанныхУчетаВремени();
		ПараметрыПолученияДанных.ДатаНачала = "ДатаНачала";
		ПараметрыПолученияДанных.ДатаОкончания = "ДатаОкончания";
		ПараметрыПолученияДанных.ОтноситьПереходящуюЧастьСменыКДнюНачала = 
			УчетРабочегоВремениРасширенный.НастройкиУчетаВремени().ОтражатьЧасыВДеньНачалаСмены;
		
		УчетРабочегоВремениРасширенный.ПолученияДанныхУчетаВремениПослеКомпоновкиМакета(МакетКомпоновки.НаборыДанных.ДанныеОВремени, ПараметрыПолученияДанных);
		
		СоответствиеПользовательскихПолей = ЗарплатаКадрыОтчеты.СоответствиеПользовательскихПолей(НастройкиОтчета);
		
		// Создадим и инициализируем процессор компоновки.
		ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
		ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , , Истина);
		
		ДанныеОВремени = Новый ДеревоЗначений;
		
		ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
		ПроцессорВывода.УстановитьОбъект(ДанныеОВремени);
		
		// Обозначим начало вывода
		ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
		ВывестиМакет(ДокументРезультат, ДанныеОВремени, НачалоПериода, КонецПериода, ДатаОтчета, СоответствиеПользовательскихПолей);
		ДопСвойства = КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства;
		ДопСвойства.Вставить("ОтчетПустой", ДанныеОВремени.Строки.Количество() = 0);
		
	Иначе
		
		УчетНачисленнойЗарплатыРасширенный.ПриКомпоновкеОтчетаУнифицированнаяФормаТ13(
			ЭтотОбъект, ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка, КлючВарианта, НастройкиОтчета);
			
		Если Не СтандартнаяОбработка Тогда
			Возврат;
		КонецЕсли;
		
		СтандартнаяОбработка = Ложь;
		
		МакетКомпоновки = ЗарплатаКадрыОтчеты.МакетКомпоновкиДанных(СхемаКомпоновкиДанных, НастройкиОтчета);
		
		ПараметрыПолученияДанных = УчетРабочегоВремениРасширенный.ПараметрыПолученияДанныхУчетаВремени();
		ПараметрыПолученияДанных.ДатаНачала = "ДатаНачала";
		ПараметрыПолученияДанных.ДатаОкончания = "ДатаОкончания";
		
		УчетРабочегоВремениРасширенный.ПолученияДанныхУчетаВремениПослеКомпоновкиМакета(МакетКомпоновки.НаборыДанных.ДанныеОВремени, ПараметрыПолученияДанных);
		
		// Создадим и инициализируем процессор компоновки.
		ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
		ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , , Истина);
					
		ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
		ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
		
		// Обозначим начало вывода
		ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
		
		ДопСвойства = КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства;
		ДопСвойства.Вставить("ОтчетПустой", ОтчетыСервер.ОтчетПустой(ЭтотОбъект, ПроцессорКомпоновки));
			
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти


#Область СлужебныеПроцедурыИФункции

Процедура ИнициализироватьОтчет() Экспорт
	
	ЗарплатаКадрыОбщиеНаборыДанных.ВывестиВОтчетДополнительныеПоляПредставлений(ЭтотОбъект, ДополнительныеПоляПредставлений());
	
КонецПроцедуры

// Для общей формы "Форма отчета" подсистемы "Варианты отчетов".
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
	
	Настройки.Печать.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
	Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
	
КонецПроцедуры

// Вызывается перед загрузкой новых настроек. Используется для изменения схемы компоновки.
//
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
	
	Если КлючСхемы <> КлючВарианта Тогда
		
		ИнициализироватьОтчет();
		ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, СхемаКомпоновкиДанных, КлючСхемы);
		
		КлючСхемы = КлючВарианта;
		
	КонецЕсли;
	
КонецПроцедуры

Функция ДополнительныеПоляПредставлений() Экспорт
	
	ДополнительныеПоляКадровыхДанныхСотрудников = КадровыйУчет.ПоляПредставленийКадровыхДанныхСотрудников();
	
	ДополнительныеПоля = Новый Структура;
	ДополнительныеПоля.Вставить("Представления_КадровыеДанныеСотрудников", ДополнительныеПоляКадровыхДанныхСотрудников);
	
	Возврат ДополнительныеПоля;
	
КонецФункции

Процедура ЗаполнитьСписокВидовВремени(НастройкиОтчета)
	ПараметрВидВремени = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Выходной"));	
	Если ПараметрВидВремени <> Неопределено Тогда
		ПараметрВидВремени.Значение = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.ВыходныеДни");
		ПараметрВидВремени.Использование = Истина;
	КонецЕсли;	
	
	ПараметрВидВремени = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВечерниеЧасы"));	
	Если ПараметрВидВремени <> Неопределено Тогда
		ПараметрВидВремени.Значение = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РаботаВечерниеЧасы");
		ПараметрВидВремени.Использование = Истина;
	КонецЕсли;	
	
	ПараметрВидВремени = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НочныеЧасы"));	
	Если ПараметрВидВремени <> Неопределено Тогда
		ПараметрВидВремени.Значение = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РаботаНочныеЧасы");
		ПараметрВидВремени.Использование = Истина;
	КонецЕсли;
	
	ПараметрВидВремени = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НочныеЧасы"));	
	Если ПараметрВидВремени <> Неопределено Тогда
		ПараметрВидВремени.Значение = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РаботаНочныеЧасы");
		ПараметрВидВремени.Использование = Истина;
	КонецЕсли;
	
	ПараметрВидВремени = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Сверхурочно"));	
	Если ПараметрВидВремени <> Неопределено Тогда
		ПараметрВидВремени.Значение = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Сверхурочные");
		ПараметрВидВремени.Использование = Истина;
	КонецЕсли;
	
	ПараметрВидВремени = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Явка"));	
	Если ПараметрВидВремени <> Неопределено Тогда
		ПараметрВидВремени.Значение = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка");
		ПараметрВидВремени.Использование = Истина;
	КонецЕсли;
	
	ПараметрВидВремени = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("РабочееВремя"));	
	Если ПараметрВидВремени <> Неопределено Тогда
		ПараметрВидВремени.Значение = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РабочееВремя");
		ПараметрВидВремени.Использование = Истина;
	КонецЕсли;
	
	ПараметрВидВремени = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВыходнойДень"));	
	Если ПараметрВидВремени <> Неопределено Тогда
		ПараметрВидВремени.Значение = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.ВыходныеДни");
		ПараметрВидВремени.Использование = Истина;
	КонецЕсли;	
КонецПроцедуры	

Процедура ВывестиМакет(ДокументРезультат, ДанныеОВремени, ДатаНачала, ДатаОкончания, ДатаОтчета, СоответствиеПользовательскихПолей)
	ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
	ДокументРезультат.АвтоМасштаб = Истина;
	
	ТекущийЛист = Новый ТабличныйДокумент;
	ТекущийЛист.АвтоМасштаб = Истина;
	ТекущийЛист.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
	
	Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.ПФ_MXL_УнифицированнаяФормаТ13"); 	
	
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
	ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
	ОбластьДанныеОВремени = Макет.ПолучитьОбласть("Строка");
	ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
	
	Для Каждого ДанныеПоОрганизации Из ДанныеОВремени.Строки Цикл
		
		ЗарплатаКадрыОтчеты.ЗаполнитьПараметрыОбластиМакета(
			ОбластьШапка,
			ДанныеПоОрганизации,
			ЗарплатаКадрыОтчеты.ЗначенияЗаполненияПользовательскихПолей(СоответствиеПользовательскихПолей, ДанныеПоОрганизации));
		
		ЗарплатаКадрыОтчеты.ЗаполнитьПараметрыОбластиМакета(
			ОбластьШапкаТаблицы,
			ДанныеПоОрганизации,
			ЗарплатаКадрыОтчеты.ЗначенияЗаполненияПользовательскихПолей(СоответствиеПользовательскихПолей, ДанныеПоОрганизации));
		
		ЗарплатаКадрыОтчеты.ЗаполнитьПараметрыОбластиМакета(
			ОбластьДанныеОВремени,
			ДанныеПоОрганизации,
			ЗарплатаКадрыОтчеты.ЗначенияЗаполненияПользовательскихПолей(СоответствиеПользовательскихПолей, ДанныеПоОрганизации));
		
		ЗарплатаКадрыОтчеты.ЗаполнитьПараметрыОбластиМакета(
			ОбластьПодвал,
			ДанныеПоОрганизации,
			ЗарплатаКадрыОтчеты.ЗначенияЗаполненияПользовательскихПолей(СоответствиеПользовательскихПолей, ДанныеПоОрганизации));
		
		Если ДокументРезультат.ВысотаТаблицы > 0 Тогда
			ТекущийЛист = Новый ТабличныйДокумент;
			ТекущийЛист.АвтоМасштаб = Истина;
			ТекущийЛист.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
			
			ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		
		ВывестиШапку(ДокументРезультат, ОбластьШапка, ДанныеПоОрганизации, ДатаНачала, ДатаОкончания, ДатаОтчета, ТекущийЛист);
		ТекущийЛист.Вывести(ОбластьШапкаТаблицы);
		ДокументРезультат.Вывести(ОбластьШапкаТаблицы);
		
		ЗаполнитьПодвал(ДокументРезультат, ОбластьПодвал, ДанныеПоОрганизации.Организация, ДатаОкончания, ДатаОтчета, ДанныеПоОрганизации.ПараметрыДанныхОтветственный, ДанныеПоОрганизации.Подразделение);
		Для Сч = 0 По ДанныеПоОрганизации.Строки.Количество() - 1 Цикл
			ДанныеПоСотруднику = ДанныеПоОрганизации.Строки[Сч];
			ЗаполнитьДанныеПоСотруднику(ДокументРезультат, ОбластьДанныеОВремени, ДанныеПоСотруднику);
			Если Сч = ДанныеПоОрганизации.Строки.Количество() - 1 Тогда
				ВывестиОбластьСотрудника(ДокументРезультат, ТекущийЛист, ОбластьДанныеОВремени, ОбластьШапкаТаблицы, ОбластьПодвал);
			Иначе
				ВывестиОбластьСотрудника(ДокументРезультат, ТекущийЛист, ОбластьДанныеОВремени, ОбластьШапкаТаблицы);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

Процедура ВывестиШапку(ДокументРезультат, ОбластьШапка, ДанныеШапки, ДатаНачала, ДатаОкончания, ДатаОтчета, ТекущийЛист)	
	
	НастройкиПечатныхФорм = ЗарплатаКадры.НастройкиПечатныхФорм();
	
	ОбластьШапка.Параметры.Заполнить(ДанныеШапки);
	
	ОбластьШапкаПараметры = Новый Структура("Подразделение,ОрганизацияНаименование,ДатаЗаполнения,ДатаНачала,ДатаОкончания,СообщениеОНеприменимостиПечатнойФормы");
	
	Если НастройкиПечатныхФорм.ВыводитьПолнуюИерархиюПодразделений И ЗначениеЗаполнено(ДанныеШапки.Подразделение) Тогда
		ОбластьШапкаПараметры.Подразделение = ДанныеШапки.Подразделение.ПолноеНаименование();
	КонецЕсли;
	
	ОбластьШапкаПараметры.ОрганизацияНаименование = ДанныеШапки.ОрганизацияНаименованиеПолное;
	ОбластьШапкаПараметры.ДатаЗаполнения = ДатаОтчета;
	ОбластьШапкаПараметры.ДатаНачала = Макс(НачалоМесяца(ДанныеШапки.Месяц), ДатаНачала);
	ОбластьШапкаПараметры.ДатаОкончания = Мин(КонецМесяца(ДанныеШапки.Месяц), ДатаОкончания);
	
	ОбластьШапкаПараметры.СообщениеОНеприменимостиПечатнойФормы = 
		ЗарплатаКадры.СообщениеОНеприменимостиПечатнойФормы(
			ДатаОтчета,
			'20150619',
			НСтр("ru='Приказа Минфина РФ'"),
			'20150330',
			"52н");
			
	ОбластьШапка.Параметры.Заполнить(ОбластьШапкаПараметры);
	
	ВывестиОбласть(ДокументРезультат, ТекущийЛист, ОбластьШапка);
КонецПроцедуры

Процедура ЗаполнитьПодвал(ДокументРезультат, ОбластьПодвал, Организация, ДатаОкончания, ДатаОтчета, Ответственный, Подразделение)
	
	ОтветственныеЛица = Новый Структура("Организация,Руководитель,ДолжностьРуководителя,РуководительКадровойСлужбы,ДолжностьРуководителяКадровойСлужбы", Организация);
	ЗарплатаКадры.ПолучитьЗначенияПоУмолчанию(ОтветственныеЛица, ДатаОкончания);
	
	МассивФизЛиц = Новый Массив;
	МассивФизЛиц.Добавить(ОтветственныеЛица.Руководитель);
	МассивФизЛиц.Добавить(ОтветственныеЛица.РуководительКадровойСлужбы);
	Если ЗначениеЗаполнено(Ответственный) Тогда
		МассивФизЛиц.Добавить(Ответственный);
	КонецЕсли;

	ФИОФизЛиц = ЗарплатаКадры.СоответствиеФИОФизЛицСсылкам(ДатаОтчета, МассивФизЛиц);
	
	ФИОРуководителя = Неопределено;
	ДолжностьРуководителя = Неопределено;
	
	СтандартнаяОбработкаЗаполненияРуководителя = Истина;
	Если ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыПриложения.РуководителиПодразделений") Тогда
		МодульРуководителиПодразделений = ОбщегоНазначения.ОбщийМодуль("РуководителиПодразделений");
		МодульРуководителиПодразделений.ПриЗаполненииРуководителяТ13(
			Подразделение, 
			ФИОРуководителя, 
			ДолжностьРуководителя, 
			ДатаОтчета, 
			СтандартнаяОбработкаЗаполненияРуководителя);
	КонецЕсли;
	
	Если СтандартнаяОбработкаЗаполненияРуководителя Тогда
		ФИОРуководителя = ФИОФизЛиц[ОтветственныеЛица.Руководитель];
		ДолжностьРуководителя = "";
		Если ОтветственныеЛица.ДолжностьРуководителя <> Неопределено Тогда
			ДолжностьРуководителя = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОтветственныеЛица.ДолжностьРуководителя, "Наименование");
		КонецЕсли;
	КонецЕсли;
	
	ОбластьПодвалПараметры = Новый Структура("ФИОРуководителя,ДолжностьРуководителя,ФИОКадровика,ДолжностьКадровика,ФИООтветственного,ДолжностьОтветственного");
	
	ФИОРуководителяКадровойСлужбы = ФИОФизЛиц[ОтветственныеЛица.РуководительКадровойСлужбы];
	ДолжностьРуководителяКадровойСлужбы = ?(ОтветственныеЛица.ДолжностьРуководителяКадровойСлужбы = Неопределено, "", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОтветственныеЛица.ДолжностьРуководителяКадровойСлужбы, "Наименование"));
	
	Если ФИОРуководителя <> Неопределено Тогда
		ОбластьПодвалПараметры.ФИОРуководителя = ФизическиеЛицаЗарплатаКадры.РасшифровкаПодписи(ФИОРуководителя);
	КонецЕсли;
	ОбластьПодвалПараметры.ДолжностьРуководителя = ДолжностьРуководителя;
	
	Если ФИОРуководителяКадровойСлужбы <> Неопределено Тогда 
		ОбластьПодвалПараметры.ФИОКадровика = ФизическиеЛицаЗарплатаКадры.РасшифровкаПодписи(ФИОРуководителяКадровойСлужбы);
	КонецЕсли;
	ОбластьПодвалПараметры.ДолжностьКадровика = ДолжностьРуководителяКадровойСлужбы;
	
	ДолжностьОтветственного = "";
	ФИООтветственногоСтрокой = "";
	Если ЗначениеЗаполнено(Ответственный) Тогда
		СписокФизЛиц = Новый Массив;
		СписокФизЛиц.Добавить(Ответственный);
		ОсновныеСотрудникиФизическихЛиц = КадровыйУчет.ОсновныеСотрудникиФизическихЛиц(СписокФизЛиц, Истина, Организация, ДатаОтчета);
		ФИООтветственного = ФИОФизЛиц[Ответственный];
		ФИООтветственногоСтрокой = ФизическиеЛицаЗарплатаКадры.РасшифровкаПодписи(ФИООтветственного); 
		Если ОсновныеСотрудникиФизическихЛиц.Количество() > 0  Тогда
			СписокСотрудников = Новый Массив;
			СписокСотрудников.Добавить(ОсновныеСотрудникиФизическихЛиц[0].Сотрудник);	
			КадровыеДанные = КадровыйУчет.КадровыеДанныеСотрудников(Истина, СписокСотрудников, "Должность", ДатаОтчета);
			Если КадровыеДанные.Количество() > 0
				И ЗначениеЗаполнено(КадровыеДанные[0].Должность) Тогда
				ДолжностьОтветственного = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(КадровыеДанные[0].Должность, "Наименование");
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ОбластьПодвалПараметры.ФИООтветственного = ФИООтветственногоСтрокой;
	ОбластьПодвалПараметры.ДолжностьОтветственного = ДолжностьОтветственного;
	
	ОбластьПодвал.Параметры.Заполнить(ОбластьПодвалПараметры);
	
КонецПроцедуры

Процедура ЗаполнитьДанныеПоСотруднику(ДокументРезультат, ОбластьДанныеОВремени, ДанныеПоСотруднику)
	
	ИмяПоляБуквенныйКод = ИмяПоляБуквенныйКод();
		
	НастройкиПечатныхФорм = ЗарплатаКадры.НастройкиПечатныхФорм();
	КоличествоПараметров = ОбластьДанныеОВремени.Параметры.Количество();
	
	Для ИндексПараметра = 0 По КоличествоПараметров - 1 Цикл  
		ОбластьДанныеОВремени.Параметры.Установить(ИндексПараметра, Неопределено);
	КонецЦикла;	
	
	ВидВремениВыходной = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.ВыходныеДни");
	ВидВремениКомандировка = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Командировка");
	ВидВремениОплачиваемыеНерабочиеДни =
		ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.ОплачиваемыеНерабочиеДни");
		
	ОтработаноДнейЗаПервуюПоловинуМесяца = 0;
	ОтработаноЧасовЗаВторуюПоловинуМесяца = 0;
	ОтработаноДнейЗаВторуюПоловинуМесяца = 0;
	ОтработаноЧасовЗаПервуюПоловинуМесяца = 0;
	ОтработаноДнейЗаМесяц = 0;
	ОтработаноЧасовЗаМесяц = 0;
	
	Если НастройкиПечатныхФорм.ВыводитьПолныеФИОВСписочныхПечатныхФормах Тогда
		ФИО = ДанныеПоСотруднику.ФИОПолные;
	Иначе
		ФИО = ДанныеПоСотруднику.ФамилияИО;
	КонецЕсли;
	
	ОбластьДанныеОВремениПараметры = Новый Структура("Сотрудник,ТабельныйНомер,НомерПП,ДниПерваяПоловина,ЧасыПерваяПоловина,ДниВтораяПоловина,ЧасыВтораяПоловина,ДниЗаМесяц,ЧасыЗаМесяц");
	
	ОбластьДанныеОВремениПараметры.Сотрудник = ФИО + "
											|(" + ДанныеПоСотруднику.ДолжностьНаименование + ")";
	ОбластьДанныеОВремениПараметры.ТабельныйНомер = ДанныеПоСотруднику.СотрудникКод;	
	ОбластьДанныеОВремениПараметры.НомерПП = ДанныеПоСотруднику.СистемныеПоляНомерПоПорядкуВГруппировке;	
	
	ОтклоненияПоСотруднику = Новый ТаблицаЗначений;
	ОтклоненияПоСотруднику.Колонки.Добавить("ВидВремени");
	ОтклоненияПоСотруднику.Колонки.Добавить("БуквенныйКод");
	ОтклоненияПоСотруднику.Колонки.Добавить("Часов");
	ОтклоненияПоСотруднику.Колонки.Добавить("Дней");

	Для Каждого ДанныеОВремениНаДату Из ДанныеПоСотруднику.Строки Цикл 
		ЭтоВыходнойДень = ДанныеОВремениНаДату.ЭтоВыходнойДень;
		
		Если День(ДанныеОВремениНаДату.Дата) <= 15 Тогда
			ОтработаноДнейЗаПервуюПоловинуМесяца = ОтработаноДнейЗаПервуюПоловинуМесяца + ДанныеОВремениНаДату.РабочиеДни;
			ОтработаноЧасовЗаПервуюПоловинуМесяца = ОтработаноЧасовЗаПервуюПоловинуМесяца + ДанныеОВремениНаДату.РабочиеЧасы;
		Иначе
			ОтработаноЧасовЗаВторуюПоловинуМесяца = ОтработаноЧасовЗаВторуюПоловинуМесяца + ДанныеОВремениНаДату.РабочиеЧасы;
			ОтработаноДнейЗаВторуюПоловинуМесяца = ОтработаноДнейЗаВторуюПоловинуМесяца + ДанныеОВремениНаДату.РабочиеДни;
		КонецЕсли;
		
		ОтработаноДнейЗаМесяц = ОтработаноДнейЗаМесяц + ДанныеОВремениНаДату.РабочиеДни;
		ОтработаноЧасовЗаМесяц = ОтработаноЧасовЗаМесяц + ДанныеОВремениНаДату.РабочиеЧасы;

		ПредставлениеВидовВремени = "";
		ЧасыПоВидамВремениСтрока = "";
		
		КоличествоЗаписейНаДату = 0;
		ЭтоОтклонение = Ложь;
		Для Каждого ДетальныеЗаписиЗаДень Из ДанныеОВремениНаДату.Строки Цикл
			Если Не ДетальныеЗаписиЗаДень.ВидУчетаВремениРабочееВремя 
				И ДетальныеЗаписиЗаДень.ВидУчетаВремени <> ВидВремениВыходной
				И ДетальныеЗаписиЗаДень.ВидУчетаВремени <> ВидВремениОплачиваемыеНерабочиеДни
				И ДетальныеЗаписиЗаДень.ВидУчетаВремениОсновноеВремя <> Справочники.ВидыИспользованияРабочегоВремени.ПустаяСсылка() Тогда
				
				ОтклоненияПоВидуВремени = ОтклоненияПоСотруднику.Добавить();
				ОтклоненияПоВидуВремени.ВидВремени = ДетальныеЗаписиЗаДень.ВидУчетаВремени;
				ОтклоненияПоВидуВремени.БуквенныйКод = ДетальныеЗаписиЗаДень[ИмяПоляБуквенныйКод];
				ОтклоненияПоВидуВремени.Дней = 1;
				Если ДанныеОВремениНаДату.Строки.Количество() > 1 Тогда
					ОтклоненияПоВидуВремени.Часов = ДетальныеЗаписиЗаДень.Часы;		
				Иначе 	
					ОтклоненияПоВидуВремени.Часов = ДанныеОВремениНаДату.Часы;
				КонецЕсли;
				ЭтоОтклонение = Истина;
			КонецЕсли; 
			
			Если ДетальныеЗаписиЗаДень.ОсновноеВремя <> ВидВремениВыходной
				Или ЭтоВыходнойДень Тогда
				
				ПредставлениеВидовВремени = ПредставлениеВидовВремени + "/"+  ДетальныеЗаписиЗаДень[ИмяПоляБуквенныйКод];
				Если Не ДетальныеЗаписиЗаДень.ВидУчетаВремениЦелосменное Тогда 
					ЧасыПоВидамВремениСтрока = ЧасыПоВидамВремениСтрока +  "/" + Формат(ДетальныеЗаписиЗаДень.Часы, "ЧГ=");
				КонецЕсли;		
			КонецЕсли;	
					
			КоличествоЗаписейНаДату = КоличествоЗаписейНаДату + 1;
		КонецЦикла;	
		
		Если КоличествоЗаписейНаДату = 1
			И ЭтоОтклонение Тогда
			
			ЧасыПоВидамВремениСтрока = "";
		КонецЕсли;	
			
		НомерДня = День(ДетальныеЗаписиЗаДень.Дата);
		
		ОбластьДанныеОВремениПараметры.Вставить("Символ" + НомерДня, Сред(ПредставлениеВидовВремени, 2));
		ОбластьДанныеОВремениПараметры.Вставить("ДополнительноеЗначение" + НомерДня, Сред(ЧасыПоВидамВремениСтрока, 2));
		
		ОбластьДанныеОВремениПараметры.ДниПерваяПоловина = ОтработаноДнейЗаПервуюПоловинуМесяца;
		ОбластьДанныеОВремениПараметры.ЧасыПерваяПоловина = ОтработаноЧасовЗаПервуюПоловинуМесяца;
		ОбластьДанныеОВремениПараметры.ДниВтораяПоловина = ОтработаноДнейЗаВторуюПоловинуМесяца;
		ОбластьДанныеОВремениПараметры.ЧасыВтораяПоловина = ОтработаноЧасовЗаВторуюПоловинуМесяца;
		ОбластьДанныеОВремениПараметры.ДниЗаМесяц = ОтработаноДнейЗаМесяц;
		ОбластьДанныеОВремениПараметры.ЧасыЗаМесяц = ОтработаноЧасовЗаМесяц;
		
		ОтклоненияПоСотруднику.Свернуть("ВидВремени, БуквенныйКод", "Дней, Часов");
		
		СчетчикОтклонений = 1;
		Для Каждого ОтклонениеПоВидуВремени Из ОтклоненияПоСотруднику Цикл
			Если СчетчикОтклонений > 8 Тогда
				Прервать;
			КонецЕсли;
			
			ОбластьДанныеОВремениПараметры.Вставить("НеявкаКод" + СчетчикОтклонений, ОтклонениеПоВидуВремени.БуквенныйКод);
			ОбластьДанныеОВремениПараметры.Вставить("НеявкаДниЧасы" + СчетчикОтклонений, Формат(ОтклонениеПоВидуВремени.Дней, "ЧГ=") + 
				?(ОтклонениеПоВидуВремени.Часов > 0, "(" + Формат(ОтклонениеПоВидуВремени.Часов, "ЧГ=") + ")", ""));

			СчетчикОтклонений = СчетчикОтклонений + 1;
		КонецЦикла;
	КонецЦикла;
	
	ОбластьДанныеОВремени.Параметры.Заполнить(ОбластьДанныеОВремениПараметры);
	
КонецПроцедуры	

Процедура ВывестиОбласть(ДокументРезультат, ТекущийЛист, ВыводимаяОбласть)
	
	Если Не ОбщегоНазначения.ПроверитьВыводТабличногоДокумента(ТекущийЛист, ВыводимаяОбласть) Тогда
		ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
		
		ТекущийЛист = Новый ТабличныйДокумент;
		ТекущийЛист.ОриентацияСтраницы = ДокументРезультат.ОриентацияСтраницы;
		ТекущийЛист.АвтоМасштаб = ДокументРезультат.АвтоМасштаб;
	КонецЕсли;
	
	ТекущийЛист.Вывести(ВыводимаяОбласть);
	ДокументРезультат.Вывести(ВыводимаяОбласть);
	
КонецПроцедуры 

Процедура ВывестиОбластьСотрудника(ДокументРезультат, ТекущийЛист, ВыводимаяОбласть, ОбластьШапкаТаблицы, ОбластьПодвал = Неопределено)
	
	ПроверяемыеОбласти = Новый Массив;
	ПроверяемыеОбласти.Добавить(ВыводимаяОбласть);
	Если ОбластьПодвал <> Неопределено Тогда
		ПроверяемыеОбласти.Добавить(ОбластьПодвал);
	КонецЕсли;
	
	Если Не ОбщегоНазначения.ПроверитьВыводТабличногоДокумента(ТекущийЛист, ПроверяемыеОбласти) Тогда
		ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
		
		ТекущийЛист = Новый ТабличныйДокумент;
		ТекущийЛист.ОриентацияСтраницы = ДокументРезультат.ОриентацияСтраницы;
		ТекущийЛист.АвтоМасштаб = ДокументРезультат.АвтоМасштаб;
		
		ТекущийЛист.Вывести(ОбластьШапкаТаблицы);
		ДокументРезультат.Вывести(ОбластьШапкаТаблицы);
	КонецЕсли;
	
	ТекущийЛист.Вывести(ВыводимаяОбласть);
	ДокументРезультат.Вывести(ВыводимаяОбласть);
	
	Если ОбластьПодвал <> Неопределено Тогда
		ТекущийЛист.Вывести(ОбластьПодвал);
		ДокументРезультат.Вывести(ОбластьПодвал);
	КонецЕсли;
	
КонецПроцедуры 

Функция ИмяПоляБуквенныйКод()
	Если ПолучитьФункциональнуюОпцию("РаботаВБюджетномУчреждении") Тогда
		Возврат "ВидУчетаВремениБуквенныйКодБюджетный";
	Иначе
		Возврат "ВидУчетаВремениБуквенныйКод";
	КонецЕсли;	
КонецФункции

#КонецОбласти

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли

Связанные материалы