Загрузка данных


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

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

&НаКлиенте
Функция СписокМесяцевПоСтроке(Текст)
	
	СписокМесяцев  = Новый СписокЗначений;
	Месяцы         = Новый Соответствие;
	МесяцыВозврата = Новый Массив;
	
	Для Счетчик = 1 По 12 Цикл
		Представление = Формат(Дата(2000, Счетчик, 1), "ДФ='ММММ'");
		СписокМесяцев.Добавить(Счетчик, Представление);
		Представление = Формат(Дата(2000, Счетчик, 1), "ДФ='МММ'");
		СписокМесяцев.Добавить(Счетчик, Представление);
	КонецЦикла;
	
	Для Каждого ЭлементСписка Из СписокМесяцев Цикл
		Если ВРег(Текст) = ВРег(Лев(ЭлементСписка.Представление, СтрДлина(Текст))) Тогда
			Месяцы[ЭлементСписка.Значение] = 0;
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого Элемент Из Месяцы Цикл
		МесяцыВозврата.Добавить(Элемент.Ключ);
	КонецЦикла;
	
	Возврат МесяцыВозврата;
	
КонецФункции

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

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

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

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


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


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

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




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

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

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


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


&НаСервере
Процедура СделатьОсновныеЭлементыФормыНедоступными()
	Элементы.Сотрудники.Доступность = Ложь;
	Элементы.ДанныеОВремени.Доступность = Ложь;
	Элементы.ЗаполнитьПоПроизводственномуГрафику.Доступность = Ложь;
КонецПроцедуры 

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

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


&НаСервере
Функция ВернутьФамилиюИИнициалы(Знач ФИО)  
	ФИО = СокрЛП(ФИО);
	МассивСлов = СтрРазделить(ФИО, " ", Ложь);
	Если МассивСлов.Количество() >= 3 Тогда
		Возврат СтрШаблон("%1 %2.%3.", МассивСлов[0], Лев(МассивСлов[1], 1), Лев(МассивСлов[2], 1)); 
	Иначе
		Возврат ФИО;
	КонецЕсли;  
КонецФункции

&НаСервере
Функция ВернутьУникальноеИмяКолонкиСотрудника(Сотрудник)  
	ЧастьУИД = Сред(Строка(СтрЗаменить(Сотрудник.УникальныйИдентификатор(),"-","_")),1,8); 
	ИмяКолонки = "С_" + Сотрудник.Код + "_" + ЧастьУИД;
	Возврат ИмяКолонки;
КонецФункции  

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




&НаСервере
Функция ПолучитьИмяКолонкиПоСотруднику(Сотрудник)
	Отбор = Новый Структура("Сотрудник", Сотрудник); 
	НайденныеСтроки = Объект.СоответствиеКолонокСотрудников.НайтиСтроки(Отбор);  
	Если НайденныеСтроки.Количество() > 0 Тогда
		Возврат НайденныеСтроки[0].ИмяКолонки;		
	КонецЕсли;
	Возврат ""; 
КонецФункции

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





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

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





&НаСервере
Процедура ЗаполнитьПоПроизводственномуГрафикуНаСервере()         
	Если Объект.Сотрудники.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Объект.ГрафикРаботыСотрудников.Очистить();
	Для Каждого СтрокаСотрудник Из Объект.Сотрудники Цикл    
		Для Каждого СтрокаТЧ ИЗ ПроизводственныйГрафик Цикл
			Если СтрокаТЧ.ВремяНачала <> Неопределено И СтрокаТЧ.ВремяОкончания <> Неопределено
				И СтрокаТЧ.ВремяНачала <> NULL И СтрокаТЧ.ВремяОкончания <> NULL Тогда
				НоваяСтрока = Объект.ГрафикРаботыСотрудников.Добавить(); 
				НоваяСтрока.Сотрудник = СтрокаСотрудник.Сотрудник;
				НоваяСтрока.ВремяНачала = СтрокаТЧ.ВремяНачала;
				НоваяСтрока.ВремяОкончания = ?(СтрокаТЧ.ВремяОкончания = Дата(1, 1, 1, 0, 0, 0), 
				Дата(1, 1, 1, 23, 59, 0), СтрокаТЧ.ВремяОкончания);
				НоваяСтрока.Дата = СтрокаТЧ.Дата;      
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;	
КонецПроцедуры 


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

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



&НаСервере
Процедура ЗадатьФорматТЧДанныеОВремени()
	Элементы.ДанныеОВремени.РастягиватьПоВертикали = Истина;
	Элементы.ДанныеОВремени.РастягиватьПоГоризонтали = Истина;
	Элементы.ДанныеОВремени.Ширина = 100;   
	Элементы.ДанныеОВремени.ПодчиненныеЭлементы.ДанныеОВремениГруппаКолонок.РастягиватьПоВертикали = Истина;
	Элементы.ДанныеОВремени.ПодчиненныеЭлементы.ДанныеОВремениГруппаКолонок.РастягиватьПоГоризонтали = Ложь;
	КоллекцияЭлементов = Элементы.ДанныеОВремени.ПодчиненныеЭлементы; 
	Для Индекс = 1 По КоллекцияЭлементов.Количество() - 1 Цикл 
		КоллекцияЭлементов[Индекс].ТолькоПросмотр = Истина; 
		КоллекцияЭлементов[Индекс].РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
		КоллекцияЭлементов[Индекс].ГоризонтальноеПоложениеВШапке = ГоризонтальноеПоложениеЭлемента.Центр; 
		КоллекцияЭлементов[Индекс].ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Центр;
	КонецЦикла; 
	
	КоллекцияЭлементовГруппы = Элементы.ДанныеОВремени.ПодчиненныеЭлементы.ДанныеОВремениГруппаКолонок.ПодчиненныеЭлементы; 
	Для Индекс = 0 По КоллекцияЭлементовГруппы.Количество() - 1 Цикл  
		КоллекцияЭлементовГруппы[Индекс].ТолькоПросмотр = Истина; 
		КоллекцияЭлементовГруппы[Индекс].РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
	КонецЦикла;
КонецПроцедуры


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


&НаКлиенте
Процедура ПослеЗаписиДанныхФормыРасписаниеРаботы(Результат, ДопПараметры) Экспорт
	Если Результат <> Неопределено Тогда          
		ПослеЗаписиДанныхФормыРасписаниеРаботыНаСервере(Результат, ДопПараметры);	
	КонецЕсли;
	ОтрисоватьТаблицуДанныеОВремени();
КонецПроцедуры


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


&НаСервере
Процедура ОчиститьГрафикРаботыСотрудников()
	Объект.ГрафикРаботыСотрудников.Очистить();
	ОтрисоватьТаблицуДанныеОВремени();   	
КонецПроцедуры

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


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


&НаСервере
Процедура ЗаполнитьПоПроизводственномуГрафикуСотрудникаНаСервере(Сотрудник)   
	Отбор = Новый Структура("Сотрудник"); 
	Отбор.Вставить("Сотрудник", Сотрудник);
	НайденныеСтроки = Объект.ГрафикРаботыСотрудников.НайтиСтроки(Отбор); 
	
	Для Каждого Строка Из НайденныеСтроки Цикл
		Объект.ГрафикРаботыСотрудников.Удалить(Строка); 
	КонецЦикла; 
	
	Для Каждого СтрокаТЧ ИЗ ПроизводственныйГрафик Цикл
		Если СтрокаТЧ.ВремяНачала <> Неопределено И СтрокаТЧ.ВремяОкончания <> Неопределено
			И СтрокаТЧ.ВремяНачала <> NULL И СтрокаТЧ.ВремяОкончания <> NULL Тогда
			НоваяСтрока = Объект.ГрафикРаботыСотрудников.Добавить(); 
			НоваяСтрока.Сотрудник = Сотрудник;
			НоваяСтрока.ВремяНачала = СтрокаТЧ.ВремяНачала;
			НоваяСтрока.ВремяОкончания = ?(СтрокаТЧ.ВремяОкончания = Дата(1, 1, 1, 0, 0, 0), 
			Дата(1, 1, 1, 23, 59, 0), СтрокаТЧ.ВремяОкончания);
			НоваяСтрока.Дата = СтрокаТЧ.Дата;      
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

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

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



&НаСервереБезКонтекста
Функция ПолучитьКалендарь(Год)
	МассивКалендарей = ПолучитьМассивКалендарей(Год); 
	Если МассивКалендарей.Количество() <> 0 Тогда
		Возврат МассивКалендарей[0];
	Иначе 
		Возврат Неопределено;
	КонецЕсли; 
КонецФункции 

&НаСервереБезКонтекста
Функция ПолучитьСписокЗначенийКалендарей(Год)
	СписокКалендарей = Новый СписокЗначений; 
	СписокКалендарей.ЗагрузитьЗначения(ПолучитьМассивКалендарей(Год)); 
	Возврат СписокКалендарей; 
КонецФункции 

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


&НаСервере
Функция ВернутьГодПроизводственногоКалендаря()
	Возврат Объект.ПроизводственныйКалендарь.Год;  
КонецФункции
 

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



&НаКлиенте
Процедура ПроизводственныйКалендарьПриИзмененииНаКлиенте()
	ЗагрузитьТаблицуПроизводственногоКалендаря();
	УправлениеДоступностьюЭлементов();
КонецПроцедуры

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



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

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




&НаСервере
Процедура ДобавитьСоответствиеИмениКолонкиИСотрудника(ИмяКолонки, Сотрудник)
	Отбор = Новый Структура; 
	Отбор.Вставить("Сотрудник", Сотрудник); 
	Отбор.Вставить("ИмяКолонки", ИмяКолонки);
	НайденныеСтроки = Объект.СоответствиеКолонокСотрудников.НайтиСтроки(Отбор); 
	Если НайденныеСтроки.Количество() = 0 Тогда 
		НовоеСоответствиеКолонкиИСотрудника = Объект.СоответствиеКолонокСотрудников.Добавить();  
		НовоеСоответствиеКолонкиИСотрудника.ИмяКолонки = ИмяКолонки;
		НовоеСоответствиеКолонкиИСотрудника.Сотрудник = Сотрудник; 
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьСотрудникаПоИмениКолонки(ИмяКолонки)
	Отбор = Новый Структура("ИмяКолонки", ИмяКолонки); 
	НайденныеСтроки = Объект.СоответствиеКолонокСотрудников.НайтиСтроки(Отбор);
	Если НайденныеСтроки.Количество() > 0 Тогда
		Возврат НайденныеСтроки[0].Сотрудник;		
	КонецЕсли;
	Возврат Справочники.Сотрудники.ПустаяСсылка(); 
КонецФункции  


&НаКлиенте
Процедура СотрудникиПередУдалением(Элемент, Отказ)
	СтрокаСотрудника = Элементы.Сотрудники.ТекущиеДанные;
	Если СтрокаСотрудника <> Неопределено Тогда
		УдалитьСотрудникаКомплексно(СтрокаСотрудника.Сотрудник);
	КонецЕсли;
КонецПроцедуры

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

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




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



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