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

файл

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

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

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

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

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

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

&НаКлиенте
Процедура ВидГрафикаПриИзменении(Элемент)
	ВидГрафикаПриИзмененииНаСервере();
КонецПроцедуры

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

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

&НаКлиенте
Процедура НеполноеРабочееВремяПереключательПриИзменении(Элемент)
	НеполныйРабочийДень = Ложь;
	СокращеннаяРабочаяНеделя = Ложь;
	Если НеполноеРабочееВремяПереключатель = 1 Тогда
		НеполныйРабочийДень = Истина;
	ИначеЕсли НеполноеРабочееВремяПереключатель = 2 Тогда
		СокращеннаяРабочаяНеделя = Истина;
	Иначе
		СокращеннаяРабочаяНеделя = Ложь;
		НеполныйРабочийДень = Ложь;
	КонецЕсли;	
				
КонецПроцедуры

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

&НаКлиенте
Процедура СпособОпределенияНормыСуммированногоУчетаПриИзменении(Элемент)
	УстановитьДоступностьГрафикаНормыПриСуммированномУчете(ЭтаФорма);
КонецПроцедуры

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

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

&НаКлиенте
Процедура СписокВидовВремениИспользоватьПриИзменении(Элемент)
	ИспользованиеВидаВремениПриИзмененииНаСервере(Элементы.СписокВидовВремени.ТекущаяСтрока);	
КонецПроцедуры

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

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

&НаКлиенте
Процедура РасписаниеРаботыДеньПриИзменении(Элемент)
	ДанныеТекущейСтроки = Элементы.РасписаниеРаботы.ТекущиеДанные;
	ДанныеТекущейСтроки.НомерДняПредставление = ПредставленияДняЦикла(ДанныеТекущейСтроки.НомерДняЦикла, СпособЗаполнения);	
КонецПроцедуры

&НаКлиенте
Процедура РасписаниеРаботыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	Если НоваяСтрока Тогда
		ДанныеТекущейСтроки = Элементы.РасписаниеРаботы.ТекущиеДанные;
		ДанныеТекущейСтроки.НомерДняЦикла = РасписаниеРаботы.Количество();
		ДанныеТекущейСтроки.НомерДняПредставление = ПредставленияДняЦикла(ДанныеТекущейСтроки.НомерДняЦикла, СпособЗаполнения)
	КонецЕсли;	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура Готово(Команда)
	СохранитьИЗакрыть();	
КонецПроцедуры

&НаКлиенте
Процедура Отмена(Команда)
	Модифицированность = Ложь;
	Закрыть();
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьРасписаниеИзРежимаРаботы(Команда)
	ЗаполнитьРасписаниеИзРежимаРаботыНаСервере();
КонецПроцедуры

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьЭлементовНеполногоРабочегоВремени(Форма)

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьЭлементовСуммированногоУчета(Форма)

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьГрафикаНормыПриСуммированномУчете(Форма);

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

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

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

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

	КонецЕсли;	
		
КонецПроцедуры	

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ПредставленияДняЦикла(НомерДня, СпособЗаполнения)
	Если СпособЗаполнения = ПредопределенноеЗначение("Перечисление.СпособыЗаполненияГрафиковРаботыСотрудников.ПоНеделям") Тогда
		Возврат Формат(НачалоНедели('20100101') + (НомерДня - 1) * 86400, "ДФ=ддд");
	Иначе
		Возврат Формат(НомерДня, "ЧГ=");
	КонецЕсли;	
КонецФункции	

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

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

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

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

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

	Возврат ПараметрыЗаполненияГрафика;
	
КонецФункции	

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьПереключательНеполногоРабочегоВремени(Форма)
	Если Форма.НеполноеРабочееВремя Тогда
		Если Форма.НеполныйРабочийДень Тогда
			Форма.НеполноеРабочееВремяПереключатель = 1;
		ИначеЕсли Форма.СокращеннаяРабочаяНеделя Тогда  
			Форма.НеполноеРабочееВремяПереключатель = 2;
		КонецЕсли;	
		Если Форма.НеполноеРабочееВремяПереключатель = 0 Тогда
			Форма.НеполноеРабочееВремяПереключатель = 1;
		КонецЕсли;	
		Если Форма.НеполноеРабочееВремяПереключатель = 1 Тогда
			Форма.НеполныйРабочийДень = Истина;
		Иначе
			Форма.СокращеннаяРабочаяНеделя = Истина;
		КонецЕсли;
	Иначе
		Форма.НеполноеРабочееВремяПереключатель = 0;
		Форма.СокращеннаяРабочаяНеделя = Ложь;
		Форма.НеполныйРабочийДень = Ложь;
	КонецЕсли;		
КонецПроцедуры	

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

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

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

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

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

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