///////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ
&НаКлиенте
// Процедура обработчик события Выбор строки таблицы ПериодыРаботы
//
Процедура ПериодыРаботыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КомандаДобавитьВВыбранные(Неопределено);
КонецПроцедуры
&НаКлиенте
// Процедура обработчик события Выбор строки таблицы ВыбранныеПериоды
//
Процедура ВыбранныеПериодыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КомандаУдалитьИзВыбранных(Неопределено);
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик события Выбор Таблицы ГрафикПериодовРаботы.
//
Процедура ГрафикПериодовРаботыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Сред(Поле.Имя, 1, 18) <> "ТаблицаГрафикаДень" Или ГрафикПериодовРаботы.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Если ГрафикПериодовРаботы.Количество() >0 Тогда Предупреждение("Не заполнен график!"); Возврат; КонецЕсли; перед ЗаписиРегистра = РегистрыСведений.ВремяРаботыСотрудниковПлан.СоздатьНаборЗаписей();
ТекущаяСтрока = Элементы.ГрафикПериодовРаботы.ТекущиеДанные;
ДобавитьПериодРаботыСотруднику(ТекущаяСтрока.Сотрудник, ТекущаяСтрока.Должность, Число(Сред(Поле.Имя, 19)));
МодифицированностьГрафикаРаботы = Истина;
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик изменения реквизита СтруктурнаяЕдиница.
//
Процедура СтруктурнаяЕдиницаПриИзменении(Элемент)
//Заполняем периоды работы для текущей структурной единицы из справочника.
ПериодыРаботы.Параметры.УстановитьЗначениеПараметра("СтруктурнаяЕдиница", Объект.СтруктурнаяЕдиница);
ДеревоСотрудников.Параметры.УстановитьЗначениеПараметра("СтруктурнаяЕдиница", Объект.СтруктурнаяЕдиница);
ПрочитатьГрафикРаботыИзРегистра();
КонецПроцедуры
&НаСервере
// Процедура - обработчик события ПриСозданииНаСервере формы.
//
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Объект.СтруктурнаяЕдиница) Тогда
Объект.СтруктурнаяЕдиница = ПараметрыСеанса.ТекущаяСтруктурнаяЕдиница;
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.Период) Тогда
Объект.Период = НачалоМесяца(ТекущаяДата());
ПериодПредставление = Формат(Объект.Период, "ДФ='MMMM yyyy'");
КонецЕсли;
ПериодыРаботы.Параметры.УстановитьЗначениеПараметра("СтруктурнаяЕдиница", Объект.СтруктурнаяЕдиница);
ДеревоСотрудников.Параметры.УстановитьЗначениеПараметра("СтруктурнаяЕдиница", Объект.СтруктурнаяЕдиница);
ДеревоСотрудников.Параметры.УстановитьЗначениеПараметра("НачалоМесяца", НачалоМесяца(Объект.Период));
ПредСтруктурнаяЕдиница = ПараметрыСеанса.ТекущаяСтруктурнаяЕдиница;
ПрочитатьГрафикРаботыИзРегистра();
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик события НачалоВыбораИзСписка поля ввода ПериодПредставление.
//
Процедура ПериодПредставлениеНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КопияПериод = Объект.Период;
КопияПериодПредставление = ПериодПредставление;
РаботаСДиалогами.ВыбратьПериодИзСпискаПредставлений(ЭтаФорма, Элемент, Объект.Период, ПериодПредставление, ?(ЗначениеЗаполнено(Объект.Период), Неопределено, НачалоМесяца(ТекущаяДата())));
СохранятьИзменения = ВыводДиалогаОСохраненииИзменения();
Если СохранятьИзменения = Неопределено Тогда
Объект.Период = КопияПериод;
ПериодПредставление = КопияПериодПредставление;
Возврат;
ИначеЕсли СохранятьИзменения = Истина Тогда
СохранитьИзменения(КопияПериод);
КонецЕсли;
ДеревоСотрудников.Параметры.УстановитьЗначениеПараметра("НачалоМесяца", НачалоМесяца(Объект.Период));
ПрочитатьГрафикРаботыИзРегистра();
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик события ПередЗакрытием формы.
//
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
СохранятьИзменения = ВыводДиалогаОСохраненииИзменения();
Если СохранятьИзменения = Неопределено Тогда
Отказ = Истина;
ИначеЕсли СохранятьИзменения = Истина Тогда
СохранитьИзменения(Объект.Период);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик события ПриАктивизацииСтроки реквизита ДеревоСотрудников.
//
Процедура ДеревоСотрудниковПриАктивизацииСтроки(Элемент)
Если Элементы.ДеревоСотрудников.ВыделенныеСтроки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ВыделенныйЭлемент = Элементы.ДеревоСотрудников.ВыделенныеСтроки[0];
ЗначениеФильтра = ?(ТипЗнч(ВыделенныйЭлемент) = Тип("СтрокаГруппировкиДинамическогоСписка"), ВыделенныйЭлемент.Ключ, ВыделенныйЭлемент);
Если ТипЗнч(ЗначениеФильтра) = Тип("СправочникСсылка.Сотрудники") Тогда
Элементы.ГрафикПериодовРаботы.ОтборСтрок = Новый ФиксированнаяСтруктура("Сотрудник", ЗначениеФильтра);
ИначеЕсли ТипЗнч(ЗначениеФильтра) = Тип("СправочникСсылка.Должности") Тогда
Элементы.ГрафикПериодовРаботы.ОтборСтрок = Новый ФиксированнаяСтруктура("Должность", ЗначениеФильтра);
Иначе
//Элементы.ГрафикПериодовРаботы.ОтборСтрок = Неопределено;
Элементы.ГрафикПериодовРаботы.ОтборСтрок = Новый ФиксированнаяСтруктура("СтруктурнаяЕдиница", Объект.СтруктурнаяЕдиница);
КонецЕсли;
ПечататьДок();
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик события "Выбор" реквизита ДеревоСотрудников.
//
Процедура ДеревоСотрудниковВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Элементы.ДеревоСотрудников.ВыделенныеСтроки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ВыделенныйЭлемент = Элементы.ДеревоСотрудников.ВыделенныеСтроки[0];
Если ТипЗнч(ВыделенныйЭлемент) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик события "ПередУдалением" реквизита "ГрафикПериодовРаботы".
//
Процедура ГрафикПериодовРаботыПередУдалением(Элемент, Отказ)
Отказ = Истина;
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик события "ПередНачаломДобавления" реквизита "ГрафикПериодовРаботы".
//
Процедура ГрафикПериодовРаботыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
Отказ = Истина;
КонецПроцедуры
&НаКлиенте
//Процедура - обработчик события "ОбработкаЗаписиНового"
//
Процедура ПериодыРаботыОбработкаЗаписиНового(НовыйОбъект, Источник, СтандартнаяОбработка)
Элементы.ПериодыРаботы.Обновить();
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик события "НачалоВыбора" реквизита "ПроизвольныйПериодПредставление".
//
Процедура ПроизвольныйПериодПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Список выбора даты начала
СписокВеремени = ОбщегоНазначенияКлиентПовтИсп.ВыбратьСменуПоСтруктурнойЕдинице(СтандартнаяОбработка, Объект.СтруктурнаяЕдиница, Истина);
ВыбранноеВремя = ВыбратьИзСписка(СписокВеремени, Элемент);
Если ВыбранноеВремя = Неопределено Тогда
Возврат;
КонецЕсли;
ПроизвольныйПериодНачалоСмены = ВыбранноеВремя.Значение;
ПроизвольныйПериодПредставление = Формат(ПроизвольныйПериодНачалоСмены, "ДФ=ЧЧ:мм; ДП=00:00") + " - " + Формат(ПроизвольныйПериодОкончаниеСмены, "ДФ=ЧЧ:мм; ДП=24:00");
// Список выбора даты окончания
СписокВеремени = ОбщегоНазначенияКлиентПовтИсп.ВыбратьСменуПоСтруктурнойЕдинице(СтандартнаяОбработка, Объект.СтруктурнаяЕдиница, Ложь);
ВыбранноеВремя = ВыбратьИзСписка(СписокВеремени, Элемент);
Если ВыбранноеВремя = Неопределено Тогда
Возврат;
КонецЕсли;
ПроизвольныйПериодОкончаниеСмены = ВыбранноеВремя.Значение;
ПроизвольныйПериодПредставление = Формат(ПроизвольныйПериодНачалоСмены, "ДФ=ЧЧ:мм; ДП=00:00") + " - " + Формат(ПроизвольныйПериодОкончаниеСмены, "ДФ=ЧЧ:мм; ДП=24:00");
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик события "Очистка" реквизита "ПроизвольныйПериодПредставление".
//
Процедура ПроизвольныйПериодПредставлениеОчистка(Элемент, СтандартнаяОбработка)
ПроизвольныйПериодНачалоСмены = Неопределено;
ПроизвольныйПериодОкончаниеСмены = Неопределено;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ КОМАНД
&НаКлиенте
// Процедура вызывается при нажатии кнопки "ДобавитьВВыбранные" формы.
//
Процедура КомандаДобавитьВВыбранные(Команда)
ТекущаяСтрока = Элементы.ПериодыРаботы.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ВремяНачалоСмены = Дата(01,01,01)+(ТекущаяСтрока.НачалоСмены - НачалоДня(ТекущаяСтрока.НачалоСмены));
ВремяОкончанияСмены = Дата(01,01,01)+(ТекущаяСтрока.ОкончаниеСмены - НачалоДня(ТекущаяСтрока.ОкончаниеСмены));
ПараметрыОтбора = Новый Структура("НачалоСмены, ОкончаниеСмены", ВремяНачалоСмены, ВремяОкончанияСмены);
Если ВыбранныеПериоды.НайтиСтроки(ПараметрыОтбора).Количество() = 0 Тогда
НоваяСтрока = ВыбранныеПериоды.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекущаяСтрока);
ВыбранныеПериоды.Сортировать("НачалоСмены, ОкончаниеСмены Убыв");
КонецЕсли;
Элементы.ПериодыРаботы.ТекущаяСтрока = Неопределено;
КонецПроцедуры
&НаКлиенте
// Процедура вызывается при нажатии кнопки "ДобавитьВВыбранные" формы.
//
Процедура КомандаДобавитьВВыбранныеПроизвольныйПериод(Команда)
Если Не ЗначениеЗаполнено(ПроизвольныйПериодНачалоСмены) И Не ЗначениеЗаполнено(ПроизвольныйПериодОкончаниеСмены) Тогда
Возврат;
КонецЕсли;
ПараметрыОтбора = Новый Структура("НачалоСмены, ОкончаниеСмены", ПроизвольныйПериодНачалоСмены, ПроизвольныйПериодОкончаниеСмены);
Если ВыбранныеПериоды.НайтиСтроки(ПараметрыОтбора).Количество() = 0 Тогда
НоваяСтрока = ВыбранныеПериоды.Добавить();
НоваяСтрока.НачалоСмены = ПроизвольныйПериодНачалоСмены;
НоваяСтрока.ОкончаниеСмены = ПроизвольныйПериодОкончаниеСмены;
ВыбранныеПериоды.Сортировать("НачалоСмены, ОкончаниеСмены Убыв");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
// Процедура вызывается при нажатии кнопки "УдалитьВВыбранные" формы.
//
Процедура КомандаУдалитьИзВыбранных(Команда)
ТекущаяСтрока = Элементы.ВыбранныеПериоды.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ВыбранныеПериоды.Удалить(ТекущаяСтрока);
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик команды СохранитьИЗакрыть.
//
Процедура СохранитьИЗакрыть(Команда)
СохранитьИзменения(Объект.Период);
Если ЭтаФорма.Открыта() Тогда
Закрыть();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
// Процедура - обработчик команды СохранитьИЗакрыть.
//
Процедура ВызватьМастерЗаполнения(Команда)
МассивИндексовСотрудников = Элементы.ГрафикПериодовРаботы.ВыделенныеСтроки;
МассивСотрудников = Новый Массив;
Для Каждого Индекс Из МассивИндексовСотрудников Цикл
МассивСотрудников.Добавить(ГрафикПериодовРаботы.НайтиПоИдентификатору(Индекс).Сотрудник);
КонецЦикла;
ФормаМастера = ПолучитьФорму("Обработка.ГрафикРаботыСотрудников.Форма.МастерЗаполнения",
Новый Структура("СтруктурнаяЕдиница, МассивИндексовСотрудников, МассивСотрудников, Период",
Объект.СтруктурнаяЕдиница, МассивИндексовСотрудников, МассивСотрудников, Объект.Период));
АдресВременногоХранилища = ФормаМастера.ОткрытьМодально();
Если АдресВременногоХранилища <> Неопределено Тогда
ДобавитьВГрафик(АдресВременногоХранилища);
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////
// ОБЩИЕ ПРОЦЕДУРЫ
&НаКлиенте
// Процедура добавляет выбранные периоды работы в таблицу ГрафикПериодовРаботы
//
Процедура ДобавитьПериодРаботыСотруднику(Сотрудник, Должность, НомерДня, УстановитьПериодыРаботы = Неопределено)
Если УстановитьПериодыРаботы = Неопределено Тогда
//УстановитьПериодыРаботы = ВыбранныеПериоды;
Если Элементы.ГрафикПериодовРаботы.ТекущийЭлемент.Имя <> "ГрафикПериодовРаботыСотрудник" Тогда
НомерКолонки = Сред(Элементы.ГрафикПериодовРаботы.ТекущийЭлемент.Имя,19, СтрДлина(Элементы.ГрафикПериодовРаботы.ТекущийЭлемент.Имя));
ДатаДня = НачалоМесяца(Объект.Период) + (Число(НомерКолонки) - 1) * 60 * 60 * 24;
УстановитьПериодыРаботы = ПроверкаПериодовРаботы(ДеньНедели(ДатаДня));
КонецЕсли;
КонецЕсли;
ЕстьЗаписи = ОбщегоНазначения.ПроверитьНаличиеПредварительнойЗаписи(Сотрудник, НачалоМесяца(Объект.Период) + (НомерДня- 1)*60*60*24, УстановитьПериодыРаботы, Объект.СтруктурнаяЕдиница);
Если ЕстьЗаписи Тогда
Сообщить("Для сотрудника "+Сотрудник+" на "+Формат(НачалоМесяца(Объект.Период) + (НомерДня- 1)*60*60*24, "ДЛФ=ДД")+
" есть предварительные записи, график не может быть изменен.");
Возврат;
КонецЕсли;
ЕстьЗанятость = ОбщегоНазначения.ПроверитьЗанятостьСотрудника(УстановитьПериодыРаботы, Сотрудник, объект.СтруктурнаяЕдиница, Объект.Период + (НомерДня - 1) * 24 * 60 * 60);
Если ЕстьЗанятость Тогда
Сообщить("Сотрудник "+Сотрудник+" уже работает в этот период в другой структурной единице!");
Возврат;
КонецЕсли;
//Очищаем периоды в графике периодов
ПараметрыОтбора = Новый Структура("Сотрудник", Сотрудник);
СтрокаГрафикаРаботы = ГрафикПериодовРаботы.НайтиСтроки(ПараметрыОтбора);
СтрокаГрафикаРаботы[0]["День" + НомерДня] = Неопределено;
//объединим пересекающиеся периоды
Если ОбщегоНазначения.ПроверитьДатуУвольнения(Сотрудник, НачалоМесяца(Объект.Период) + (НомерДня- 1)*60*60*24, Объект.СтруктурнаяЕдиница) Тогда
Сообщить("Сотрудник уволен из организации "+Объект.СтруктурнаяЕдиница+" дата. Установка рабочего времени невозможна!");
Возврат;
КонецЕсли;
//Заполняем день графика работы выбранными периодами
Для Каждого СтрокаПериодРаботы Из УстановитьПериодыРаботы Цикл
ПериодСтруктура = Новый Структура("НачалоСмены, ОкончаниеСмены",
Объект.Период + (НомерДня - 1) * 24 * 60 * 60 +(СтрокаПериодРаботы.НачалоСмены - Дата(01, 01, 01)),
Объект.Период + (НомерДня - 1) * 24 * 60 * 60 +(СтрокаПериодРаботы.ОкончаниеСмены - Дата(01, 01, 01)));
СтрокаГрафикаРаботы[0]["День" + НомерДня].Добавить(ПериодСтруктура, Формат(ПериодСтруктура.НачалоСмены, "ДФ='ЧЧ:мм'") + " - " + Формат(ПериодСтруктура.ОкончаниеСмены, "ДФ='ЧЧ:мм'"));
КонецЦикла;
КонецПроцедуры
&НаСервере
//Функция - проверяет периоды работы на соответствие с периодами работы структурной единицы
//
Функция ПроверкаПериодовРаботы(ДеньНедели)
МассивПериодов = Новый Массив;
ТаблицаПериодов = РеквизитФормыВЗначение(Элементы.ВыбранныеПериоды.Имя);
а = 0;
Пока а < ТаблицаПериодов.Количество() Цикл
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВложенныйЗапрос.НачалоРаботы,
| ВложенныйЗапрос.ОкончаниеРаботы
|ИЗ
| (ВЫБРАТЬ
| РасписаниеРаботы.НачалоРаботы КАК НачалоРаботы,
| ВЫБОР
| КОГДА РасписаниеРаботы.ОкончаниеРаботы = &ПустаяДата
| ТОГДА &ДатаОкончания
| ИНАЧЕ РасписаниеРаботы.ОкончаниеРаботы
| КОНЕЦ КАК ОкончаниеРаботы
| ИЗ
| Справочник.СтруктурныеЕдиницы.РасписаниеРаботы КАК РасписаниеРаботы
| ГДЕ
| РасписаниеРаботы.Активность = ИСТИНА
| И ДЕНЬНЕДЕЛИ(РасписаниеРаботы.ДеньНедели) = &ДеньНедели) КАК ВложенныйЗапрос
|ГДЕ
| ВложенныйЗапрос.НачалоРаботы <= &НачалоРаботы
| И ВложенныйЗапрос.ОкончаниеРаботы >= &ОкончаниеРаботы");
Запрос.УстановитьПараметр("СтруктурнаяЕдиница", Объект.СтруктурнаяЕдиница);
Запрос.УстановитьПараметр("НачалоРаботы",ТаблицаПериодов[а].НачалоСмены);
Запрос.УстановитьПараметр("ОкончаниеРаботы", ТаблицаПериодов[а].ОкончаниеСмены);
Запрос.УстановитьПараметр("ПустаяДата", Дата(01,01,01));
Запрос.УстановитьПараметр("ДатаОкончания",Дата(01,01,01,23,59,59));
Запрос.УстановитьПараметр("ДеньНедели", Число(ДеньНедели));
Результат = Запрос.Выполнить().Выгрузить();
Если Результат.Количество() = 0 Тогда
ТаблицаПериодов.Удалить(а);
а = а - 1;
КонецЕсли;
а = а + 1;
КонецЦикла;
ТаблицаПериодов.Сортировать("НачалоСмены Возр");
а = 0;
Пока а < ТаблицаПериодов.Количество()-1 Цикл
Если ТаблицаПериодов[а].ОкончаниеСмены >= ТаблицаПериодов[а+1].НачалоСмены Тогда
Если ТаблицаПериодов[а].ОкончаниеСмены >= ТаблицаПериодов[а+1].ОкончаниеСмены Тогда
ТаблицаПериодов.Удалить(а+1);
Иначе
ТаблицаПериодов[а].ОкончаниеСмены = ТаблицаПериодов[а+1].ОкончаниеСмены;
ТаблицаПериодов.Удалить(а+1);
КонецЕсли;
Иначе
а=а+1;
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаТП из ТаблицаПериодов Цикл
Структура = Новый Структура();
Структура.Вставить("НачалоСмены",СтрокаТП.НачалоСмены);
Структура.Вставить("ОкончаниеСмены",СтрокаТП.ОкончаниеСмены);
МассивПериодов.Добавить(Структура);
КонецЦикла;
Возврат МассивПериодов;
/////////////////////////////////////////////////////////////////////////////////
//МассивПериодов = Новый Массив;
//
//ТаблицаПериодыРаботы = РеквизитФормыВЗначение(Элементы.ВыбранныеПериоды.Имя);
//
//НачалоРаботыСЕ = Объект.СтруктурнаяЕдиница.РасписаниеРаботы[ДеньНедели - 1].НачалоРаботы;
//ОкончаниеРаботыСЕ = Объект.СтруктурнаяЕдиница.РасписаниеРаботы[ДеньНедели - 1].ОкончаниеРаботы;
//
//Если ТаблицаПериодыРаботы.Количество() > 0 Тогда
//
// ТаблицаПериодов = Новый ТаблицаЗначений();
// ТаблицаПериодов.Колонки.Добавить("НачалоСмены");
// ТаблицаПериодов.Колонки.Добавить("ОкончаниеСмены");
// Первый = Истина;
// ОкончаниеСмены = ТаблицаПериодыРаботы[0].ОкончаниеСмены;
//
// Для Каждого СтрокаТЧ Из ТаблицаПериодыРаботы Цикл
//
// Если СтрокаТЧ.НачалоСмены < НачалоРаботыСЕ Или
// СтрокаТЧ.ОкончаниеСмены > ОкончаниеРаботыСЕ Тогда
// Продолжить;
// КонецЕсли;
//
// Если Первый Или СтрокаТЧ.НачалоСмены >= ОкончаниеСмены Тогда
// ОкончаниеСмены = СтрокаТЧ.ОкончаниеСмены;
// Первый = Ложь;
// СтрокаТаблицыПериодов = ТаблицаПериодов.Добавить();
// ЗаполнитьЗначенияСвойств(СтрокаТаблицыПериодов, СтрокаТЧ);
// КонецЕсли;
//
// КонецЦикла;
//
// Для Каждого СтрокаТП Из ТаблицаПериодов Цикл
// Структура = Новый Структура();
// Структура.Вставить("НачалоСмены", СтрокаТП.НачалоСмены);
// Структура.Вставить("ОкончаниеСмены", СтрокаТП.ОкончаниеСмены);
// МассивПериодов.Добавить(Структура);
// КонецЦикла;
//
//КонецЕсли;
//
//Возврат МассивПериодов;
КонецФункции
&НаКлиенте
//Функция - выводит диалог о сохранении изменений
//
Функция ВыводДиалогаОСохраненииИзменения()
//Вычисляем, надо ли сохранять
Если МодифицированностьГрафикаРаботы = Ложь Тогда
Возврат Ложь;
КонецЕсли;
ОтветПользователя = Вопрос("Сохранить изменения ?", РежимДиалогаВопрос.ДаНетОтмена);
Если ОтветПользователя = КодВозвратаДиалога.Отмена Тогда
Возврат Неопределено;
ИначеЕсли ОтветПользователя = КодВозвратаДиалога.Да Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
&НаСервере
// Процедура сохраняет данные в регистр и заполняет ими Таблицу значений ГрафикПериодовРаботы
//
Процедура СохранитьИзменения(Период)
ЗаписиРегистра = РегистрыСведений.ВремяРаботыСотрудниковПлан.СоздатьНаборЗаписей();
ЗаписиРегистра.Отбор.СтруктурнаяЕдиница.Установить(ГрафикПериодовРаботы[0].СтруктурнаяЕдиница);
ЗаписиРегистра.Отбор.МесяцОтбор.Установить(НачалоМесяца(ГрафикПериодовРаботы[0].Период));
ЗаписиРегистра.Прочитать();
ЗаписиРегистра.Очистить();
СуткиВСекундах = 24*60*60;
Для Каждого СтрокаГрафикаРаботы Из ГрафикПериодовРаботы Цикл
Для а = 1 По 31 Цикл
Для Каждого СтрокаПериодаРаботы Из СтрокаГрафикаРаботы["День" + а] Цикл
НоваяЗапись = ЗаписиРегистра.Добавить();
НоваяЗапись.СтруктурнаяЕдиница = СтрокаГрафикаРаботы.СтруктурнаяЕдиница;
НоваяЗапись.Сотрудник = СтрокаГрафикаРаботы.Сотрудник;
НоваяЗапись.ДатаВремяНачала = ?(СтрокаПериодаРаботы.Значение.НачалоСмены - Дата(1,1,1) > СуткиВСекундах, СтрокаПериодаРаботы.Значение.НачалоСмены,
Период+(а-1)*СуткиВСекундах+(СтрокаПериодаРаботы.Значение.НачалоСмены - Дата(1,1,1)));
НоваяЗапись.ДатаВремяОкончания = ?(СтрокаПериодаРаботы.Значение.ОкончаниеСмены - Дата(1,1,1) > СуткиВСекундах, СтрокаПериодаРаботы.Значение.ОкончаниеСмены,
Период+(а-1)*СуткиВСекундах+(СтрокаПериодаРаботы.Значение.ОкончаниеСмены - Дата(1,1,1)));
НоваяЗапись.Минуты = (НоваяЗапись.ДатаВремяОкончания - НоваяЗапись.ДатаВремяНачала) / 60;
НоваяЗапись.МесяцОтбор = НачалоМесяца(НоваяЗапись.ДатаВремяНачала);
КонецЦикла;
КонецЦикла;
КонецЦикла;
ЗаписиРегистра.Записать(Истина);
МодифицированностьГрафикаРаботы = Ложь;
КонецПроцедуры
&НаСервере
// Процедура - обработчик события ПриСозданииНаСервере формы.
//
Процедура ПрочитатьГрафикРаботыИзРегистра()
//Salaman//+
ВыбранныеПериоды.Очистить();
//ЗащитаСервер.ВернутьМодульХеликс().ПрочитатьИЗаполнитьГрафикРаботыИзРегистра(ГрафикПериодовРаботы, Новый Структура("Месяц, СтруктурнаяЕдиница", Объект.Период, Объект.СтруктурнаяЕдиница));
//ЗащитаСервер.ВернутьМодульХеликс().ОбновитьПредставлениеДняВКолонках(Элементы.ГрафикПериодовРаботы, Новый Структура("Месяц", Объект.Период));
МодифицированностьГрафикаРаботы = Ложь;
//Salaman//-
КонецПроцедуры
&НаСервере
//Процедура - добавляет изменения, сделанные в мастере заполнения в график сотрудников
//
Процедура ДобавитьВГрафик(АдресВременногоХранилища)
ТаблицаПериодов = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
Для Каждого СтрокаТЧ Из ТаблицаПериодов Цикл
СтрокаГПР = ГрафикПериодовРаботы.НайтиПоИдентификатору(СтрокаТЧ.Идентификатор);
Если СтрокаГПР <> Неопределено Тогда
вГраница = День(СтрокаТЧ.ДатаОкончания);
нГраница = День(СтрокаТЧ.ДатаНачала);
Для Индекс = нГраница По вГраница Цикл
Если Не ЗначениеЗаполнено(СтрокаТЧ["День"+Индекс]) И
ОбщегоНазначения.ПроверитьНаличиеПредварительнойЗаписи(СтрокаГПР.Сотрудник,
Объект.Период + (Индекс-1)*60*60*24, СтрокаГПР["День"+Индекс].ВыгрузитьЗначения(), Объект.СтруктурнаяЕдиница)
Тогда
Продолжить;
КонецЕсли;
СтрокаГПР["День"+Индекс] = СтрокаТЧ["День"+Индекс];
МодифицированностьГрафикаРаботы = Истина;
КонецЦикла;
КонецЕсли;
Для Каждого Сообщение Из СтрокаТЧ.МассивСообщений Цикл
Сообщить(Сообщение);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПечататьДок() Экспорт
//устанавливаем значение фильтра
нГраница = День(НачалоМесяца(Объект.Период));
вГраница = День(КонецМесяца(Объект.Период));
Тдата= НачалоМесяца(Объект.Период);
ВыделенныйЭлемент = Элементы.ДеревоСотрудников.ВыделенныеСтроки[0];
ЗначениеФильтра = ?(ТипЗнч(ВыделенныйЭлемент) = Тип("СтрокаГруппировкиДинамическогоСписка"), ВыделенныйЭлемент.Ключ, ВыделенныйЭлемент);
ТабДок= Новый ТабличныйДокумент;
ТабДок.Очистить();
ТабДокумент = Новый ТабличныйДокумент;
Макет =Обработки.ГрафикРаботыСотрудников.ПолучитьМакет("Макет");
ТабДокументШапка = Новый ТабличныйДокумент;
ТабДокументШапка.Очистить();
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьЗаголовок");
ОбластьМакета.Параметры.ГрафикЕдиница="График работы сотрудников "+Объект.СтруктурнаяЕдиница;
ОбластьМакета.Параметры.Период= "Период: " + ПериодПредставление;
Табдок.Вывести(ОбластьМакета);
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьСотрудникШапка");
ТабДокументШапка.Вывести(ОбластьМакета);
ТабДок.Присоединить(ТабДокументШапка);
Для н=нГраница По вГраница Цикл
Если (Формат((Тдата),"ДФ=дддд")="воскресенье") или (Формат((Тдата),"ДФ=дддд")="суббота") тогда
ОбластьМакета = Макет.ПолучитьОбласть("ОбласьШапкаДеньВ");
иначе
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьДеньШапка");
Конецесли;
ОбластьМакета.Параметры.День= ""+ н+Символы.ПС+ Формат((Тдата),"ДФ=дддд");
ТабДок.Присоединить(ОбластьМакета);
тт=Формат((Тдата),"ДФ=дддд");
Тдата= Тдата+ 60*60*24;
КонецЦикла;
ТабДокументСотрудникиДни = Новый ТабличныйДокумент;
ТабДокументСотрудникиДни.Очистить();
Для каждого СтрокаСотрудника Из ГрафикПериодовРаботы Цикл //ГрафикПериодовРаботы
Если ТипЗнч(ЗначениеФильтра) = Тип("СправочникСсылка.Сотрудники") Тогда
Если СтрокаСотрудника.Сотрудник = ЗначениеФильтра тогда
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьСотрудникСтрока");
ОбластьМакета.Параметры.Сотрудник = СтрокаСотрудника.Сотрудник;
ОбластьМакета.Параметры.Должность = СтрокаСотрудника.Должность;
ТабДокументСотрудникиДни.Вывести(ОбластьМакета);
КонецЕсли;
ИначеЕсли ТипЗнч(ЗначениеФильтра) = Тип("СправочникСсылка.Должности") Тогда
Если СтрокаСотрудника.Должность = ЗначениеФильтра тогда
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьСотрудникСтрока");
ОбластьМакета.Параметры.Сотрудник = СтрокаСотрудника.Сотрудник;
ОбластьМакета.Параметры.Должность = СтрокаСотрудника.Должность;
ТабДокументСотрудникиДни.Вывести(ОбластьМакета);
КонецЕсли;
Иначе
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьСотрудникСтрока");
ОбластьМакета.Параметры.Сотрудник = СтрокаСотрудника.Сотрудник;
ОбластьМакета.Параметры.Должность = СтрокаСотрудника.Должность;
ТабДокументСотрудникиДни.Вывести(ОбластьМакета);
КонецЕсли;
КонецЦикла;
ТабДокумент.Присоединить(ТабДокументСотрудникиДни);
ТабДокументДни= Новый ТабличныйДокумент;
ТабДокументДни.Очистить();
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьДеньСтрока");
Для каждого СтрокаДня Из ГрафикПериодовРаботы Цикл
Если ТипЗнч(ЗначениеФильтра) = Тип("СправочникСсылка.Сотрудники") Тогда
Если СтрокаДня.Сотрудник = ЗначениеФильтра тогда
ТабДокументДни=ЗаполнитьДни(ОбластьМакета, ТабДокументДни, СтрокаДня, вГраница);
КонецЕсли;
ИначеЕсли ТипЗнч(ЗначениеФильтра) = Тип("СправочникСсылка.Должности") Тогда
Если СтрокаДня.Должность = ЗначениеФильтра тогда
ТабДокументДни=ЗаполнитьДни(ОбластьМакета, ТабДокументДни, СтрокаДня, вГраница);
КонецЕсли;
Иначе
ТабДокументДни=ЗаполнитьДни(ОбластьМакета, ТабДокументДни, СтрокаДня, вГраница);
КонецЕсли;
КонецЦикла;
ТабДокумент.Присоединить(ТабДокументДни);
ТабДок.Вывести( ТабДокумент);
Возврат ТабДок;
КонецФункции
&НаКлиенте
Процедура Печать(Команда)
ТабДок = Новый ТабличныйДокумент;
ТабДок= ПечататьДок();
Форма = ПолучитьФорму("Обработка.ГрафикРаботыСотрудников.Форма.ФормаПечати", Новый Структура("ТабДок,Период", тАбдок, ПериодПредставление));
Форма.Открыть();
КонецПроцедуры
&НаСервере
Функция ЗаполнитьДни(ОбластьМакета, ТабДокументДни, СтрокаДня, вГраница)
ОбластьМакета.Параметры.День = строкадня.день1;
ТабДокументДни.Вывести(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день2;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день3;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день4;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день5;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день6;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день7;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день8;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день9;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день10;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день11;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день12;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день13;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день14;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день15;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день16;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день17;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день18;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день19;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день20;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день21;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день22;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день23;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день24;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день25;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день26;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день27;
ТабДокументДни.Присоединить(ОбластьМакета);
ОбластьМакета.Параметры.День = строкадня.день28;
ТабДокументДни.Присоединить(ОбластьМакета);
Если вГраница > 28 тогда
ОбластьМакета.Параметры.День = строкадня.день29;
ТабДокументДни.Присоединить(ОбластьМакета);
КонецЕсли;
Если вГраница > 29 тогда
ОбластьМакета.Параметры.День = строкадня.день30;
ТабДокументДни.Присоединить(ОбластьМакета);
КонецЕсли;
Если вГраница > 30 тогда
ОбластьМакета.Параметры.День = строкадня.день31;
ТабДокументДни.Присоединить(ОбластьМакета);
КонецЕсли;
Возврат ТабДокументДни;
КонецФункции
&НаКлиенте
// Процедура, обработчик события "ПериодыРаботыПередНачаломДобавления"
//
Процедура ПериодыРаботыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
Если НЕ Объект.СтруктурнаяЕдиница.Пустая() Тогда
Отказ = Истина;
ПараметрыОткрытия = Новый Структура("Основание", Новый Структура("СтруктурнаяЕдиница", Объект.СтруктурнаяЕдиница));
ОткрытьФорму("Справочник.ПериодыРаботы.Форма.ФормаЭлемента", ПараметрыОткрытия);
КонецЕсли;
КонецПроцедуры