Табель учета рабочего времени / Форма документа альтернативная / Модуль формы

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем ИдентификаторЗамераПроведениеНеНужнаРегистрацияОшибки;

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	ОбработкаДобавленияДанныхСервере(ВыбранноеЗначение);
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура ДатаНачалаПериодаПриИзменении(Элемент)
	Если НачалоМесяца(Объект.ДатаНачалаПериода) <> НачалоМесяца(Объект.ДатаОкончанияПериода) Тогда
		Объект.ДатаОкончанияПериода = КонецМесяца(Объект.ДатаНачалаПериода);
	КонецЕсли;

	ПериодДокументаПриИзменение();
КонецПроцедуры

&НаКлиенте
Процедура ДатаОкончанияПериодаПриИзменении(Элемент)
	Если НачалоМесяца(Объект.ДатаНачалаПериода) <> НачалоМесяца(Объект.ДатаОкончанияПериода) Тогда
		Объект.ДатаОкончанияПериода = КонецМесяца(Объект.ДатаНачалаПериода);
	КонецЕсли;

	ПериодДокументаПриИзменение();
КонецПроцедуры

&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
	ОрганизацияПриИзмененииНаСервере();
КонецПроцедуры

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

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

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

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

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

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

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

// Обработчик подсистемы "ПодписиДокументов".
&НаКлиенте
Процедура Подключаемый_ПодписиДокументовЭлементПриИзменении(Элемент) 
	ПодписиДокументовКлиент.ПриИзмененииПодписывающегоЛица(ЭтаФорма, Элемент.Имя);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПодписиДокументовЭлементНажатие(Элемент) 
	ПодписиДокументовКлиент.РасширеннаяПодсказкаНажатие(ЭтаФорма, Элемент.Имя);
КонецПроцедуры
// Конец Обработчик подсистемы "ПодписиДокументов".

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура УдалитьСтрокуТаблицы(Команда)
	УдалитьТекущуюСтрокуТаблицыПредставления();
КонецПроцедуры

&НаКлиенте
Процедура СортироватьПоВозрастанию(Команда)
	СортироватьПоВозрастаниюНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура СортироватьПоУбыванию(Команда)
	СортироватьПоУбываниюНаСервере();
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

#Область ИсправлениеДокументов

&НаКлиенте
Процедура УстановитьПоляИсправленияНаКлиенте() Экспорт
	
	УстановитьПоляИсправления(ЭтаФорма);

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

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

	ИсправлениеДокументовЗарплатаКадрыКлиентСервер.УстановитьПоляИсправления(Форма, "ПериодическиеСведения");
	
КонецПроцедуры

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

#Область ИнициализацияДанныхФормы

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

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

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

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

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

	СвойстваЗначенийИзмерений = Новый ФиксированноеСоответствие(СвойстваИзмерений);
КонецПроцедуры	

&НаСервере
Процедура ЗаполнитьПостфиксыПолейДанных()
	
	Если ПостфиксыПолейДанных <> Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Постфиксы = Новый Массив(32);
	
	Для Сч = 1 По 31 Цикл
		Постфиксы[Сч] = Строка(Сч);
	КонецЦикла;
	
	ПостфиксыПолейДанных = Новый ФиксированныйМассив(Постфиксы);
	
КонецПроцедуры

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

#Область ПолученияДанныхТабеля

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

&НаСервере
Функция ПродолжитьТекущийИнтервалПоВидуВремени(ОписаниеТекущегоИнтервала, ДанныеОВремениЗаДень)	
	Возврат Ложь;
КонецФункции

&НаСервере
Функция ПродолжитьТекущийИнтервалПоТерриториямУсловиямТруда(ОписаниеТекущегоИнтервала, ДанныеОВремениЗаДень)
	Если ДанныеОВремениЗаДень.ЗначенияИзмерения.Количество() = 1
		И Не ОписаниеТекущегоИнтервала.ИспользуетсяНесколькоЗначенийИзмерения
		И ДанныеОВремениЗаДень.ПорядокЗначенийИзмерения[0] = ОписаниеТекущегоИнтервала.ЗначениеИзмерения Тогда 
		
		ОписаниеТекущегоИнтервала.Длина = ОписаниеТекущегоИнтервала.Длина + 1;	
		
		Если ДанныеОВремениЗаДень.НомерДня < ОписаниеТекущегоИнтервала.НомерПервогоДня Тогда
			ОписаниеТекущегоИнтервала.НомерПервогоДня = ДанныеОВремениЗаДень.НомерДня;
		КонецЕсли;	
	
	    Возврат Истина;
	КонецЕсли;
	
	Возврат Ложь;	
КонецФункции

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

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

#Область ФормированиеПредставленияДанныхТабеля

&НаСервере
Процедура УстановитьВидимостьКолонокПредставления()
	Для Сч = 5 По День(Объект.ДатаНачалаПериода) + 4 Цикл
		ДанныеТабеляПредставление.Область(,Сч, ,Сч).Видимость = Ложь;
	КонецЦикла;	
	
	Для Сч = День(Объект.ДатаНачалаПериода) + 4 По День(Объект.ДатаОкончанияПериода) + 4 Цикл
		ДанныеТабеляПредставление.Область(,Сч, ,Сч).Видимость = Истина;
	КонецЦикла;	
	
	Для Сч = День(Объект.ДатаОкончанияПериода) + 5 По 36 Цикл
		ДанныеТабеляПредставление.Область(,Сч,,Сч).Видимость = Ложь;
	КонецЦикла;
КонецПроцедуры	

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

&НаСервере
Процедура УстановитьЗаголовкиШапкиТаблицыПредставления()
	ТекущаяДата = НачалоМесяца(Объект.ДатаНачалаПериода);
	НомерДня = 1;
	
	Пока ТекущаяДата <= Объект.ДатаОкончанияПериода Цикл
		Область = ДанныеТабеляПредставление.Область(1, 4 + НомерДня, 1, 4 + НомерДня);
		Область.Текст = Формат(ТекущаяДата, "ДФ='дд'"); 
		
		ТекущаяДата = ТекущаяДата + 86400;
		НомерДня = НомерДня + 1;
	КонецЦикла;
	
	Для Сч = НомерДня По 31 Цикл
		Область = ДанныеТабеляПредставление.Область(1, 4 + Сч, 1, 4 + Сч);
		Область.Текст = Формат(ТекущаяДата, "ДФ='дд'"); 
		
		ТекущаяДата = ТекущаяДата + 86400;
	КонецЦикла;	
	
КонецПроцедуры	

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

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

&НаСервере
Процедура ВывестиСтрокуПредставленияДанных(СтрокаТаблицыПредставления, НомерЗамещаемойСтроки = Неопределено) 
	Измерения = ИспользуемыеИзмерения();
	КоличествоИзмерений = Измерения.Количество();
		
	Если НомерЗамещаемойСтроки = Неопределено Тогда
		Для Каждого ИспользуемоеИзмерения Из Измерения Цикл
			ДанныеТабеляПредставление.Вывести(СтрокаТаблицыПредставления[ИспользуемоеИзмерения]);
		КонецЦикла;
		
		НомерПоследнейСтроки = ДанныеТабеляПредставление.ВысотаТаблицы;
		НомерПервойСтроки = НомерПоследнейСтроки - КоличествоИзмерений + 1; 
		
		Область = ДанныеТабеляПредставление.Область(НомерПервойСтроки, 1, НомерПоследнейСтроки, 1);
		Область.Объединить();
		
		Область = ДанныеТабеляПредставление.Область(НомерПервойСтроки, 2, НомерПоследнейСтроки, 2);
		Область.Объединить();
		
		Область = ДанныеТабеляПредставление.Область(НомерПервойСтроки, 3, НомерПоследнейСтроки, 3);
		Область.Объединить();
		
		Область = ДанныеТабеляПредставление.Область(НомерПервойСтроки, 4, НомерПоследнейСтроки, 4);
		Область.Объединить();

	Иначе
		ЗамещаемаяОбласть = ОбластьПредставленияДанныхПоСотруднику(НомерЗамещаемойСтроки);
		ПромежуточныйДокумент = Новый ТабличныйДокумент;
		
		Для Каждого ИспользуемоеИзмерения Из Измерения Цикл
			ПромежуточныйДокумент.Вывести(СтрокаТаблицыПредставления[ИспользуемоеИзмерения]);
		КонецЦикла;
		
		Область = ПромежуточныйДокумент.Область(1, 1, КоличествоИзмерений, 1);
		Область.Объединить();
		
		Область = ПромежуточныйДокумент.Область(1, 2, КоличествоИзмерений, 2);
		Область.Объединить();
		
		Область = ПромежуточныйДокумент.Область(1, 3, КоличествоИзмерений, 3);
		Область.Объединить();
		
		Область = ПромежуточныйДокумент.Область(1, 4, КоличествоИзмерений, 4);
		Область.Объединить();
	
		ВставляемаяОбласть = ПромежуточныйДокумент.Область(1, 1, Измерения.Количество(), 36);
		
		ДанныеТабеляПредставление.ВставитьОбласть(ВставляемаяОбласть, ЗамещаемаяОбласть); 
		
	КонецЕсли;  
	
КонецПроцедуры

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

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

&НаСервере
Процедура ДобавитьСтрокуПредставленияДанныхПоСотруднику(СтрокиДанных, СтрокаТаблицыСмен, ПредставлениеСотрудника, МакетТаблицы)
	Сотрудник = СтрокиДанных[0].Сотрудник;  
	ИдентификаторДанных = СтрокиДанных[0].ИдентификаторДанных;
		
	СтрокаТаблицыПредставления = НоваяСтрокаТаблицыПредставления(МакетТаблицы, Сотрудник, ИдентификаторДанных);
	
	НомерСтроки = КоличествоСтрокТаблицыПредставления() + 1;
	
	УстановитьПредставлениеДанныхТабеляПоСотруднику(СтрокиДанных, СтрокаТаблицыСмен, НомерСтроки, ПредставлениеСотрудника, СтрокаТаблицыПредставления);
	
	ВывестиСтрокуПредставленияДанных(СтрокаТаблицыПредставления);
	
	КоличествоСтрокТаблицыПредставления = КоличествоСтрокТаблицыПредставления + 1;
КонецПроцедуры

&НаСервере
Процедура ОбновитьПредставлениеДанныхПоСотруднику(СтрокиДанныхПоСотруднику, СтрокаТаблицыСмен)
	
	ИдентификаторДанных = СтрокиДанныхПоСотруднику[0].ИдентификаторДанных;
	
	МакетТаблицы = Документы.ТабельУчетаРабочегоВремени.ПолучитьМакет("МакетПредставленияТабеля");
	
	Сотрудник = СтрокиДанныхПоСотруднику[0].Сотрудник;
	
	ПредставлениеСотрудника = ПредставленияСотрудника(Сотрудник);	
	
	СтрокаТаблицыПредставления = НоваяСтрокаТаблицыПредставления(МакетТаблицы, Сотрудник, ИдентификаторДанных);
	
	НомерСтроки = НомерСтрокиПредставленияПоИдентификаторуДанных(ИдентификаторДанных);
	
	УстановитьПредставлениеДанныхТабеляПоСотруднику(СтрокиДанныхПоСотруднику, СтрокаТаблицыСмен, НомерСтроки, ПредставлениеСотрудника, СтрокаТаблицыПредставления);
		
	ВывестиСтрокуПредставленияДанных(СтрокаТаблицыПредставления, НомерСтроки);
	
КонецПроцедуры

&НаСервере
Функция ОбластьПредставленияДанныхПоСотруднику(НомерСтроки)
	КоличествоИзмерений = ИспользуемыеИзмерения().Количество();
		
	НомерПервойСтрокиОбласти = НомерСтроки * КоличествоИзмерений - КоличествоИзмерений + 2;
	НомерПоследнейСтрокиОбласти = НомерПервойСтрокиОбласти + КоличествоИзмерений - 1;
		
	Возврат ДанныеТабеляПредставление.Область(НомерПервойСтрокиОбласти, 1, НомерПоследнейСтрокиОбласти, 36);
	
КонецФункции	

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

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

&НаСервере
Процедура УстановитьПредставлениеИнтервалаПоСмене(СтрокаТаблицыПредставления, ОписаниеТекущегоИнтервала)		
	ПостфиксИмяПоля = ПостфиксыПолейДанных[ОписаниеТекущегоИнтервала.НомерПервогоДня];

	СтрокаТаблицыПредставления.Параметры["Смена" + ПостфиксИмяПоля] = ОписаниеТекущегоИнтервала.ДанныеОВремениЗаДень.ЗначенияИзмерения;
КонецПроцедуры

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

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

&НаСервере
Процедура УстановитьПредставлениеИнтервалаПоТерриториям(СтрокаТаблицыПредставления, ОписаниеТекущегоИнтервала, НумераторИнтервалов)
	
	Представление = "";
	
	СвойстваТерриторийУсловийТруда = СвойстваЗначенияИзмерения(ОписаниеТекущегоИнтервала.ЗначениеИзмерения);
	
	Область = ОбластьИнтервала(СтрокаТаблицыПредставления, ОписаниеТекущегоИнтервала);
	
	Область.Объединить();
	
	ПустаяОбласть = Ложь;
	Если ОписаниеТекущегоИнтервала.Длина = (Объект.ДатаОкончанияПериода - Объект.ДатаНачалаПериода) / 86400 + 1 
		И Не ЗначениеЗаполнено(ОписаниеТекущегоИнтервала.ЗначениеИзмерения) Тогда
		
		Представление = НСтр("ru = 'Территории не заданы'");
		ПустаяОбласть = Истина;
	ИначеЕсли ОписаниеТекущегоИнтервала.ЗначениеИзмерения = Неопределено Тогда
		Представление = "";	
	ИначеЕсли ОписаниеТекущегоИнтервала.ИспользуетсяНесколькоЗначенийИзмерения Тогда
		Представление = СвойстваТерриторийУсловийТруда[ИмяРеквизитаБуквенныйКод] + "...";
		Шрифт = Новый Шрифт(Область.Шрифт,,,Истина);
		Область.Шрифт = Шрифт;	
	Иначе		
		Представление = СвойстваТерриторийУсловийТруда.Представление;	
	КонецЕсли;	
		
	ПостфиксИмяПоля = ПостфиксыПолейДанных[ОписаниеТекущегоИнтервала.НомерПервогоДня]; 
		
	НумераторИнтервалов.Территория = НумераторИнтервалов.Территория + 1;	
	НомерИнтервала = НумераторИнтервалов.Территория;
	
	Если Цел(НомерИнтервала / 2) <> НомерИнтервала / 2 Тогда
		Область.ЦветФона = Новый Цвет(248, 248, 255);
	КонецЕсли;	
	
	Если ПустаяОбласть Тогда
		Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
	КонецЕсли;	
	
	СтрокаТаблицыПредставления.Параметры[ОписаниеТекущегоИнтервала.Измерение + ПостфиксИмяПоля] = Представление;
КонецПроцедуры

&НаСервере
Процедура УстановитьПредставлениеИнтервалаПоУсловиямТруда(СтрокаТаблицыПредставления, ОписаниеТекущегоИнтервала, НумераторИнтервалов)
	
	Представление = "";
	
	СвойстваТерриторийУсловийТруда = СвойстваЗначенияИзмерения(ОписаниеТекущегоИнтервала.ЗначениеИзмерения);
	
	Область = ОбластьИнтервала(СтрокаТаблицыПредставления, ОписаниеТекущегоИнтервала);
	
	Область.Объединить();
	
	ПустаяОбласть = Ложь;
	Если ОписаниеТекущегоИнтервала.Длина = (Объект.ДатаОкончанияПериода - Объект.ДатаНачалаПериода) / 86400 + 1 
		И Не ЗначениеЗаполнено(ОписаниеТекущегоИнтервала.ЗначениеИзмерения) Тогда
		
		Представление = НСтр("ru = 'Условия труда не заданы'");
		ПустаяОбласть = Истина;
	ИначеЕсли ОписаниеТекущегоИнтервала.ЗначениеИзмерения = Неопределено Тогда
		Представление = "";	
	ИначеЕсли ОписаниеТекущегоИнтервала.ИспользуетсяНесколькоЗначенийИзмерения  Тогда
		Представление = СвойстваТерриторийУсловийТруда[ИмяРеквизитаБуквенныйКод] + "...";
		Шрифт = Новый Шрифт(Область.Шрифт,,,Истина);
		Область.Шрифт = Шрифт;
	Иначе		
		Представление = СвойстваТерриторийУсловийТруда.Представление;	
	КонецЕсли;	
	
	ПостфиксИмяПоля = ПостфиксыПолейДанных[ОписаниеТекущегоИнтервала.НомерПервогоДня]; 
		
	НумераторИнтервалов.УсловияТруда = НумераторИнтервалов.УсловияТруда + 1;
	НомерИнтервала = НумераторИнтервалов.УсловияТруда;
	
	Если Цел(НомерИнтервала / 2) <> НомерИнтервала / 2 Тогда
		Область.ЦветФона = Новый Цвет(193, 236, 198);
	КонецЕсли;	
	
	Если ПустаяОбласть Тогда
		Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
	КонецЕсли;	
	
	СтрокаТаблицыПредставления.Параметры[ОписаниеТекущегоИнтервала.Измерение + ПостфиксИмяПоля] = Представление;
КонецПроцедуры

&НаСервере
Функция ПредставлениеИтоговПоСотруднику(ТаблицаИтогов)
	ПредставлениеИтогов = "";
	
	ТаблицаИтогов.Сортировать("Дни УБЫВ, Часы УБЫВ");
		
	Для Каждого СтрокаИтогов Из ТаблицаИтогов Цикл
		БуквенныйКод = СвойстваЗначенияИзмерения(СтрокаИтогов.ВидВремени)[ИмяРеквизитаБуквенныйКод];
		Если СтрокаИтогов.Часы = 0 Тогда
			ИтогиПоВидуВремени = БуквенныйКод + Символы.НПП + Строка(СтрокаИтогов.Дни) + Символы.НПП + НСтр("ru = 'дн.'");
		Иначе
			ИтогиПоВидуВремени = БуквенныйКод + Символы.НПП + Строка(СтрокаИтогов.Дни) + Символы.НПП + НСтр("ru = 'дн.'") + Символы.НПП + Строка(СтрокаИтогов.Часы) + Символы.НПП + НСтр("ru = 'чс.'");
		КонецЕсли;
														
		ПредставлениеИтогов = ПредставлениеИтогов + Символы.ПС + ИтогиПоВидуВремени;
	КонецЦикла;	
	
	ПредставлениеИтогов = Сред(ПредставлениеИтогов, 2);
		
	Возврат ПредставлениеИтогов;	
КонецФункции	
	
&НаСервере
Функция ОбластьИнтервала(СтрокаТаблицыПредставления, ОписаниеИнтервала)	
	НомерПервойКолонки = ОписаниеИнтервала.НомерПервогоДня + 4;
	НомерПоследнейКолонки = НомерПервойКолонки + ОписаниеИнтервала.Длина - 1;
	
	Возврат СтрокаТаблицыПредставления.Область(1, НомерПервойКолонки, 1, НомерПоследнейКолонки);
	
КонецФункции

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

&НаСервере
Функция КоличествоСтрокТаблицыПредставления()
	Возврат КоличествоСтрокТаблицыПредставления;	
КонецФункции	

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

&НаСервере
Процедура ПеренумероватьСтрокиТаблицыПредставления()
	КоличествоСтрок = КоличествоСтрокТаблицыПредставления(); 
	КоличествоИзмерений = ИспользуемыеИзмерения().Количество();
		
	Для НомерСтроки = 1 По КоличествоСтрок Цикл
		Область = ДанныеТабеляПредставление.Область((НомерСтроки - 1) * КоличествоИзмерений + 1, 1, НомерСтроки * КоличествоИзмерений + 1, 1);
		Область.Текст = НомерСтроки;
	КонецЦикла;		
	
КонецПроцедуры	

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

#Область РедактированиеДанныхТабеля

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

&НаСервере
Процедура УдалитьСтрокиТаблицыПредставления(ИдентификаторыУдаляемыхСтрок)
	КоличествоИзмерений = ИспользуемыеИзмерения.Количество();
	
	Для Каждого Идентификатор Из ИдентификаторыУдаляемыхСтрок Цикл
		НомерСтроки = НомерСтрокиПредставленияПоИдентификаторуДанных(Идентификатор);
		
		НомерПервойСтрокиОбласти = НомерСтроки * КоличествоИзмерений - КоличествоИзмерений + 2;
		НомерПоследнейСтрокиОбласти = НомерПервойСтрокиОбласти + КоличествоИзмерений - 1;

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

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

&НаКлиенте
Функция ИдентификаторДанныхИзСтрокиПредставления(Область)
	КоличествоИзмерений = ИспользуемыеИзмерения.Количество();
	
	Если Область.Низ = 1 Тогда
		Возврат Неопределено;
	КонецЕсли;	
	
	НомерСтроки = НомерСтрокиПредставления(Область);
	
	Если НомерСтроки > КоличествоСтрокТаблицыПредставления() Тогда
		Возврат Неопределено;
	КонецЕсли;	
	
	НомерСтрокиОбласти = НомерСтроки * КоличествоИзмерений + 1;
	
	Возврат ДанныеТабеляПредставление.Область(НомерСтрокиОбласти, 36, НомерСтрокиОбласти, 36).Значение;
	
КонецФункции

&НаКлиенте
Функция НомерСтрокиПредставления(Область)
	КоличествоИзмерений = ИспользуемыеИзмерения.Количество();
	
	Если Область.Низ = 1 Тогда
		Возврат Неопределено;
	КонецЕсли;	
	
	Если (Область.Низ - 1) % КоличествоИзмерений = 0 Тогда
		НомерСтроки = Цел((Область.Низ - 1) / КоличествоИзмерений);	
	Иначе	
		НомерСтроки = Цел((Область.Низ - 1) / КоличествоИзмерений) + 1;
	КонецЕсли;	
		
	Возврат НомерСтроки;
КонецФункции

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

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

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

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

#Область ИзменениеЗаполнениеДанныхТабеля

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

&НаСервере
Процедура ДобавитьДанныеТабеляПоСотрудникам(СписокСотрудников)

	ДобавленныеСтрокиДанных = Новый Массив;
	ДобавляемыеСтрокиСмен = Новый Массив;

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

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

&НаСервере
Процедура УдалитьСтрокиДанныхТабеля(УдаляемыеСтроки, УдаляемаяСтрокаТаблицыСмен)	
	Для Каждого СтрокаДанных Из УдаляемыеСтроки Цикл	
		Объект.ДанныеОВремени.Удалить(СтрокаДанных);
	КонецЦикла;	
	
	Если УдаляемаяСтрокаТаблицыСмен <> Неопределено Тогда
		Объект.Смены.Удалить(УдаляемаяСтрокаТаблицыСмен);
	КонецЕсли;	
	
	ПослеУдаленияСтрокДанныхТабеля(УдаляемыеСтроки);
КонецПроцедуры	

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

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

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

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

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

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

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

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

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

#Область РеализацияСвязиПредставленияСДанными

&НаСервере
Процедура ПослеДобавленииСтрокВДанныеТабеля(ДобавленныеСтрокиДанных, ДобавляемыеСтрокиСмен)
	УстановитьИдентификаторыСтрокаДанныхТабеля(ДобавленныеСтрокиДанных, ДобавляемыеСтрокиСмен);	
	ВывестиПредставлениеДанныхТабеля(ДобавленныеСтрокиДанных, ДобавляемыеСтрокиСмен);	
КонецПроцедуры	

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

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

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

&НаСервере
Процедура УстановитьИдентификаторыСтрокаДанныхТабеля(ДобавленныеСтрокиДанных, ДобавляемыеСтрокиСмен)
	ИдентификаторыСтрокПоСотрудникам = Новый Соответствие;

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

&НаСервере                                                                            
Процедура ПослеДобавленииДопСтрокиДанныхПоСотруднику(СуществующиеСтроки, ДобавленнаяСтрока)
	ДобавленнаяСтрока.ИдентификаторДанных = СуществующиеСтроки[0].ИдентификаторДанных;		
КонецПроцедуры	

&НаСервере
Процедура ПослеОчисткеДанныхТабеля()
	ОчиститьТаблицуПредставления();
КонецПроцедуры

&НаСервере
Процедура УдалитьСтрокиДанныхПоИдентификаторуДанных(ИдентификаторДанных)
	УдаляемыеСтроки = СтрокиДанныхПоИдентификаторуДанных(ИдентификаторДанных);
	УдаляемаяСтрокаТаблицыСмен = СтрокаТаблицыСменПоИдентификаторуДанных(ИдентификаторДанных);
	
	УдалитьСтрокиДанныхТабеля(УдаляемыеСтроки, УдаляемаяСтрокаТаблицыСмен);
КонецПроцедуры	

&НаСервере
Функция СтрокиДанныхПоИдентификаторуДанных(ИдентификаторДанных)	
	Возврат Объект.ДанныеОВремени.НайтиСтроки(Новый Структура("ИдентификаторДанных", ИдентификаторДанных));
КонецФункции	

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

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

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

#Область Прочее

&НаСервере
Функция ИспользуемыеИзмерения()
	Если ИспользуемыеИзмерения = Неопределено Тогда
		УстановитьИспользуемыеИзмерения();
	КонецЕсли;
	
	Возврат ИспользуемыеИзмерения;
КонецФункции	

&НаСервере
Функция ПредставленияСотрудников(МассивСотрудников)
	Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивСотрудников, "Наименование, Код");		
КонецФункции

&НаСервере
Функция ПредставленияСотрудника(Сотрудник)
	МассивСотрудников = Новый Массив;
	МассивСотрудников.Добавить(Сотрудник);
	
	ПредставленияСотрудников = ПредставленияСотрудников(МассивСотрудников);
	
	Возврат ПредставленияСотрудников[Сотрудник];		
КонецФункции

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

	Возврат ЗначенияСвойств;
КонецФункции	

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

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

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

&НаСервере
Процедура ПодразделениеПриИзмененииНаСервере()
	ОчиститьДанныеТабеля();
КонецПроцедуры

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

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



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

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

#Область ОбработчикиСобытийПроцессыОбработкиДокументов

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

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

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

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

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

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






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