Работа в выходные и праздничные дни / Модуль менеджера

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция ОбъектЗаблокирован(СсылкаНаОбъект) Экспорт
	
	Возврат Ложь;
	
КонецФункции

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

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

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

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

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

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

Функция ДобавитьКомандыСозданияДокументов(КомандыСозданияДокументов, ДополнительныеПараметры) Экспорт
	
	ЗарплатаКадрыРасширенный.ДобавитьВКоллекциюКомандуСозданияДокументаПоМетаданнымДокумента(
		КомандыСозданияДокументов, Метаданные.Документы.РаботаВВыходныеИПраздничныеДни);
	
КонецФункции

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

// Сформировать печатные формы объектов.
//
// ВХОДЯЩИЕ:
//   МассивОбъектов  - Массив    - Массив ссылок на объекты которые нужно распечатать.
//
// ИСХОДЯЩИЕ:
//   КоллекцияПечатныхФорм - Таблица значений - Сформированные табличные документы.
//   ОшибкиПечати          - Список значений  - Ошибки печати  (значение - ссылка на объект, представление - текст
//                           ошибки).
//   ОбъектыПечати         - Список значений  - Объекты печати (значение - ссылка на объект, представление - имя
//                           области в которой был выведен объект).
//   ПараметрыВывода       - Структура        - Параметры сформированных табличных документов.
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПФ_MXL_ПриказОРаботеВВыходнойИПраздничныйДень") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
		КоллекцияПечатныхФорм, 
		"ПФ_MXL_ПриказОРаботеВВыходнойИПраздничныйДень", 
		НСтр("ru = 'Приказ о работе в выходной (праздничный день)'"), 
		ПечатнаяФормаПриказаОРаботеВВыходнойИПраздничныйДень(МассивОбъектов, ОбъектыПечати), ,
		"Документ.РаботаВВыходныеИПраздничныеДни.ПФ_MXL_ПриказОРаботеВВыходнойИПраздничныйДень");
	КонецЕсли;
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПФ_MXL_ГрафикРаботыВВыходнойИПраздничныйДень") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
		КоллекцияПечатныхФорм, 
		"ПФ_MXL_ГрафикРаботыВВыходнойИПраздничныйДень", 
		НСтр("ru = 'График работы в выходной (праздничный день)'"), 
		ПечатнаяФормаГрафикРаботыВВыходнойИПраздничныйДень(МассивОбъектов, ОбъектыПечати), ,
		"Документ.РаботаВВыходныеИПраздничныеДни.ПФ_MXL_ГрафикРаботыВВыходнойИПраздничныйДень");
	КонецЕсли;
	
КонецПроцедуры	

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

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

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

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

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

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

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

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

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

#КонецЕсли

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