Графики работы сотрудников / Модуль менеджера

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

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

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

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

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

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

			ОписаниеГрафика = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
									ШаблонОписания,
									Строка(Выборка.ДлительностьРабочейНедели),
									Строка(Выборка.ДлительностьРабочейНедели));
		КонецЕсли;					
		
		ПредставлениеГрафиков.Вставить(Выборка.Ссылка, ОписаниеГрафика);
										
	КонецЦикла;	
	
	Возврат ПредставлениеГрафиков;
	
КонецФункции	

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

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

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

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

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

Функция ПечатнаяФормаГрафиковРаботы(МассивОбъектов, Год)
	РезультатыЗапроса = ЗапросДляПечатиГрафиков(МассивОбъектов, Год).ВыполнитьПакет();
	КоличествоРезультатов = РезультатыЗапроса.Количество();
	
	ВыборкаДанныхОВремени = РезультатыЗапроса[КоличествоРезультатов - 2].Выбрать();
	ВыборкаДанныхГрафиков = РезультатыЗапроса[КоличествоРезультатов - 1].Выбрать();
	
	Макет = УправлениеПечатью.МакетПечатнойФормы("Справочник.ГрафикиРаботыСотрудников.ПФ_MXL_ФормаГрафикаРаботы");
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	
	ТабличныйДокумент.КлючПараметровПечати = "ГрафикиРаботыСотрудников_ФормаГрафикаРаботы";

	ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
	ТабличныйДокумент.Автомасштаб = Истина;
	
	ОбластиМакета = Новый Массив;	
	
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
	ОбластиМакета.Добавить(ОбластьШапка);
	
	ОбластьЗаголовокТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
	ОбластиМакета.Добавить(ОбластьЗаголовокТаблицы);
	
	ОбластьИтогоЗаМесяц = Макет.ПолучитьОбласть("ИтогоЗаМесяц");
	ОбластиМакета.Добавить(ОбластьИтогоЗаМесяц);

	ОбластьИтогоПоВидамВремениЗаМесяц = Макет.ПолучитьОбласть("ИтогоПоВидамВремениЗаМесяц");
	ОбластиМакета.Добавить(ОбластьИтогоПоВидамВремениЗаМесяц);

	ОбластьИтогоЗаКвартал = Макет.ПолучитьОбласть("ИтогоЗаКвартал");
	ОбластиМакета.Добавить(ОбластьИтогоЗаКвартал);
	
	ОбластьИтогоЗаКварталПоВидуВремени = Макет.ПолучитьОбласть("ИтогоЗаКварталПоВидамВремени");
	ОбластиМакета.Добавить(ОбластьИтогоЗаКварталПоВидуВремени);

	ОбластьИтогоЗаГод = Макет.ПолучитьОбласть("ИтогоЗаГод");
	ОбластиМакета.Добавить(ОбластьИтогоЗаГод);

	ОбластьИтогоЗаГодПоВидамВремени = Макет.ПолучитьОбласть("ИтогоЗаГодПоВидамВремени");
	ОбластиМакета.Добавить(ОбластьИтогоЗаГодПоВидамВремени);

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

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

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

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

Процедура УстановитьШиринуКолонокТабличногоДокумента(ОбластиМакета, КоличествоВидовВремени)
	Для Каждого ТабличныйДокумент Из ОбластиМакета Цикл
		ТабличныйДокумент.Область(1, 2, ТабличныйДокумент.ВысотаТаблицы, 32).ШиринаКолонки  = КоличествоВидовВремени * ?(КоличествоВидовВремени > 1, 2, 3.63);
		ТабличныйДокумент.Область(1, 33, ТабличныйДокумент.ВысотаТаблицы, 33).ШиринаКолонки  = КоличествоВидовВремени * ?(КоличествоВидовВремени > 1, 6, 3.63);
		ТабличныйДокумент.Область(1, 34, ТабличныйДокумент.ВысотаТаблицы, 34).ШиринаКолонки  = КоличествоВидовВремени * ?(КоличествоВидовВремени > 1, 6, 7.13);
	КонецЦикла;	
КонецПроцедуры	

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

Функция ИтогиПоВидамВремениЗаПериод(ОписаниеГрафика)
	ИтогиПоВидамВремени = Новый Соответствие;
	
	Для Каждого ВидВремени Из ОписаниеГрафика.ВидыВремени Цикл
		ИтогиПоВидамВремени.Вставить(ВидВремени, Новый Структура("Дни, Часы", 0, 0));
	КонецЦикла;	
	
	Возврат ИтогиПоВидамВремени;
КонецФункции	

Процедура ОчиститьОбластьЯчеек(ОбластьЯчеек)
	КоличествоПараметров = ОбластьЯчеек.Параметры.Количество();
	
	Для ИндексПараметра = 0 По КоличествоПараметров - 1 Цикл  
		ОбластьЯчеек.Параметры.Установить(ИндексПараметра, Неопределено);
	КонецЦикла;	
КонецПроцедуры                       

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

Функция ТекстОписанияГрафикаРаботы(ОписаниеГрафикаРаботы) Экспорт
	Понедельник = '20120514';
	РабочееВремяТекст = "";
	Если Не ОписаниеГрафикаРаботы.НеполноеРабочееВремя Тогда 
		РабочееВремяТекст = НСтр("ru = 'Полная занятость'");
	ИначеЕсли ОписаниеГрафикаРаботы.НеполныйРабочийДень Тогда 
		РабочееВремяТекст = НСтр("ru = 'Неполный рабочий день'");
	Иначе
		РабочееВремяТекст = НСтр("ru = 'Неполная рабочая неделя'");
	КонецЕсли;
	
	Если ОписаниеГрафикаРаботы.СпособЗаполнения = Перечисления.СпособыЗаполненияГрафиковРаботыСотрудников.ПоНеделям Тогда
					
		НомерДняНачалаИнтервала = 0;
		НомерДняОкончанияИнтервала = 0;
		РабочиеДниИдутПодряд = Истина;
		НомераРабочихДней = Новый Массив;
		НомераВыходныхДней = Новый Массив;
		Для Каждого СтрокаШаблонаЗаполнения Из ОписаниеГрафикаРаботы.ШаблонЗаполнения Цикл
			Если СтрокаШаблонаЗаполнения.ДеньВключенВГрафик И 
				НомерДняНачалаИнтервала <> 0 И 
				СтрокаШаблонаЗаполнения.НомерСтроки - НомерДняОкончанияИнтервала <> 1  Тогда
				РабочиеДниИдутПодряд = Ложь;				
			КонецЕсли;	
			Если СтрокаШаблонаЗаполнения.ДеньВключенВГрафик Тогда  
				Если НомерДняНачалаИнтервала = 0 Тогда
					НомерДняНачалаИнтервала = СтрокаШаблонаЗаполнения.НомерСтроки;
				КонецЕсли;	
				
				НомерДняОкончанияИнтервала = СтрокаШаблонаЗаполнения.НомерСтроки;
				НомераРабочихДней.Добавить(СтрокаШаблонаЗаполнения.НомерСтроки);
			Иначе
				НомераВыходныхДней.Добавить(СтрокаШаблонаЗаполнения.НомерСтроки);
			КонецЕсли;
		КонецЦикла;
		
		КоличествоРабочихДней = НомераРабочихДней.Количество();
		
		Если КоличествоРабочихДней = 5 Тогда
			ВидГрафикаСтрока = НСтр("ru = 'Пятидневка'");
		ИначеЕсли КоличествоРабочихДней = 6 Тогда
			ВидГрафикаСтрока = НСтр("ru = 'Шестидневка'");
		Иначе
			ВидГрафикаСтрока = НСтр("ru = 'Недельный график'");
		КонецЕсли;
		
		Если КоличествоРабочихДней = 0 Тогда
			РабочиеДниТекст = "";
		Иначе	
			Если РабочиеДниИдутПодряд Тогда
				РабочиеДниТекст = Формат(Понедельник + (НомерДняНачалаИнтервала - 1) * 86400, "ДФ=ддд") + "-" + 
					Формат(Понедельник + (НомерДняОкончанияИнтервала - 1) * 86400, "ДФ=ддд");
			Иначе 
				ПеречислениеДнейТекст = "";
				Для Каждого НомерРабочегоДня Из НомераРабочихДней Цикл
					ПеречислениеДнейТекст = ПеречислениеДнейТекст + ?(ПустаяСтрока(ПеречислениеДнейТекст), "", ", ") + 
						Формат(Понедельник + (НомерРабочегоДня - 1) * 86400, "ДФ=ддд");
				КонецЦикла;	
				РабочиеДниТекст = ПеречислениеДнейТекст;
			КонецЕсли;	
		КонецЕсли;
		
		Если НомераВыходныхДней.Количество() = 0 Тогда
			ВыходныеДниТекст = НСтр("ru = 'без выходных'");
		Иначе	
        	ПеречислениеДнейТекст = "";
			Для Каждого НомерВыходногоДня Из НомераВыходныхДней Цикл
				ПеречислениеДнейТекст = ПеречислениеДнейТекст + ?(ПустаяСтрока(ПеречислениеДнейТекст), "", ", ") + 
					Формат(Понедельник + (НомерВыходногоДня - 1) * 86400, "ДФ=ддд");
			КонецЦикла;	
			ВыходныеДниТекст = ПеречислениеДнейТекст;
		КонецЕсли;
		
	Иначе
		ВидГрафикаСтрока = НСтр("ru = 'Скользящий график'");	
	КонецЕсли;	
	
	СтрокаНастройкиЗаполнения = НСтр("ru = '%1, раб. дни: %2, выходн. дни: %3
                                      |%4. Длительность рабочей недели: %5 чс.'");
	
	Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаНастройкиЗаполнения,
																ВидГрафикаСтрока,
																РабочиеДниТекст,
																ВыходныеДниТекст,
																РабочееВремяТекст,
																ОписаниеГрафикаРаботы.ДлительностьРабочейНедели);
КонецФункции

Функция СреднемесячныеНормыВремениПоУмолчанию(ГрафикРаботыСотрудников) Экспорт
	
	СтруктураЗаписи = Новый Структура;
	СтруктураЗаписи.Вставить("Год", 1);
	СтруктураЗаписи.Вставить("ГрафикРаботыСотрудников", ГрафикРаботыСотрудников);
	СтруктураЗаписи.Вставить("СреднемесячноеЧислоЧасов", 0);
	СтруктураЗаписи.Вставить("СреднемесячноеЧислоДней", 0);
	СтруктураЗаписи.Вставить("УстановленыВРучную", Ложь);
	
	Возврат СтруктураЗаписи;
	
КонецФункции

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

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

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

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

#КонецЕсли

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