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