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

файл

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

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

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

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

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

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

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	ОповеститьОбИзмененииДанныхГрафика();	
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	
	ПерерасчетЗарплаты.РегистрацияПерерасчетовПоПредварительнымДаннымВФоне(ТекущийОбъект.Ссылка);
	
	// СтандартныеПодсистемы.КонтрольВеденияУчета
	КонтрольВеденияУчетаБЗК.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
	// Конец СтандартныеПодсистемы.КонтрольВеденияУчета
	
КонецПроцедуры

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура НомерТекущегоГодаРегулирование(Элемент, Направление, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если МодифицированностьДанныхГрафика Тогда
		ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							НСтр("ru = 'Данные графика за %1 год были изменены. Сохранить данные графика?'"),
							Формат(НомерТекущегоГода, "ЧГ="));
		Оповещение = Новый ОписаниеОповещения("НомерТекущегоГодаРегулированиеЗавершение", ЭтотОбъект, Направление);					
		ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да);					
	Иначе 
		НомерТекущегоГодаРегулированиеЗавершение(Неопределено, Направление);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НомерТекущегоГодаРегулированиеЗавершение(Ответ, Направление) Экспорт 
	
	Если Ответ = КодВозвратаДиалога.Да Тогда
		Записать();
		
		Если МодифицированностьДанныхГрафика Тогда
			Возврат;
		КонецЕсли;	
	КонецЕсли;
	
	МодифицированностьДанныхГрафика = Ложь;
	
	НомерТекущегоГода = НомерТекущегоГода + 1 * Направление;
	ПрочитатьДанныеГрафикаВФорму();
	
КонецПроцедуры

&НаКлиенте
Процедура СреднемесячныеНормыВремениГрафиковРаботыСотрудниковСреднемесячноеЧислоЧасовПриИзменении(Элемент)
	
	СреднемесячныеНормыВремениГрафиковРаботыСотрудников.УстановленыВРучную = 
		СреднемесячныеНормыВремениГрафиковРаботыСотрудниковПрежняя.СреднемесячноеЧислоЧасов <> СреднемесячныеНормыВремениГрафиковРаботыСотрудников.СреднемесячноеЧислоЧасов;
		
	УстановитьОтображениеПолейСреднемесячныеНормыВремени();
	
	МодифицированностьДанныхГрафика = Истина;
	АвтоОбновлениеПоПроизводственномуКалендарю = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура СреднемесячныеНормыВремениГрафиковРаботыСотрудниковСреднемесячноеЧислоДнейПриИзменении(Элемент)
	
	СреднемесячныеНормыВремениГрафиковРаботыСотрудников.УстановленыВРучную = 
		СреднемесячныеНормыВремениГрафиковРаботыСотрудниковПрежняя.СреднемесячноеЧислоДней <> СреднемесячныеНормыВремениГрафиковРаботыСотрудников.СреднемесячноеЧислоДней;
		
	УстановитьОтображениеПолейСреднемесячныеНормыВремени();
	
	МодифицированностьДанныхГрафика = Истина;
	АвтоОбновлениеПоПроизводственномуКалендарю = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура АвтоОбновлениеПоПроизводственномуКалендарюПриИзменении(Элемент)
	Модифицированность = Истина;
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыТабличноеПолеГрафика

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

&НаКлиенте
Процедура ТабличноеПолеГрафикаПриИзменении(Элемент)
	МодифицированностьДанныхГрафика = Истина;
	АвтоОбновлениеПоПроизводственномуКалендарю = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПредставлениеДанныхСменногоГрафикаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Если Элементы.ПредставлениеДанныхСменногоГрафика.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;	
	
	Если Лев(Поле.Имя, СтрДлина("ПредставлениеДанныхСменногоГрафикаПредставлениеСмена")) = "ПредставлениеДанныхСменногоГрафикаПредставлениеСмена"
		Или Лев(Поле.Имя, СтрДлина("ПредставлениеДанныхСменногоГрафикаПредставлениеДень")) = "ПредставлениеДанныхСменногоГрафикаПредставлениеДень" Тогда
		
		СтандартнаяОбработка = Ложь;
		ОткрытьФормуРедактированияДанных(Поле);
	КонецЕсли;	
КонецПроцедуры

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

#Область ОбработчикиКомандФормы

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

// СтандартныеПодсистемы.Свойства
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
	УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства

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

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

&НаКлиенте
Процедура ЗаполнитьЗавершение(Ответ, ДополнительныеПараметры) Экспорт 
	
	Если Ответ = КодВозвратаДиалога.Да Тогда
		ИзменитьНастройкиЗаполненияГрафика();	
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьПараметры(Команда)
	
	ИзменитьНастройкиЗаполненияГрафика();

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

&НаКлиенте
Функция Печать(ОписаниеКоманды) Экспорт
	ОписаниеКоманды.ДополнительныеПараметры.Вставить("Год", НомерТекущегоГода);
	УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати(ОписаниеКоманды);
КонецФункции

&НаКлиенте
Процедура ПересчитатьСреднемесячныеЧислаЧасовИДней(Команда)
	
	СреднемесячныеНормыВремениГрафиковРаботыСотрудников.УстановленыВРучную = Ложь;
	Модифицированность = Истина;
	
	Если НЕ СреднемесячныеНормыВремениГрафиковРаботыСотрудников.УстановленыВРучную Тогда
		РассчитатьСреднемесячныеНормыВремени();
	КонецЕсли; 
	УстановитьОтображениеПолейСреднемесячныеНормыВремени();
	
КонецПроцедуры

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

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

// СтандартныеПодсистемы.КонтрольВеденияУчета

&НаКлиенте
Процедура Подключаемый_ОткрытьОтчетПоПроблемам(ЭлементИлиКоманда, НавигационнаяСсылка, СтандартнаяОбработка)
	КонтрольВеденияУчетаКлиентБЗК.ОткрытьОтчетПоПроблемамОбъекта(ЭтотОбъект, Объект.Ссылка, СтандартнаяОбработка);
КонецПроцедуры

// Конец СтандартныеПодсистемы.КонтрольВеденияУчета

// СтандартныеПодсистемы.Свойства 
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
	УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
	УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
	УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства

&НаСервере
Процедура УстановитьПризнакАвтоОбновленияГрафика()
	
	АвтоОбновлениеПоПроизводственномуКалендарю = ВозможноАвтоОбновленияГрафика();
	
КонецПроцедуры

&НаСервере
Процедура УстановитьПризнакАвтоОбновленияГрафикаПослеЗаполнения()
	
	АвтоОбновлениеПоПроизводственномуКалендарю = Объект.СпособЗаполнения = Перечисления.СпособыЗаполненияГрафиковРаботыСотрудников.ПоНеделям
		Или Объект.УчитыватьПраздники;
	
КонецПроцедуры

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

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

&НаСервере
Процедура УстановитьПредставлениеДанныхГрафика()
	Если Объект.СпособЗаполнения = Перечисления.СпособыЗаполненияГрафиковРаботыСотрудников.ПоСменам Тогда
		УстановитьПредставлениеДанныхСменногоГрафика();
	Иначе
		УстановитьПредставлениеДанныхОбычногоГрафика();
	КонецЕсли;	
КонецПроцедуры	

&НаСервере
Процедура УстановитьПредставлениеДанныхСменногоГрафика()
	ЗаполнитьПредставлениеСменногоГрафика();
	Элементы.ПредставлениеДанныхГрафикаСтраницы.ТекущаяСтраница = Элементы.ПредставлениеСменногоГрафикаСтраница;
	
	Для Каждого СтрокаГрафика Из ДанныеГрафика Цикл
		Для Сч = 1 По 31 Цикл
			ЧасовЗаДень = СтрокаГрафика["День" + Формат(Сч, "ЧГ=")];
			
			СтрокаГрафика["Целое" + Формат(Сч, "ЧГ=")] = ЧасовЗаДень - Цел(ЧасовЗаДень) = 0;
		КонецЦикла;	
		СтрокаГрафика.ИтогЧасыЦелое = СтрокаГрафика.ИтогЧасы - Цел(СтрокаГрафика.ИтогЧасы) = 0;
	КонецЦикла;	
КонецПроцедуры

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

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

&НаСервере
Процедура УстановитьСвойстваЭлементовВводаВремени()
	ВысотаЭлемента = ?(Объект.ВидыВремени.Количество() = 1, 2, 1);
	
	Для НомерДня = 1 По 31 Цикл
		Элементы["ТабличноеПолеГрафикаДень1"].Высота = ВысотаЭлемента;		
	КонецЦикла;	
	
	Элементы.ТабличноеПолеГрафикаВидВремени.Высота = ВысотаЭлемента;
	Элементы.ТабличноеПолеГрафикаМесяц.Высота = ВысотаЭлемента;	
КонецПроцедуры	

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

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

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

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

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

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

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

&НаСервере
Процедура ДобавитьСтрокуВТаблицуДанныхГрафика(НомерМесяца, ВидВремени, ПорядокВидаВремени)
	СтрокаТаблицы = ДанныеГрафика.Добавить();
	СтрокаТаблицы.НомерМесяца = НомерМесяца;
	СтрокаТаблицы.ВидВремени = ВидВремени;
	СтрокаТаблицы.ПорядокВидаВремени = ПорядокВидаВремени;
	СтрокаТаблицы.МесяцПредставление = ПредставлениеМесяца(НомерТекущегоГода, НомерМесяца);	
	СтрокаТаблицы.КоличествоДнейВМесяце = ЗарплатаКадрыКлиентСервер.КоличествоДнейМесяца(Дата(НомерТекущегоГода, НомерМесяца, 1));
КонецПроцедуры	

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеМесяца(НомерТекущегоГода, НомерМесяца)
	Возврат Формат(Дата(НомерТекущегоГода, НомерМесяца, 1), "ДФ=ММММ");;	
КонецФункции	

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

&НаКлиенте
Процедура ИзменитьНастройкиЗаполненияГрафика()
	
	Оповещение = Новый ОписаниеОповещения("ИзменитьНастройкиЗаполненияГрафикаЗавершение", ЭтотОбъект);
	ПолучитьНастройкиЗаполненияГрафика(Оповещение);
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьНастройкиЗаполненияГрафикаЗавершение(НастройкиЗаполненияГрафика, ДополнительныеПараметры) Экспорт 
	
	Если НастройкиЗаполненияГрафика <> Неопределено Тогда
		ЗаполнитьДанныеОбъектаИзНастроек(НастройкиЗаполненияГрафика);
		Модифицированность = Истина;
		МодифицированностьДанныхГрафика = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьНастройкиЗаполненияГрафика(ОбработкаОповещения) 

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

&НаКлиенте
Процедура ПолучитьНастройкиЗаполненияГрафикаЗавершение(НастройкиЗаполненияГрафика, ДополнительныеПараметры) Экспорт 
	
	Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.ОбработкаОповещения <> Неопределено Тогда 
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработкаОповещения, НастройкиЗаполненияГрафика);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура ОчиститьДанныеГрафика()
	Для Каждого СтрокаДанныхГрафика Из ДанныеГрафика Цикл
		Для НомерДня = 1 По 31 Цикл
			СтрокаДанныхГрафика["День" + НомерДня] = 0;	
			СтрокаДанныхГрафика["Смена" + НомерДня] =  Справочники.СменыРаботыСотрудников.ПустаяСсылка();
			СтрокаДанныхГрафика["ОтражатьЧасыВДеньНачалаСмены" + НомерДня] = Ложь;
		КонецЦикла;	
		СтрокаДанныхГрафика.ИтогДни = 0;
		СтрокаДанныхГрафика.ИтогЧасы = 0;
	КонецЦикла;	
КонецПроцедуры	                             

&НаСервере
Процедура УстановитьИнфоНадписьНастройкиГрафика()
	ТекстОписанияГрафикаРаботы	= Справочники.ГрафикиРаботыСотрудников.ТекстОписанияГрафикаРаботы(Объект);							  
									  
	ИнфоНадписьНастройкиГрафика = ТекстОписанияГрафикаРаботы;	
КонецПроцедуры	

&НаСервере
Процедура ЗаполнитьСреднемесячноеЧислоЧасовИЧислоДней()
	
	Если НЕ СреднемесячныеНормыВремениГрафиковРаботыСотрудников.УстановленыВРучную Тогда
		РассчитатьСреднемесячныеНормыВремени();
	КонецЕсли;
	
	Если СреднемесячныеНормыВремениГрафиковРаботыСотрудниковПрежняя = Неопределено Тогда
		СреднемесячныеНормыВремениГрафиковРаботыСотрудниковПрежняя =
			Справочники.ГрафикиРаботыСотрудников.СреднемесячныеНормыВремениПоУмолчанию(Объект.Ссылка);
	КонецЕсли; 
	
	УстановитьОтображениеПолейСреднемесячныеНормыВремени();
	
КонецПроцедуры

&НаСервере
Процедура УстановитьОтображениеПолейСреднемесячныеНормыВремени()

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

&НаСервере
Функция ДанныеСреднемесячныеНормыВремениГрафиковРаботыСотрудников(ГрафикРаботыСотрудников, Знач Год)
	
	Год = ?(Год = 0, 1, Год);
	
	СтруктураЗаписи = Справочники.ГрафикиРаботыСотрудников.СреднемесячныеНормыВремени(ГрафикРаботыСотрудников, Дата(Год, 1, 1));
	Если Не ЗначениеЗаполнено(СтруктураЗаписи.Год) Тогда
		СтруктураЗаписи.Год = Год;
	КонецЕсли; 
	
	Возврат СтруктураЗаписи;

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

&НаКлиентеНаСервереБезКонтекста
Процедура СохранитьСреднемесячныеНормыВремениГрафиковРаботыСотрудников(Форма)
	
	Если НЕ Форма.Объект.Ссылка.Пустая() Тогда
		
		СреднемесячныеНормыВремениГрафиковРаботыСотрудников = Форма.СреднемесячныеНормыВремениГрафиковРаботыСотрудников;
		СреднемесячныеНормыВремениГрафиковРаботыСотрудниковПрежняя = Форма.СреднемесячныеНормыВремениГрафиковРаботыСотрудниковПрежняя;
		
		Если СреднемесячныеНормыВремениГрафиковРаботыСотрудников.УстановленыВРучную <> СреднемесячныеНормыВремениГрафиковРаботыСотрудниковПрежняя.УстановленыВРучную
			ИЛИ СреднемесячныеНормыВремениГрафиковРаботыСотрудников.УстановленыВРучную
			И (СреднемесячныеНормыВремениГрафиковРаботыСотрудниковПрежняя.СреднемесячноеЧислоЧасов <> СреднемесячныеНормыВремениГрафиковРаботыСотрудников.СреднемесячноеЧислоЧасов
			ИЛИ СреднемесячныеНормыВремениГрафиковРаботыСотрудниковПрежняя.СреднемесячноеЧислоДней <> СреднемесячныеНормыВремениГрафиковРаботыСотрудников.СреднемесячноеЧислоДней) Тогда
			
			Форма.СохранитьСреднемесячныеНормыВремениНаСервере();
			
		КонецЕсли; 
		
	КонецЕсли; 
	
КонецПроцедуры

&НаСервере
Процедура СохранитьСреднемесячныеНормыВремениНаСервере() Экспорт
	
	РеквизитФормыВЗначение("СреднемесячныеНормыВремениГрафиковРаботыСотрудников").Записать(); 
			
КонецПроцедуры

&НаСервере
Процедура СохранитьПризнакАвтоОбновления(Ссылка)
	
	НаборЗаписей = РегистрыСведений.АвтоматическиОбновляемыеГрафикиРаботыСотрудников.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.ГрафикРаботы.Установить(Ссылка);
	НаборЗаписей.Отбор.Год.Установить(НомерТекущегоГода);
	
	Если АвтоОбновлениеПоПроизводственномуКалендарю Тогда
		НоваяСтрока = НаборЗаписей.Добавить();
		НоваяСтрока.ГрафикРаботы = Ссылка;
		НоваяСтрока.Год = НомерТекущегоГода;
	КонецЕсли;
	
	НаборЗаписей.Записать();
			
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОповеститьОбИзмененииДанныхГрафика()
	Оповестить("ИзменениеДанныхГрафика", Объект.Ссылка);	
КонецПроцедуры	

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

&НаКлиенте
Процедура ПослеОкончанииРедактированияДанныхОВремени(ДанныеМодифицированы, ДополнительныеПараметры) Экспорт
	Если ДанныеМодифицированы = Истина Тогда
		ПослеОкончанииРедактированияДанныхОВремениНаСервере();
	КонецЕсли;	
КонецПроцедуры	

&НаСервере
Процедура ПослеОкончанииРедактированияДанныхОВремениНаСервере()
	ОтредактированныеДанные = ПолучитьИзВременногоХранилища(АдресРедактируемыхДанных);	
	
	Если ОтредактированныеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;	
	
	ОтредактированныеДанныеВДанныеОбъекта(ОтредактированныеДанные);
	УстановитьПредставлениеДанныхГрафика();
КонецПроцедуры	

&НаСервере
Процедура ОтредактированныеДанныеВДанныеОбъекта(ОтредактированныеДанные)
	Модифицированность = Истина;
	МодифицированностьДанныхГрафика = Истина;
	АвтоОбновлениеПоПроизводственномуКалендарю = Ложь;
	
	НомерМесяца = ОтредактированныеДанные.ИдентификаторДанных;
	НомерДня = ОтредактированныеДанные.НомерДня;
	ОтражатьЧасыВДеньНачалаСмены = УчетРабочегоВремениРасширенный.НастройкиУчетаВремени().ОтражатьЧасыВДеньНачалаСмены;
		
	СтрокиДанныхГрафикаЗаМесяц = ДанныеГрафика.НайтиСтроки(Новый Структура("НомерМесяца", НомерМесяца));

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

&НаСервере
Процедура ДанныеДляРедактированияВХранилище(КлючСтрокиТаблицыПредставления, НомерДня)
	ДанныеДляРедактирования = ДанныеДляРедактирования(КлючСтрокиТаблицыПредставления, НомерДня);
	
	Если ПустаяСтрока(АдресРедактируемыхДанных) Тогда
		АдресРедактируемыхДанных = ПоместитьВоВременноеХранилище(ДанныеДляРедактирования, УникальныйИдентификатор);
	Иначе
		ПоместитьВоВременноеХранилище(ДанныеДляРедактирования, АдресРедактируемыхДанных);
	КонецЕсли;			
КонецПроцедуры	

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

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

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