Табель учета рабочего времени / Модуль менеджера

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

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

// Сторнирует документ по учетам. Используется подсистемой исправления документов.
//
// Параметры:
//  Движения				 - КоллекцияДвижений, Структура	 - Коллекция движений исправляющего документа в которую будут добавлены сторно стоки.
//  Регистратор				 - ДокументСсылка				 - Документ регистратор исправления (документ исправление).
//  ИсправленныйДокумент	 - ДокументСсылка				 - Исправленный документ движения которого будут сторнированы.
//  СтруктураВидовУчета		 - Структура					 - Виды учета, по которым будет выполнено сторнирование исправленного документа.
//  					Состав полей см. в ПроведениеСервер.СтруктураВидовУчета().
//  ДополнительныеПараметры	 - Структура					 - Структура со свойствами:
//  					* ИсправлениеВТекущемПериоде - Булево - Истина когда исправление выполняется в периоде регистрации исправленного документа.
//						* ОтменаДокумента - Булево - Истина когда исправление вызвано документом СторнированиеНачислений.
//  					* ПериодРегистрации	- Дата - Период регистрации документа регистратора исправления.
// 
// Возвращаемое значение:
//  Булево - "Истина" если сторнирование выполнено этой функцией, "Ложь" если специальной процедуры не предусмотрено.
//
Функция СторнироватьПоУчетам(Движения, Регистратор, ИсправленныйДокумент, СтруктураВидовУчета, ДополнительныеПараметры) Экспорт
	
	РеквизитыДляПроведения = ДополнительныеПараметры.РеквизитыДляПроведения;
	
	Сотрудники = Новый Массив;
	Для Каждого КлючЗначение Из РеквизитыДляПроведения.СотрудникиСИсправленнымиДанными Цикл
		Сотрудники.Добавить(КлючЗначение.Ключ);
	КонецЦикла;
	
	УчетРабочегоВремени.ЗарегистрироватьСторноЗаписиПоДокументу(Движения, РеквизитыДляПроведения.ПериодРегистрации, ИсправленныйДокумент, Сотрудники);
	
	Возврат Истина;
	
КонецФункции

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ДляВсехСтрок( ЗначениеРазрешено(ФизическиеЛица.ФизическоеЛицо, NULL КАК ИСТИНА)
	|	) И ЗначениеРазрешено(Организация)";
КонецПроцедуры

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

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

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

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

#Область СлужебныйПрограммныйИнтерфейс

#Область ОбработчикиПравилРегистрации

// См. ЗарплатаКадрыРасширенныйСинхронизацияДанных.ШаблонОбработчика
Процедура ПриЗаполненииНастроекОбработчиковПравилРегистрации(Настройки) Экспорт
	ЗарплатаКадрыРасширенныйСинхронизацияДанных.ДляОтбораПоОрганизации(Настройки);
	ЗарплатаКадрыРасширенныйСинхронизацияДанных.ДляОбъектаСПрисоединеннымиФайлами(Настройки);
КонецПроцедуры

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

// Конструктор дополнительных данных для печати табеля
//
// Возвращаемое значение:
//   Структура   - Требуемый вид структуры.
//
Функция ДополнительныеДанныеДляПечати() Экспорт

	ДополнительныеДанныеДляПечати = Новый Структура;
	
	ДополнительныеДанныеДляПечати.Вставить("НомерДокумента");
	ДополнительныеДанныеДляПечати.Вставить("НомерКорректировки");
	ДополнительныеДанныеДляПечати.Вставить("ОтветственныйИсполнитель");
	ДополнительныеДанныеДляПечати.Вставить("ДолжностьОтветственногоИсполнителя");
	ДополнительныеДанныеДляПечати.Вставить("ДолжностьКадровика");
	ДополнительныеДанныеДляПечати.Вставить("ФИОКадровика");
	ДополнительныеДанныеДляПечати.Вставить("ИсполнительОтБухгалтерии");
	ДополнительныеДанныеДляПечати.Вставить("ДолжностьИсполнителяОтБухгалтерии");
	ДополнительныеДанныеДляПечати.Вставить("ФИОИсполнителяОтБухгалтерии");
	
	Возврат ДополнительныеДанныеДляПечати;

КонецФункции

// Возвращает описание состава документа
//
// Возвращаемое значение:
//  Структура - см. ЗарплатаКадрыСоставДокументов.НовоеОписаниеСоставаОбъекта.
Функция ОписаниеСоставаОбъекта() Экспорт
	
	МетаданныеДокумента = Метаданные.Документы.ТабельУчетаРабочегоВремени;
	Возврат ЗарплатаКадрыСоставДокументов.ОписаниеСоставаОбъектаПоМетаданнымФизическиеЛицаВТабличныхЧастях(МетаданныеДокумента);
	
КонецФункции

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

Функция ПараметрыИсправляемогоДокумента(ДокументСсылка) Экспорт
	
	Возврат ИсправлениеДокументовЗарплатаКадры.ПараметрыИсправляемогоДокумента(ДокументСсылка,
		СвойстваИсправляемогоДокумента(ДокументСсылка));
	
КонецФункции

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

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

#Область ПроцедурыЗаполнения

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

	КонецЕсли;	
	
	ИмяВТПериодыУточненные = УточнитьПериодыЗаполненияПоСотрудникам(Запрос.МенеджерВременныхТаблиц, НачалоМесяца(ДанныеТабеля.ПериодРегистрации), ПараметрыЗаполнения.НеучитываемыеРегистраторы);  
	ПараметрыЗаполнения.ИмяВТСотрудники = ИмяВТПериодыУточненные;
	
	УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников(Запрос.МенеджерВременныхТаблиц, Истина, ПараметрыЗаполнения);
	
	Запрос.УстановитьПараметр("Явка", ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка"));
	Запрос.УстановитьПараметр("ВечерниеЧасы", ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РаботаВечерниеЧасы"));
	Запрос.УстановитьПараметр("НочныеЧасы", ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РаботаНочныеЧасы"));
	Запрос.УстановитьПараметр("Сверхурочно", ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Сверхурочные"));
	Запрос.УстановитьПараметр("РабочееВремя", ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РабочееВремя"));
	
	Запрос.Текст =
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	КОНЕЦПЕРИОДА(ДанныеУчетаВремениИСостоянийСотрудников.Дата, МЕСЯЦ) КАК Период,
		|	ДанныеУчетаВремениИСостоянийСотрудников.Сотрудник
		|ПОМЕСТИТЬ ВТСотрудникиСПериодомКонцаМесяца
		|ИЗ
		|	ВТДанныеУчетаВремениИСостоянийСотрудников КАК ДанныеУчетаВремениИСостоянийСотрудников
		|ГДЕ
		|	ДанныеУчетаВремениИСостоянийСотрудников.ВидУчетаВремени <> &РабочееВремя";
		
	Запрос.Выполнить();
	
	ОписательТаблиц = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотрудников(
		Запрос.МенеджерВременныхТаблиц, "ВТСотрудникиСПериодомКонцаМесяца");
		
	ОписательТаблиц.ИмяВТКадровыеДанныеСотрудников = "ВТКадровыеДанныеСотрудниковНаКонецМесяца";
	
	КадровыеДанные = "";
	ЗарплатаКадры.ДополнитьКадровымиДаннымиНастройкиПорядкаСписка(КадровыеДанные);
	
	КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ОписательТаблиц, Истина, КадровыеДанные);
	
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ДанныеУчетаВремениИСостоянийСотрудников.Сотрудник КАК Сотрудник,
	|	ДанныеУчетаВремениИСостоянийСотрудников.Дата КАК Дата,
	|	ДанныеУчетаВремениИСостоянийСотрудников.ВидУчетаВремени КАК ВидУчетаВремени,
	|	ДанныеУчетаВремениИСостоянийСотрудников.Дни КАК Дни,
	|	ДанныеУчетаВремениИСостоянийСотрудников.Часы КАК Часы,
	|	ДанныеУчетаВремениИСостоянийСотрудников.НормаЧасов,
	|	ДанныеУчетаВремениИСостоянийСотрудников.Смена КАК Смена,
	|	ДанныеУчетаВремениИСостоянийСотрудников.ПереходящаяЧастьПредыдущейСмены КАК ПереходящаяЧастьПредыдущейСмены,
	|	ДанныеУчетаВремениИСостоянийСотрудников.ПереходящаяЧастьТекущейСмены КАК ПереходящаяЧастьТекущейСмены,
	|	ДанныеУчетаВремениИСостоянийСотрудников.ПереходящаяЧастьПредыдущейСмены
	|		ИЛИ ДанныеУчетаВремениИСостоянийСотрудников.ПереходящаяЧастьТекущейСмены КАК ПереходящаяЧастьСмены,
	|	ВЫБОР
	|		КОГДА ОписаниеВидовВремени.Ссылка = &Явка
	|			ТОГДА 1
	|		КОГДА ОписаниеВидовВремени.ОсновноеВремя = &Явка
	|			ТОГДА 2
	|		КОГДА ОписаниеВидовВремени.Ссылка = &ВечерниеЧасы
	|			ТОГДА 3
	|		КОГДА ОписаниеВидовВремени.ОсновноеВремя = &ВечерниеЧасы
	|			ТОГДА 3
	|		КОГДА ОписаниеВидовВремени.Ссылка = &НочныеЧасы
	|			ТОГДА 5
	|		КОГДА ОписаниеВидовВремени.ОсновноеВремя = &НочныеЧасы
	|			ТОГДА 6
	|		КОГДА ОписаниеВидовВремени.Ссылка = &Сверхурочно
	|			ТОГДА 7
	|		КОГДА ОписаниеВидовВремени.ОсновноеВремя = &Сверхурочно
	|			ТОГДА 8
	|		ИНАЧЕ 9
	|	КОНЕЦ КАК ПриоритетВидаВремени,
	|	ДанныеУчетаВремениИСостоянийСотрудников.Территория КАК Территория,
	|	ДанныеУчетаВремениИСостоянийСотрудников.УсловияТруда КАК УсловияТруда
	|ИЗ
	|	ВТДанныеУчетаВремениИСостоянийСотрудников КАК ДанныеУчетаВремениИСостоянийСотрудников
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВидыИспользованияРабочегоВремени КАК ОписаниеВидовВремени
	|		ПО ДанныеУчетаВремениИСостоянийСотрудников.ВидУчетаВремени = ОписаниеВидовВремени.Ссылка
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКадровыеДанныеСотрудниковНаКонецМесяца КАК КадровыеДанныеСотрудниковНаКонецМесяца
	|		ПО ДанныеУчетаВремениИСостоянийСотрудников.Сотрудник = КадровыеДанныеСотрудниковНаКонецМесяца.Сотрудник
	|			И (КОНЕЦПЕРИОДА(ДанныеУчетаВремениИСостоянийСотрудников.Дата, МЕСЯЦ) = КадровыеДанныеСотрудниковНаКонецМесяца.Период)
	|ГДЕ
	|	ДанныеУчетаВремениИСостоянийСотрудников.ВидУчетаВремени <> &РабочееВремя
	|
	|УПОРЯДОЧИТЬ ПО
	|	Сотрудник,
	|	Дата,
	|	ПриоритетВидаВремени,
	|	ОписаниеВидовВремени.Наименование,
	|	ВидУчетаВремени,
	|	Территория,
	|	УсловияТруда";
	
	ПсевдонимыТаблиц = Новый Соответствие;
	ПсевдонимыТаблиц.Вставить("Справочник.ПодразделенияОрганизаций", "КадровыеДанныеСотрудниковНаКонецМесяца");
	ПсевдонимыТаблиц.Вставить("Справочник.Должности", "КадровыеДанныеСотрудниковНаКонецМесяца");
	ПсевдонимыТаблиц.Вставить("Справочник.Сотрудники", "КадровыеДанныеСотрудниковНаКонецМесяца");
	
	ЗарплатаКадры.ДополнитьТекстЗапросаУпорядочиваниемСотрудников(Запрос, ПсевдонимыТаблиц);
	
	Возврат Запрос.Выполнить().Выбрать();
	
КонецФункции

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

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

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

Функция СтрокаТаблицыДанныхДляЗаполнения(ТаблицаДанных, Сотрудник, СтрокиДанныхПоСотруднику, КоличествоКомбинацийЗначенийИзмерений)
	Если КоличествоКомбинацийЗначенийИзмерений > СтрокиДанныхПоСотруднику.Количество() Тогда
		СтрокаДанных = ТаблицаДанных.Добавить();
		СтрокаДанных.Сотрудник = Сотрудник;
		СтрокиДанныхПоСотруднику.Добавить(СтрокаДанных);
	Иначе
		СтрокаДанных = СтрокиДанныхПоСотруднику[КоличествоКомбинацийЗначенийИзмерений - 1];
	КонецЕсли;
	
	Возврат СтрокаДанных;
	
КонецФункции	

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

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

#Область ПроцедурыПечатиДокумента

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати.
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	// Т-13
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
	КомандаПечати.Идентификатор = "ПФ_MXL_УнифицированнаяФормаТ13";
	КомандаПечати.Представление = НСтр("ru = 'Т-13'");
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
	КомандаПечати.ДополнительныеПараметры.Вставить("ПутьКПодписантам", "ФизическиеЛица.ФизическоеЛицо");
		
	// 0504421
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
	КомандаПечати.Идентификатор = "УнифицированнаяФорма0504421";
	КомандаПечати.Представление = НСтр("ru = 'Табель учета рабочего времени (0504421) до 2015 года'");
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
	КомандаПечати.ФункциональныеОпции = "РаботаВБюджетномУчреждении";
	КомандаПечати.Порядок = 40;
	
	// 0504421 с 2015 года
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
	КомандаПечати.Идентификатор = "УнифицированнаяФорма0504421с2015";
	КомандаПечати.Представление = НСтр("ru = 'Табель учета рабочего времени (0504421)'");
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
	КомандаПечати.ФункциональныеОпции = "РаботаВБюджетномУчреждении";
	КомандаПечати.Порядок = 30;
	КомандаПечати.ДополнительныеПараметры.Вставить("ПутьКПодписантам", "ФизическиеЛица.ФизическоеЛицо");
	
КонецПроцедуры

Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм,
		"ПФ_MXL_УнифицированнаяФормаТ13") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
			"ПФ_MXL_УнифицированнаяФормаТ13",
			"Табель учета рабочего времени (Т-13)",
			СформироватьПечатнуюФормуТ13(МассивОбъектов,
				ОбъектыПечати));
	КонецЕсли;
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм,
		"УнифицированнаяФорма0504421") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
			"УнифицированнаяФорма0504421",
			"Табель учета рабочего времени (0504421)",
			ПечатнаяФорма0504421(МассивОбъектов,
				ОбъектыПечати,
				"УнифицированнаяФорма0504421"));
	КонецЕсли;
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм,
		"УнифицированнаяФорма0504421с2015") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
			"УнифицированнаяФорма0504421с2015",
			"Табель учета рабочего времени (0504421) с 2015",
			ПечатнаяФорма0504421(МассивОбъектов,
				ОбъектыПечати,
				"УнифицированнаяФорма0504421с2015"));
	КонецЕсли;
	
КонецПроцедуры

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

	КонецЦикла;
	
	ЧастиЗапроса.Добавить(ЗарплатаКадрыОбщиеНаборыДанных.РазделительЗапросов());
	ТекстЗапроса =
		"ВЫБРАТЬ
		|	ДанныеОВремени.Сотрудник КАК Сотрудник,
		|	ДанныеОВремени.Дата КАК Период
		|ПОМЕСТИТЬ ВТСотрудникиДокументов
		|ИЗ
		|	ВТДанныеОВремени КАК ДанныеОВремени
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	ДанныеОВремени.Сотрудник,
		|	ДанныеОВремени.ДатаДокумента
		|ИЗ
		|	ВТДанныеОВремени КАК ДанныеОВремени";
	
	ЧастиЗапроса.Добавить(ТекстЗапроса);
	
	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	Запрос.Текст = СтрСоединить(ЧастиЗапроса);
	Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
	Запрос.Выполнить();
	
	ОписательВременныхТаблиц = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотрудников(
		Запрос.МенеджерВременныхТаблиц,
		"ВТСотрудникиДокументов");
	КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ОписательВременныхТаблиц, Ложь, "ФамилияИО,ФИОПолные,Должность,ТабельныйНомер");
	
	Запрос.Текст =
		"ВЫБРАТЬ
		|	ТабельУчетаРабочегоВремени.Дата КАК Дата,
		|	ТабельУчетаРабочегоВремени.ДатаНачалаПериода КАК ДатаНачалаПериода,
		|	ТабельУчетаРабочегоВремени.ДатаОкончанияПериода КАК ДатаОкончанияПериода,
		|	ТабельУчетаРабочегоВремени.Номер КАК Номер,
		|	ТабельУчетаРабочегоВремени.Ссылка КАК Ссылка,
		|	ТабельУчетаРабочегоВремени.Организация КАК Организация,
		|	ТабельУчетаРабочегоВремени.Организация.НаименованиеПолное КАК ОрганизацияНаименование,
		|	ТабельУчетаРабочегоВремени.Подразделение КАК Подразделение,
		|	ТабельУчетаРабочегоВремени.Подразделение.Наименование КАК ПодразделениеНаименование,
		|	ТабельУчетаРабочегоВремени.Организация.КодПоОКПО КАК ОрганизацияКодПоОКПО,
		|	ТабельУчетаРабочегоВремени.Руководитель КАК Руководитель,
		|	ТабельУчетаРабочегоВремени.ДолжностьРуководителя КАК ДолжностьРуководителя,
		|	ТабельУчетаРабочегоВремени.РаботникКадровойСлужбы КАК РаботникКадровойСлужбы,
		|	ТабельУчетаРабочегоВремени.ДолжностьРаботникаКадровойСлужбы КАК ДолжностьРаботникаКадровойСлужбы,
		|	ТабельУчетаРабочегоВремени.Исполнитель КАК Исполнитель,
		|	ТабельУчетаРабочегоВремени.ДолжностьИсполнителя КАК ДолжностьИсполнителя,
		|	ТабельУчетаРабочегоВремени.ИсполнительОтБухгалтерии КАК ИсполнительОтБухгалтерии,
		|	ТабельУчетаРабочегоВремени.ДолжностьИсполнителяОтБухгалтерии КАК ДолжностьИсполнителяОтБухгалтерии,
		|	ТабельУчетаРабочегоВремени.Ответственный КАК Ответственный
		|ПОМЕСТИТЬ ВТДанныеДокументов
		|ИЗ
		|	Документ.ТабельУчетаРабочегоВремени КАК ТабельУчетаРабочегоВремени
		|ГДЕ
		|	ТабельУчетаРабочегоВремени.Ссылка В(&МассивОбъектов)";
		
	Запрос.Выполнить();
	
	ЗарплатаКадры.СоздатьВТФИООтветственныхЛиц(Запрос.МенеджерВременныхТаблиц, Истина, "Руководитель,РаботникКадровойСлужбы,Исполнитель,ИсполнительОтБухгалтерии", "ВТДанныеДокументов");
	
	ТекстЗапроса =
		"ВЫБРАТЬ
		|	ДанныеДокументов.Дата КАК Дата,
		|	ДанныеДокументов.ДатаНачалаПериода КАК ДатаНачалаПериода,
		|	ДанныеДокументов.ДатаОкончанияПериода КАК ДатаОкончанияПериода,
		|	ДанныеДокументов.Номер КАК Номер,
		|	ДанныеДокументов.Ссылка КАК Ссылка,
		|	ДанныеДокументов.Организация КАК Организация,
		|	ДанныеДокументов.ОрганизацияНаименование КАК ОрганизацияНаименование,
		|	ДанныеДокументов.Подразделение КАК Подразделение,
		|	ДанныеДокументов.ПодразделениеНаименование КАК ПодразделениеНаименование,
		|	ДанныеДокументов.ОрганизацияКодПоОКПО КАК ОрганизацияКодПоОКПО,
		|	ФИОРуководителя.РасшифровкаПодписи КАК ФИОРуководителя,
		|	ДанныеДокументов.ДолжностьРуководителя КАК ДолжностьРуководителя,
		|	ФИОРаботникаКадровойСлужбы.РасшифровкаПодписи КАК ФИОКадровика,
		|	ДанныеДокументов.ДолжностьРаботникаКадровойСлужбы КАК ДолжностьКадровика,
		|	ДанныеДокументов.Исполнитель КАК Исполнитель,
		|	ФИОИсполнителя.РасшифровкаПодписи КАК ФИООтветственного,
		|	ДанныеДокументов.ДолжностьИсполнителя КАК ДолжностьОтветственного,
		|	ДанныеДокументов.Ответственный КАК Ответственный,
		|	ДанныеДокументов.ИсполнительОтБухгалтерии КАК ИсполнительОтБухгалтерии,
		|	ФИОИсполнителяОтБухгалтерии.РасшифровкаПодписи КАК ФИОИсполнителяОтБухгалтерии,
		|	ДанныеДокументов.ДолжностьИсполнителяОтБухгалтерии КАК ДолжностьИсполнителяОтБухгалтерии
		|ИЗ
		|	ВТДанныеДокументов КАК ДанныеДокументов
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВТФИООтветственныхЛиц КАК ФИОРуководителя
		|		ПО ДанныеДокументов.Ссылка = ФИОРуководителя.Ссылка
		|			И ДанныеДокументов.Руководитель = ФИОРуководителя.ФизическоеЛицо
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВТФИООтветственныхЛиц КАК ФИОРаботникаКадровойСлужбы
		|		ПО ДанныеДокументов.Ссылка = ФИОРаботникаКадровойСлужбы.Ссылка
		|			И ДанныеДокументов.РаботникКадровойСлужбы = ФИОРаботникаКадровойСлужбы.ФизическоеЛицо
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВТФИООтветственныхЛиц КАК ФИОИсполнителя
		|		ПО ДанныеДокументов.Ссылка = ФИОИсполнителя.Ссылка
		|			И ДанныеДокументов.Исполнитель = ФИОИсполнителя.ФизическоеЛицо
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВТФИООтветственныхЛиц КАК ФИОИсполнителяОтБухгалтерии
		|		ПО ДанныеДокументов.Ссылка = ФИОИсполнителяОтБухгалтерии.Ссылка
		|			И ДанныеДокументов.ИсполнительОтБухгалтерии = ФИОИсполнителяОтБухгалтерии.ФизическоеЛицо
		|
		|УПОРЯДОЧИТЬ ПО
		|	ДанныеДокументов.Ссылка
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ДанныеОВремени.Ссылка КАК Ссылка,
		|	ДанныеОВремени.Сотрудник КАК Сотрудник,
		|	ДанныеОВремени.Дата КАК Дата,
		|	ДанныеОВремени.ВидВремени КАК ВидВремени,
		|	ДанныеОВремени.Часов КАК Часов,
		|	ОписаниеВидовВремени.Наименование КАК ВидВремениНаименование,
		|	ОписаниеВидовВремени.БуквенныйКодБюджетный КАК БуквенныйКодБюджетный,
		|	ОписаниеВидовВремени.БуквенныйКодБюджетный2009 КАК БуквенныйКодБюджетный2009,
		|	ОписаниеВидовВремени.БуквенныйКод КАК БуквенныйКод,
		|	ОписаниеВидовВремени.РабочееВремя КАК РабочееВремя,
		|	ОписаниеВидовВремени.ОсновноеВремя КАК ОсновноеВремя,
		|	ВЫБОР
		|		КОГДА ОписаниеВидовВремени.Ссылка = &Явка
		|			ТОГДА 1
		|		КОГДА ОписаниеВидовВремени.ОсновноеВремя = &Явка
		|			ТОГДА 2
		|		КОГДА ОписаниеВидовВремени.Ссылка = &ВечерниеЧасы
		|			ТОГДА 3
		|		КОГДА ОписаниеВидовВремени.ОсновноеВремя = &ВечерниеЧасы
		|			ТОГДА 3
		|		КОГДА ОписаниеВидовВремени.Ссылка = &НочныеЧасы
		|			ТОГДА 5
		|		КОГДА ОписаниеВидовВремени.ОсновноеВремя = &НочныеЧасы
		|			ТОГДА 6
		|		КОГДА ОписаниеВидовВремени.Ссылка = &Сверхурочно
		|			ТОГДА 7
		|		КОГДА ОписаниеВидовВремени.ОсновноеВремя = &Сверхурочно
		|			ТОГДА 8
		|		ИНАЧЕ 9
		|	КОНЕЦ КАК Приоритет,
		|	КадровыеДанныеСотрудниковДолжности.Должность КАК ДолжностьСсылка,
		|	Должности.Наименование КАК Должность,
		|	ЕСТЬNULL(КадровыеДанныеСотрудниковФИО.ФамилияИО, """") КАК ФамилияИО,
		|	ЕСТЬNULL(КадровыеДанныеСотрудниковФИО.ФИОПолные, """") КАК ФИОПолные,
		|	КадровыеДанныеСотрудниковФИО.ФамилияИО КАК ФамилияИО1,
		|	КадровыеДанныеСотрудниковФИО.ФИОПолные КАК ФИОПолные1,
		|	КадровыеДанныеСотрудниковФИО.ТабельныйНомер КАК ТабельныйНомер,
		|	Сотрудники.Наименование КАК СотрудникНаименование,
		|	ОписаниеВидовВремени.Целосменное КАК Целосменное,
		|	ВЫБОР
		|		КОГДА ДанныеОВремени.ВидВремени В (&ВидыВремениСплошнойРегистрации)
		|			ТОГДА ИСТИНА
		|		ИНАЧЕ ЛОЖЬ
		|	КОНЕЦ КАК ВидВремениСплошнойРегистрации
		|ИЗ
		|	ВТДанныеОВремени КАК ДанныеОВремени
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
		|		ПО ДанныеОВремени.Сотрудник = Сотрудники.Ссылка
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВидыИспользованияРабочегоВремени КАК ОписаниеВидовВремени
		|		ПО ДанныеОВремени.ВидВремени = ОписаниеВидовВремени.Ссылка
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТПорядокСотрудниковВДокументах КАК ПорядокСотрудниковВДокументах
		|		ПО ДанныеОВремени.Ссылка = ПорядокСотрудниковВДокументах.Ссылка
		|			И ДанныеОВремени.Сотрудник = ПорядокСотрудниковВДокументах.Сотрудник
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКадровыеДанныеСотрудников КАК КадровыеДанныеСотрудниковДолжности
		|			ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК Должности
		|			ПО КадровыеДанныеСотрудниковДолжности.Должность = Должности.Ссылка
		|		ПО ДанныеОВремени.Сотрудник = КадровыеДанныеСотрудниковДолжности.Сотрудник
		|			И ДанныеОВремени.Дата = КадровыеДанныеСотрудниковДолжности.Период
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКадровыеДанныеСотрудников КАК КадровыеДанныеСотрудниковФИО
		|		ПО ДанныеОВремени.Сотрудник = КадровыеДанныеСотрудниковФИО.Сотрудник
		|			И ДанныеОВремени.ДатаДокумента = КадровыеДанныеСотрудниковФИО.Период
		|
		|УПОРЯДОЧИТЬ ПО
		|	Ссылка,
		|	ПорядокСотрудниковВДокументах.НомерСтроки,
		|	Сотрудник,
		|	Должность,
		|	Дата,
		|	Приоритет,
		|	ДанныеОВремени.НомерСтроки";
	
	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьПараметр("Явка", ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка"));
	Запрос.УстановитьПараметр("ВечерниеЧасы", ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РаботаВечерниеЧасы"));
	Запрос.УстановитьПараметр("НочныеЧасы", ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РаботаНочныеЧасы"));
	Запрос.УстановитьПараметр("Сверхурочно", ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Сверхурочные"));
	Запрос.УстановитьПараметр("ВидыВремениСплошнойРегистрации", УчетРабочегоВремениРасширенный.ВидыВремениСплошнойРегистрации());
                                
	Возврат Запрос.ВыполнитьПакет();	
КонецФункции

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

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

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

// Возвращает порядковый номер "первичного/корректирующего" табеля в соответствии с требованиями
// заполнения поля "Вид табеля" печатной формы 0504421.
//
// Параметры:
//  Табель  - ДокументСсылка.ТабельУчетаРабочегоВремени - Где требуется определить 
//				"номер корректировки" табеля.
//
// Возвращаемое значение:
//   Число   - (первичный - 0; корректирующий - 1, 2, и т.д.).
//
Функция НомерКорректировкиТабеля(Табель)

	ИсправленныеДокументы = ИсправлениеДокументовЗарплатаКадры.ПолучитьДокументыЦепочкиИсправлений(Табель);
	КоличествоИсправлений = ИсправленныеДокументы.Количество();
	
	Возврат ?(КоличествоИсправлений > 0, КоличествоИсправлений, 0);
	
КонецФункции

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

	ТипДата = Новый ОписаниеТипов("Дата");
	ТипЧисло = Новый ОписаниеТипов("Число");
	ТипБулево = Новый ОписаниеТипов("Булево");
	ТипСтрока3 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(3));
	ТипСтрока10 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(10));
	ТипСтрока50 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50));
	ТипСтрока100 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));
	ТипСтрока150 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150));
	ДанныеОВремени = Новый ДеревоЗначений;
	ДанныеОВремени.Колонки.Добавить("ВидУчетаВремени", ТипВидРабочегоВремени);
	ДанныеОВремени.Колонки.Добавить("ВидУчетаВремениБуквенныйКодБюджетный", ТипСтрока3);
	ДанныеОВремени.Колонки.Добавить("ВидУчетаВремениБуквенныйКодБюджетный2009", ТипСтрока3);
	ДанныеОВремени.Колонки.Добавить("ВидУчетаВремениНаименование", ТипСтрока50);
	ДанныеОВремени.Колонки.Добавить("ВидУчетаВремениОсновноеВремя", ТипВидРабочегоВремени);
	ДанныеОВремени.Колонки.Добавить("ВидУчетаВремениРабочееВремя", ТипБулево);
	ДанныеОВремени.Колонки.Добавить("ВидУчетаВремениЦелосменное", ТипБулево);
	ДанныеОВремени.Колонки.Добавить("Дата", ТипДата);
	ДанныеОВремени.Колонки.Добавить("ДолжностьКонецМесяца", Новый ОписаниеТипов("СправочникСсылка.Должности"));
	ДанныеОВремени.Колонки.Добавить("ДолжностьКонецМесяцаНаименование", ТипСтрока150);
	ДанныеОВремени.Колонки.Добавить("Имя", ТипСтрока50);
	ДанныеОВремени.Колонки.Добавить("Месяц", ТипДата);
	ДанныеОВремени.Колонки.Добавить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
	ДанныеОВремени.Колонки.Добавить("ОрганизацияКодПоОКПО", ТипСтрока10);
	ДанныеОВремени.Колонки.Добавить("ОрганизацияНаименование", ТипСтрока150);
	ДанныеОВремени.Колонки.Добавить("ОрганизацияНаименованиеПолное", Новый ОписаниеТипов("Строка"));
	ДанныеОВремени.Колонки.Добавить("Отклонение", ТипБулево);
	ДанныеОВремени.Колонки.Добавить("Отчество", ТипСтрока50);
	ДанныеОВремени.Колонки.Добавить("ПараметрыДанныхОтветственный", Новый ОписаниеТипов("СправочникСсылка.Пользователи"));
	ДанныеОВремени.Колонки.Добавить("Подразделение", Новый ОписаниеТипов("СправочникСсылка.ПодразделенияОрганизаций"));
	ДанныеОВремени.Колонки.Добавить("ПодразделениеНаименование", ТипСтрока150);
	ДанныеОВремени.Колонки.Добавить("ПриоритетВидаВремени", ТипЧисло);
	ДанныеОВремени.Колонки.Добавить("РабочиеДни", ТипЧисло);
	ДанныеОВремени.Колонки.Добавить("РабочиеЧасы", ТипЧисло);
	ДанныеОВремени.Колонки.Добавить("СистемныеПоляНомерПоПорядкуВГруппировке", ТипЧисло);
	ДанныеОВремени.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
	ДанныеОВремени.Колонки.Добавить("СотрудникКод", ТипСтрока10);
	ДанныеОВремени.Колонки.Добавить("СотрудникНаименование", ТипСтрока100);
	ДанныеОВремени.Колонки.Добавить("Фамилия", ТипСтрока50);
	ДанныеОВремени.Колонки.Добавить("ФамилияИО", ТипСтрока100);
	ДанныеОВремени.Колонки.Добавить("ФИОПолные", ТипСтрока150);
	ДанныеОВремени.Колонки.Добавить("Часы", ТипЧисло);
	
	Возврат ДанныеОВремени;
	
КонецФункции

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

		ТабличныйДокумент.Вывести(ОбластьШапкаТаблицы);
		ТекущийЛист.Вывести(ОбластьШапкаТаблицы);
	КонецЕсли;
	
	ТабличныйДокумент.Вывести(ОбластьДанныеОВремени);
	ТекущийЛист.Вывести(ОбластьДанныеОВремени);
	
	Если ОбластьПодвал <> Неопределено Тогда
		ТабличныйДокумент.Вывести(ОбластьПодвал);
		ТекущийЛист.Вывести(ОбластьПодвал);
	КонецЕсли;
	
КонецПроцедуры

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

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

#Область СозданиеНовогоДокумента

Функция ДанныеНовогоДокумента() Экспорт

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

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

#КонецЕсли

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