#Область ОписаниеПеременных
&НаКлиенте
Перем ИдентификаторЗамераПроведениеНеНужнаРегистрацияОшибки;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПодписиДокументов.ПриСозданииНаСервере(ЭтаФорма);
Если ПолучитьФункциональнуюОпцию("РаботаВБюджетномУчреждении") Тогда
ТекстЗаголовка = НСтр("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).Значение;
Если ИдентификаторДанныхТекущейСтроки = ИдентификаторДанных Тогда
ПродолжатьПоиск = Ложь;
КонецЕсли;
КонецЦикла;
Возврат НомерСтроки;
КонецФункции
#КонецОбласти
#Область Прочее
&НаСервере
Функция ИспользуемыеИзмерения()
Если ИспользуемыеИзмерения = Неопределено Тогда
УстановитьИспользуемыеИзмерения();
КонецЕсли;
Возврат ИспользуемыеИзмерения;
КонецФункции
&НаСервере
Функция ПредставленияСотрудников(МассивСотрудников)
Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивСотрудников, "Наименование, Код");
КонецФункции
&НаСервере
Функция ПредставленияСотрудника(Сотрудник)
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(Сотрудник);
ПредставленияСотрудников = ПредставленияСотрудников(МассивСотрудников);
Возврат ПредставленияСотрудников[Сотрудник];
КонецФункции
&НаСервере
Функция СвойстваЗначенияИзмерения(ЗначениеИзмерения)
ЗначенияСвойств = СвойстваЗначенийИзмерений.Получить(ЗначениеИзмерения);
Если ЗначенияСвойств = Неопределено Тогда
ОбновляемыеЗначения = Новый Массив;
ОбновляемыеЗначения.Добавить(ЗначениеИзмерения);
ЗакэшироватьСвойстваЗначенийИзмеренийУчетаВремени(ОбновляемыеЗначения);
ЗначенияСвойств = СвойстваЗначенийИзмерений.Получить(ЗначениеИзмерения);
КонецЕсли;
Возврат ЗначенияСвойств;
КонецФункции
&НаСервере
Функция АдресСпискаПодобранныхСотрудников()
Возврат ПоместитьВоВременноеХранилище(Объект.ДанныеОВремени.Выгрузить(,"Сотрудник").ВыгрузитьКолонку("Сотрудник"), УникальныйИдентификатор);
КонецФункции
&НаСервере
Процедура ЗаполнитьДанныеФормыПоОрганизации()
Если НЕ ЗначениеЗаполнено(Объект.Организация) Тогда
Возврат;
КонецЕсли;
ПодписиДокументов.ЗаполнитьПодписиПоОрганизации(ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура ОрганизацияПриИзмененииНаСервере()
УстановитьИспользуемыеИзмерения();
ЗаполнитьДанныеФормыПоОрганизации();
ОчиститьДанныеТабеля();
КонецПроцедуры
&НаСервере
Процедура ПодразделениеПриИзмененииНаСервере()
ОчиститьДанныеТабеля();
КонецПроцедуры
&НаСервере
Процедура ПериодВводаДанныхОВремениПриИзмененииНаСервере()
УстановитьДоступностьЭлементовПериодаВводаДанных();
ПериодДокументаПриИзменение();
КонецПроцедуры
&НаСервере
Процедура ПериодДокументаПриИзменение() Экспорт
УчетРабочегоВремениРасширенныйКлиентСервер.ТабельУстановитьПериодДокумента(ЭтотОбъект);
УстановитьВидимостьКолонокПредставления();
УстановитьЗаголовкиШапкиТаблицыПредставления();
ОбновитьПредставлениеДанных();
Если Объект.ПериодВводаДанныхОВремени <> Перечисления.ПериодыВводаДанныхОВремени.ПрошлыйПериод Тогда
ОчиститьДанныеТабеля();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область ОбработчикиСобытийПроцессыОбработкиДокументов
&НаКлиенте
Процедура Подключаемый_ВыполнитьЗадачуПоОбработкеДокумента(Команда)
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ЗарплатаКадрыПриложения.ПроцессыОбработкиДокументовЗарплата") Тогда
МодульПроцессыОбработкиДокументовЗарплата = ОбщегоНазначенияКлиент.ОбщийМодуль("ПроцессыОбработкиДокументовЗарплатаКлиент");
МодульПроцессыОбработкиДокументовЗарплата.ВыполнитьЗадачу(ЭтотОбъект, Команда, Объект)
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьЗадачуПоОбработкеДокументаОповещение(Контекст, ДополнительныеПараметры) Экспорт
ВыполнитьЗадачуПоОбработкеДокументаНаСервере(Контекст);
ВыполнитьОбработкуОповещения(ДополнительныеПараметры, Контекст);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьЗадачуПоОбработкеДокументаНаСервере(Контекст)
Если ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыПриложения.ПроцессыОбработкиДокументовЗарплата") Тогда
МодульПроцессыОбработкиДокументовЗарплата = ОбщегоНазначения.ОбщийМодуль("ПроцессыОбработкиДокументовЗарплата");
МодульПроцессыОбработкиДокументовЗарплата.ВыполнитьЗадачу(ЭтотОбъект, Контекст, Объект);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_КомментарийНаправившегоОткрытие(Элемент, СтандартнаяОбработка)
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ЗарплатаКадрыПриложения.ПроцессыОбработкиДокументовЗарплата") Тогда
МодульПроцессыОбработкиДокументовЗарплата = ОбщегоНазначенияКлиент.ОбщийМодуль("ПроцессыОбработкиДокументовЗарплатаКлиент");
МодульПроцессыОбработкиДокументовЗарплата.КомментарийНаправившегоОткрытие(ЭтотОбъект, Элемент, СтандартнаяОбработка);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_КомментарийСледующемуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ЗарплатаКадрыПриложения.ПроцессыОбработкиДокументовЗарплата") Тогда
МодульПроцессыОбработкиДокументовЗарплата = ОбщегоНазначенияКлиент.ОбщийМодуль("ПроцессыОбработкиДокументовЗарплатаКлиент");
МодульПроцессыОбработкиДокументовЗарплата.КомментарийСледующемуНачалоВыбора(ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка);
КонецЕсли;
КонецПроцедуры
#КонецОбласти