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