Загрузка данных
&НаКлиенте
Процедура МесяцРегистрацииСтрокойАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
Если Не ПустаяСтрока(Текст) Тогда
ДанныеВыбора = ДатаКакМесяцПодобратьДатуПоТексту(Текст);
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ДатаКакМесяцПодобратьДатуПоТексту(Текст, ДатаПоТексту = НеОпределено)
СписокВозврата = Новый СписокЗначений;
ТекущийГод = Год(ТекущаяДата());
Если ПустаяСтрока(Текст) Тогда
ДатаПоТексту = Дата(1, 1, 1);
Возврат СписокВозврата;
КонецЕсли;
Если СтрНайти(Текст, ".") <> 0 Тогда
Подстроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Текст, ".");
ИначеЕсли СтрНайти(Текст, ",") <> 0 Тогда
Подстроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Текст, ",");
ИначеЕсли СтрНайти(Текст, "-") <> 0 Тогда
Подстроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Текст, "-");
ИначеЕсли СтрНайти(Текст, "/") <> 0 Тогда
Подстроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Текст, "/");
ИначеЕсли СтрНайти(Текст, "\") <> 0 Тогда
Подстроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Текст, "\");
Иначе
Подстроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Текст, " ");
КонецЕсли;
Если Подстроки.Количество() = 1 Тогда
Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Текст) Тогда
МесяцЧислом = Число(Текст);
Если МесяцЧислом >= 1 И МесяцЧислом <=12 Тогда
ДатаПоТексту = Дата(ТекущийГод, МесяцЧислом, 1);
Если СтрДлина(Текст) = 1 Тогда
СписокВозврата.Добавить(Формат(ДатаПоТексту, "ДФ='М/гг'"));
Иначе
СписокВозврата.Добавить(Формат(ДатаПоТексту, "ДФ='ММ/гг'"));
КонецЕсли;
Иначе
Возврат СписокВозврата;
КонецЕсли;
Иначе
СписокМесяцев = СписокМесяцевПоСтроке(Текст);
Для Каждого Месяц Из СписокМесяцев Цикл
ДатаПоТексту = Дата(ТекущийГод, Месяц, 1);
СписокВозврата.Добавить(Формат(ДатаПоТексту, "ДФ='ММММ гггг'"));
КонецЦикла;
КонецЕсли;
ИначеЕсли Подстроки.Количество() = 2 Тогда
Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Подстроки[1]) Тогда
Если ПустаяСтрока(Подстроки[1]) Тогда
ГодЧислом = 0;
Подстроки[1] = "0";
ТекстВозврата = Текст + "0";
Иначе
ГодЧислом = Число(Подстроки[1]);
ТекстВозврата = "";
КонецЕсли;
Если ГодЧислом > 3000 Тогда
Возврат СписокВозврата;
КонецЕсли;
Если СтрДлина(Подстроки[1]) <= 1 Тогда
ГодЧислом = Число(Лев(Формат(ТекущийГод, "ЧГ="), 3) + Подстроки[1]);
ИначеЕсли СтрДлина(Подстроки[1]) = 2 Тогда
ГодЧислом = Число(Лев(Формат(ТекущийГод, "ЧГ="), 2) + Подстроки[1]);
ИначеЕсли СтрДлина(Подстроки[1]) = 3 Тогда
ГодЧислом = Число(Лев(Формат(ТекущийГод, "ЧГ="), 1) + Подстроки[1]);
ИначеЕсли СтрДлина(Подстроки[1]) = 4 Тогда
ГодЧислом = Число(Подстроки[1]);
КонецЕсли;
Иначе
Возврат СписокВозврата;
КонецЕсли;
Если ЗначениеЗаполнено(Подстроки[0]) И СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Подстроки[0]) Тогда
МесяцЧислом = Число(Подстроки[0]);
Если МесяцЧислом >= 1 И МесяцЧислом <= 12 Тогда
ДатаПоТексту = Дата(ГодЧислом, МесяцЧислом, 1);
СписокВозврата.Добавить(Формат(ДатаПоТексту, "ДФ='ММММ гггг'"));
Иначе
Возврат СписокВозврата;
КонецЕсли;
Иначе
СписокМесяцев = СписокМесяцевПоСтроке(Подстроки[0]);
Если СписокМесяцев.Количество() = 1 Тогда
ДатаПоТексту = Дата(ГодЧислом, СписокМесяцев[0], 1);
СписокВозврата.Добавить(Формат(ДатаПоТексту, "ДФ='ММММ гггг'"));
Иначе
Для Каждого Месяц Из СписокМесяцев Цикл
ДатаПоТексту = Дата(ГодЧислом, Месяц, 1);
СписокВозврата.Добавить(Формат(Дата(ГодЧислом, Месяц, 1), "ДФ='ММММ гггг'"));
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат СписокВозврата;
КонецФункции
&НаКлиенте
Функция СписокМесяцевПоСтроке(Текст)
СписокМесяцев = Новый СписокЗначений;
Месяцы = Новый Соответствие;
МесяцыВозврата = Новый Массив;
Для Счетчик = 1 По 12 Цикл
Представление = Формат(Дата(2000, Счетчик, 1), "ДФ='ММММ'");
СписокМесяцев.Добавить(Счетчик, Представление);
Представление = Формат(Дата(2000, Счетчик, 1), "ДФ='МММ'");
СписокМесяцев.Добавить(Счетчик, Представление);
КонецЦикла;
Для Каждого ЭлементСписка Из СписокМесяцев Цикл
Если ВРег(Текст) = ВРег(Лев(ЭлементСписка.Представление, СтрДлина(Текст))) Тогда
Месяцы[ЭлементСписка.Значение] = 0;
КонецЕсли;
КонецЦикла;
Для Каждого Элемент Из Месяцы Цикл
МесяцыВозврата.Добавить(Элемент.Ключ);
КонецЦикла;
Возврат МесяцыВозврата;
КонецФункции
&НаКлиенте
Процедура МесяцРегистрацииСтрокойНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
ЗадатьВопросПриИзмененииДаты();
КонецПроцедуры
&НаКлиенте
Процедура ПродолжитьИзменениеМесяцаГрафика()
Оповещение = Новый ОписаниеОповещения("ПослеВыбораПериода",ЭтотОбъект);
ПараметрыПериода = Новый Структура("УстановленныйПериод,РежимВыбораПериода", Объект.МесяцГрафика, "Месяц");
ОткрытьФорму("Документ.УстановкаГрафиковРаботы.Форма.ФормаВыборПериода",ПараметрыПериода,ЭтотОбъект,,,,Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораПериода(Результат, ДопПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Объект.МесяцГрафика = Результат;
МесяцРегистрацииСтрокой = Формат(Объект.МесяцГрафика, "ДФ='ММММ гггг'");
МесяцРегистрацииСтрокойПриИзменении();
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьВопросПриИзмененииДаты()
Отказ = Истина;
Обработчик = Новый ОписаниеОповещения("ОчиститьРасписаниеСотрудниковПослеЗакрытияВопроса", ЭтотОбъект);
ТекстВопроса = НСтр("ru = 'При изменении месяца будет утеряно нынешнее расписание сотрудников. Продолжить?'");
ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьРасписаниеСотрудниковПослеЗакрытияВопроса(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ПродолжитьИзменениеМесяцаГрафика();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура МесяцРегистрацииСтрокойПриИзменении()
ОчиститьГрафикРаботыСотрудников();
ЗаполнитьПроизводственныйКалендарь(Год(Объект.МесяцГрафика));
ПроизводственныйКалендарьПриИзмененииНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПроизводственныйКалендарь(Год)
Объект.ПроизводственныйКалендарь = Неопределено;
ПроизводственныйГрафик.Очистить();
Календарь = ПолучитьКалендарь(Год);
Если Календарь <> Неопределено Тогда
Объект.ПроизводственныйКалендарь = Календарь;
Иначе
ОбщегоНазначенияКлиент.СообщитьПользователю(СтрШаблон(НСтр("ru = 'Отсутствует производственный календарь за %1 год.'"), Формат(Год, "ЧГ=0")));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроизводственныйКалендарьПриИзменении(Элемент = Неопределено)
Если НЕ ЗначениеЗаполнено(Объект.ПроизводственныйКалендарь) Тогда
СделатьОсновныеЭлементыФормыНедоступными();
Сообщить("Заполните производственный график");
Иначе
СделатьОсновныеЭлементыФормыДоступными();
ЗагрузитьТаблицуПроизводственногоКалендаря();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПроизводственныйКалендарьПриИзмененииНаСервере()
Если НЕ ЗначениеЗаполнено(Объект.ПроизводственныйКалендарь) Тогда
СделатьОсновныеЭлементыФормыНедоступными();
Сообщить("Заполните производственный график");
Иначе
СделатьОсновныеЭлементыФормыДоступными();
ЗагрузитьТаблицуПроизводственногоКалендаря();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
Объект.Организация = ПараметрыСеанса.ТекущийПользователь.Организация;
Объект.МесяцГрафика = НачалоМесяца(ТекущаяДатаСеанса());
КонецЕсли;
МесяцРегистрацииСтрокой = Формат(Объект.МесяцГрафика, "ДФ='ММММ гггг'");
ЗаполнитьДанныеОВремени();
Элементы.ЗаполнитьПоПроизводственномуГрафику.Заголовок = НСтр("ru = 'Заполнить по производственному графику
|для всех сотрудников'");
Если Не ЗначениеЗаполнено(Объект.ПроизводственныйКалендарь) Тогда
Объект.ПроизводственныйКалендарь = ПолучитьКалендарь(Год(Объект.МесяцГрафика));
КонецЕсли;
ОбновитьДоступностьЭлементовИЗагрузитьГрафик();
ОтрисоватьТаблицуДанныеОВремени();
КонецПроцедуры
&НаСервере
Процедура ОбновитьДоступностьЭлементовИЗагрузитьГрафик()
Заполнено = ЗначениеЗаполнено(Объект.ПроизводственныйКалендарь);
Элементы.Сотрудники.Доступность = Заполнено;
Элементы.ДанныеОВремени.Доступность = Заполнено;
Элементы.ЗаполнитьПоПроизводственномуГрафику.Доступность = Заполнено;
Если Заполнено Тогда
ЗагрузитьТаблицуПроизводственногоКалендаря();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СделатьОсновныеЭлементыФормыНедоступными()
Элементы.Сотрудники.Доступность = Ложь;
Элементы.ДанныеОВремени.Доступность = Ложь;
Элементы.ЗаполнитьПоПроизводственномуГрафику.Доступность = Ложь;
КонецПроцедуры
&НаСервере
Процедура СделатьОсновныеЭлементыФормыДоступными()
Элементы.Сотрудники.Доступность = Истина;
Элементы.ДанныеОВремени.Доступность = Истина;
Элементы.ЗаполнитьПоПроизводственномуГрафику.Доступность = Истина;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДанныеОВремени()
Для Каждого СтрСотрудник Из Объект.Сотрудники Цикл
ДобавитьКолонкуСотрудника(СтрСотрудник.Сотрудник);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ДобавитьКолонкуСотрудника(Сотрудник)
Если Не ЗначениеЗаполнено(Сотрудник) Тогда
Возврат;
КонецЕсли;
ИмяКолонки = ВернутьУникальноеИмяКолонкиСотрудника(Сотрудник);
РекРодителя = ПолучитьРеквизиты("ДанныеОВремени");
НаличиеРеквизита = Ложь;
Для Каждого ТекРек Из РекРодителя Цикл
Если ТекРек.Имя = ИмяКолонки Тогда
НаличиеРеквизита = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не НаличиеРеквизита Тогда
ЗаголовокКолонки = ВернутьФамилиюИИнициалы(Строка(Сотрудник));
НовыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы(ИмяКолонки, Новый ОписаниеТипов("Строка"), "ДанныеОВремени", ЗаголовокКолонки, Ложь);
НовыеРеквизиты.Добавить(НовыйРеквизит);
ИзменитьРеквизиты(НовыеРеквизиты);
ТаблицаФормы = Элементы.ДанныеОВремени;
НоваяКолонка = Элементы.Добавить(ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "ДанныеОВремени." + ИмяКолонки;
НоваяКолонка.Заголовок = ЗаголовокКолонки;
КонецЕсли;
ДобавитьСоответствиеИмениКолонкиИСотрудника(ИмяКолонки, Сотрудник);
ЗадатьФорматТЧДанныеОВремени();
КонецПроцедуры
&НаСервере
Функция ВернутьФамилиюИИнициалы(Знач ФИО)
ФИО = СокрЛП(ФИО);
МассивСлов = СтрРазделить(ФИО, " ", Ложь);
Если МассивСлов.Количество() >= 3 Тогда
Возврат СтрШаблон("%1 %2.%3.", МассивСлов[0], Лев(МассивСлов[1], 1), Лев(МассивСлов[2], 1));
Иначе
Возврат ФИО;
КонецЕсли;
КонецФункции
&НаСервере
Функция ВернутьУникальноеИмяКолонкиСотрудника(Сотрудник)
ЧастьУИД = Сред(Строка(СтрЗаменить(Сотрудник.УникальныйИдентификатор(),"-","_")),1,8);
ИмяКолонки = "С_" + Сотрудник.Код + "_" + ЧастьУИД;
Возврат ИмяКолонки;
КонецФункции
&НаКлиенте
Функция ЕстьДубльСотрудника(Сотрудник, ИдентификаторТекущейСтроки)
Для Каждого СтрокаТЧ Из Объект.Сотрудники Цикл
Если СтрокаТЧ.Сотрудник = Сотрудник И СтрокаТЧ.ПолучитьИдентификатор() <> ИдентификаторТекущейСтроки Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
&НаСервере
Функция ПолучитьИмяКолонкиПоСотруднику(Сотрудник)
Отбор = Новый Структура("Сотрудник", Сотрудник);
НайденныеСтроки = Объект.СоответствиеКолонокСотрудников.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() > 0 Тогда
Возврат НайденныеСтроки[0].ИмяКолонки;
КонецЕсли;
Возврат "";
КонецФункции
&НаСервере
Процедура УдалитьКолонкуСотрудников(Сотрудник)
Если ЗначениеЗаполнено(Сотрудник) Тогда
ИмяКолонки = ВернутьУникальноеИмяКолонкиСотрудника(Сотрудник);
ИмяРодителя = "ДанныеОВремени";
ИмяУдаляемогоРеквизита = ИмяРодителя + "." + ИмяКолонки;
МассивУдаляемыхРеквизитов = Новый Массив;
РекРодителя = ПолучитьРеквизиты(ИмяРодителя);
Для Каждого ТекРек Из РекРодителя Цикл
Если ТекРек.Имя = ИмяКолонки Тогда
МассивУдаляемыхРеквизитов.Добавить(ИмяУдаляемогоРеквизита);
КонецЕсли;
КонецЦикла;
Если МассивУдаляемыхРеквизитов.Количество() > 0 Тогда
ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоПроизводственномуГрафику(Команда)
ЗаполнитьПоПроизводственномуГрафикуНаСервере();
ОтрисоватьТаблицуДанныеОВремени();
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьТаблицуПроизводственногоКалендаря()
ТекущаяДатаГрафика = Объект.МесяцГрафика;
КалендарьСсылка = Объект.ПроизводственныйКалендарь;
Если Не ЗначениеЗаполнено(КалендарьСсылка) Тогда
Возврат;
КонецЕсли;
ПроизводственныйГрафик.Очистить();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеПроизводственногоКалендаря.Дата КАК Дата,
| ДЕНЬНЕДЕЛИ(ДанныеПроизводственногоКалендаря.Дата) КАК ДеньНедели,
| ДанныеПроизводственногоКалендаря.Год КАК Год,
| ДанныеПроизводственногоКалендаря.ВидДня КАК ВидДня,
| ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь.Ссылка КАК ПроизводственныйКалендарьСсылка
|ПОМЕСТИТЬ ВТ_ДанныеПроизводственногоКалендаря
|ИЗ
| РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
|ГДЕ
| ДанныеПроизводственногоКалендаря.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ), ДЕНЬ)
| И ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &ПроизводственныйКалендарь
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЫБОР
| КОГДА ГрафикРаботыРасписаниеРаботы.ВремяНачала ЕСТЬ NULL
| ТОГДА НЕОПРЕДЕЛЕНО
| ИНАЧЕ ГрафикРаботыРасписаниеРаботы.ВремяНачала
| КОНЕЦ КАК ВремяНачала,
| ВЫБОР
| КОГДА ГрафикРаботыРасписаниеРаботы.ВремяОкончания ЕСТЬ NULL
| ТОГДА НЕОПРЕДЕЛЕНО
| ИНАЧЕ ГрафикРаботыРасписаниеРаботы.ВремяОкончания
| КОНЕЦ КАК ВремяОкончания,
| ВТ_ДанныеПроизводственногоКалендаря.Дата КАК Дата,
| ВТ_ДанныеПроизводственногоКалендаря.ДеньНедели КАК ДеньНедели,
| ВТ_ДанныеПроизводственногоКалендаря.ВидДня КАК ВидДня
|ИЗ
| ВТ_ДанныеПроизводственногоКалендаря КАК ВТ_ДанныеПроизводственногоКалендаря
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГрафикРаботы.РасписаниеРаботы КАК ГрафикРаботыРасписаниеРаботы
| ПО ВТ_ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарьСсылка = ГрафикРаботыРасписаниеРаботы.Ссылка.Ссылка
| И ВТ_ДанныеПроизводственногоКалендаря.ДеньНедели = ГрафикРаботыРасписаниеРаботы.НомерДня
|
|УПОРЯДОЧИТЬ ПО
| Дата,
| ДеньНедели,
| ВремяНачала";
Запрос.УстановитьПараметр("Дата", ТекущаяДатаГрафика);
Запрос.УстановитьПараметр("ПроизводственныйКалендарь", КалендарьСсылка);
ПроизводственныйГрафик.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоПроизводственномуГрафикуНаСервере()
Если Объект.Сотрудники.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Объект.ГрафикРаботыСотрудников.Очистить();
Для Каждого СтрокаСотрудник Из Объект.Сотрудники Цикл
Для Каждого СтрокаТЧ ИЗ ПроизводственныйГрафик Цикл
Если СтрокаТЧ.ВремяНачала <> Неопределено И СтрокаТЧ.ВремяОкончания <> Неопределено
И СтрокаТЧ.ВремяНачала <> NULL И СтрокаТЧ.ВремяОкончания <> NULL Тогда
НоваяСтрока = Объект.ГрафикРаботыСотрудников.Добавить();
НоваяСтрока.Сотрудник = СтрокаСотрудник.Сотрудник;
НоваяСтрока.ВремяНачала = СтрокаТЧ.ВремяНачала;
НоваяСтрока.ВремяОкончания = ?(СтрокаТЧ.ВремяОкончания = Дата(1, 1, 1, 0, 0, 0),
Дата(1, 1, 1, 23, 59, 0), СтрокаТЧ.ВремяОкончания);
НоваяСтрока.Дата = СтрокаТЧ.Дата;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ОтрисоватьТаблицуДанныеОВремени()
ТЗГрафикРаботыСотрудников = Объект.ГрафикРаботыСотрудников.Выгрузить();
Если ТЗГрафикРаботыСотрудников.Количество() = 0 И Объект.Сотрудники.Количество() = 0 Тогда
ДанныеОВремени.Очистить();
Возврат;
КонецЕсли;
СохраненнаяДата = Неопределено;
Если ТекущаяСтрокаТаблицыДанныеОВремени <> Неопределено
И ТипЗнч(ТекущаяСтрокаТаблицыДанныеОВремени) = Тип("Структура")
И ТекущаяСтрокаТаблицыДанныеОВремени.Свойство("Дата") Тогда
СохраненнаяДата = ТекущаяСтрокаТаблицыДанныеОВремени.Дата;
КонецЕсли;
ТЗТаблицаДатМесяца = Новый ТаблицаЗначений;
ТЗТаблицаДатМесяца.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
ДатаДляТаблицы = НачалоМесяца(Объект.МесяцГрафика);
ДатаСледующегоМесяца = НачалоМесяца(ДобавитьМесяц(ДатаДляТаблицы, 1));
Пока ДатаДляТаблицы < ДатаСледующегоМесяца Цикл
ТЗТаблицаДатМесяца.Добавить().Дата = ДатаДляТаблицы;
ДатаДляТаблицы = ДатаДляТаблицы + 86400; // Прибавление 1 дня в секундах
КонецЦикла;
ДанныеОВремени.Очистить();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаДатМесяца.Дата КАК Дата
|ПОМЕСТИТЬ ВТТаблицаДатМесяца
|ИЗ
| &ТаблицаДатМесяца КАК ТаблицаДатМесяца
|;
|
|ВЫБРАТЬ
| ТаблицаСотрудников.Сотрудник КАК Сотрудник,
| ТаблицаСотрудников.ВремяНачала КАК ВремяНачала,
| ТаблицаСотрудников.ВремяОкончания КАК ВремяОкончания,
| ТаблицаСотрудников.Дата КАК Дата
|ПОМЕСТИТЬ ВТТаблицаСотрудников
|ИЗ
| &ТаблицаСотрудников КАК ТаблицаСотрудников
|;
|
|ВЫБРАТЬ
| ВТТаблицаДатМесяца.Дата КАК Дата,
| ВТТаблицаСотрудников.Сотрудник КАК Сотрудник,
| ВТТаблицаСотрудников.ВремяНачала КАК ВремяНачала,
| ВТТаблицаСотрудников.ВремяОкончания КАК ВремяОкончания
|ИЗ
| ВТТаблицаДатМесяца КАК ВТТаблицаДатМесяца
| ЛЕВОЕ СОЕДИНЕНИЕ ВТТаблицаСотрудников КАК ВТТаблицаСотрудников
| ПО ВТТаблицаДатМесяца.Дата = ВТТаблицаСотрудников.Дата
|УПОРЯДОЧИТЬ ПО
| Дата,
| Сотрудник,
| ВремяНачала";
Запрос.УстановитьПараметр("ТаблицаСотрудников", ТЗГрафикРаботыСотрудников);
Запрос.УстановитьПараметр("ТаблицаДатМесяца", ТЗТаблицаДатМесяца);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
СтрокиПоДатам = Новый Соответствие;
Пока Выборка.Следующий() Цикл
Дата = Выборка.Дата;
ДниМесяцаСтр = Формат(Дата, "ДФ='dd ddd'");
Если СтрокиПоДатам.Получить(Дата) <> Неопределено Тогда
МассивСтрок = СтрокиПоДатам[Дата];
Иначе
МассивСтрок = Новый Массив;
НоваяСтрока = ДанныеОВремени.Добавить();
НоваясТрока.Дата = Дата;
НоваяСтрока.ДниМесяца = ДниМесяцаСтр;
Отбор = Новый Структура("Дата");
Отбор.Вставить("Дата", Дата);
НайденныеСтроки = ПроизводственныйГрафик.НайтиСтроки(Отбор);
НоваяСтрока.ВидДня = ?(НайденныеСтроки.Количество() > 0,НайденныеСтроки[0].ВидДня, Неопределено);
МассивСтрок.Добавить(НоваяСтрока);
СтрокиПоДатам.Вставить(Дата, МассивСтрок);
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Выборка.Сотрудник) Тогда
Продолжить;
КонецЕсли;
Сотрудник = Выборка.Сотрудник;
ИмяКолонки = ПолучитьИмяКолонкиПоСотруднику(Сотрудник);
Интервал = ?(Формат(Выборка.ВремяНачала, "ДФ=ЧЧ:мм") = "", "00:00", Формат(Выборка.ВремяНачала, "ДФ=ЧЧ:мм"))
+ " - " + ?(Формат(Выборка.ВремяОкончания, "ДФ=ЧЧ:мм") = "", "00:00", Формат(Выборка.ВремяОкончания, "ДФ=ЧЧ:мм"))
+ " (" + ДниМесяцаСтр + ")";
СтрокаДляЗаписи = Неопределено;
Для Каждого СтрокаДанных Из МассивСтрок Цикл
Если ПустаяСтрока(СтрокаДанных[ИмяКолонки]) Тогда
СтрокаДляЗаписи = СтрокаДанных;
Прервать;
КонецЕсли;
КонецЦикла;
Если СтрокаДляЗаписи = Неопределено Тогда
СтрокаДляЗаписи = ДанныеОВремени.Добавить();
СтрокаДляЗаписи.ВидДня = ?(НайденныеСтроки.Количество() > 0,НайденныеСтроки[0].ВидДня, Неопределено);
СтрокаДляЗаписи.Дата = Дата;
МассивСтрок.Добавить(СтрокаДляЗаписи);
КонецЕсли;
СтрокаДляЗаписи[ИмяКолонки] = Интервал;
КонецЦикла;
Если СохраненнаяДата <> Неопределено Тогда
Для Каждого СтрокаДанных Из ДанныеОВремени Цикл
Если СохраненнаяДата = СтрокаДанных.Дата Тогда
Элементы.ДанныеОВремени.ТекущаяСтрока = СтрокаДанных.ПолучитьИдентификатор();
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
УстановитьУсловноеОформлениеДанныеОВремени();
КонецПроцедуры
&НаСервере
Процедура УстановитьУсловноеОформлениеДанныеОВремени()
УсловноеОформление.Элементы.Очистить();
// Выходные дни (Суббота, Воскресенье)
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(245, 251, 255));
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДанныеОВремени.ВидДня");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
СписокВидовДней = Новый СписокЗначений;
СписокВидовДней.Добавить(Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота);
СписокВидовДней.Добавить(Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье);
ЭлементОтбора.ПравоеЗначение = СписокВидовДней;
ЭлементОтбора.Использование = Истина;
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ДанныеОВремени");
// Праздничные дни
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 225, 232));
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДанныеОВремени.ВидДня");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Перечисления.ВидыДнейПроизводственногоКалендаря.Праздник;
ЭлементОтбора.Использование = Истина;
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ДанныеОВремени");
// Нерабочие дни
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(240, 240, 240));
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДанныеОВремени.ВидДня");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Перечисления.ВидыДнейПроизводственногоКалендаря.Нерабочий;
ЭлементОтбора.Использование = Истина;
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ДанныеОВремени");
КонецПроцедуры
&НаСервере
Процедура ЗадатьФорматТЧДанныеОВремени()
Элементы.ДанныеОВремени.РастягиватьПоВертикали = Истина;
Элементы.ДанныеОВремени.РастягиватьПоГоризонтали = Истина;
Элементы.ДанныеОВремени.Ширина = 100;
Элементы.ДанныеОВремени.ПодчиненныеЭлементы.ДанныеОВремениГруппаКолонок.РастягиватьПоВертикали = Истина;
Элементы.ДанныеОВремени.ПодчиненныеЭлементы.ДанныеОВремениГруппаКолонок.РастягиватьПоГоризонтали = Ложь;
КоллекцияЭлементов = Элементы.ДанныеОВремени.ПодчиненныеЭлементы;
Для Индекс = 1 По КоллекцияЭлементов.Количество() - 1 Цикл
КоллекцияЭлементов[Индекс].ТолькоПросмотр = Истина;
КоллекцияЭлементов[Индекс].РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
КоллекцияЭлементов[Индекс].ГоризонтальноеПоложениеВШапке = ГоризонтальноеПоложениеЭлемента.Центр;
КоллекцияЭлементов[Индекс].ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Центр;
КонецЦикла;
КоллекцияЭлементовГруппы = Элементы.ДанныеОВремени.ПодчиненныеЭлементы.ДанныеОВремениГруппаКолонок.ПодчиненныеЭлементы;
Для Индекс = 0 По КоллекцияЭлементовГруппы.Количество() - 1 Цикл
КоллекцияЭлементовГруппы[Индекс].ТолькоПросмотр = Истина;
КоллекцияЭлементовГруппы[Индекс].РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СотрудникиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Элемент.ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Сотрудник = Элемент.ТекущиеДанные.Сотрудник;
ПараметрыФормы = Новый Структура;
ДатаСтроки = НачалоМесяца(Объект.МесяцГрафика);
Если ТекущаяСтрокаТаблицыДанныеОВремени <> Неопределено
И ТекущаяСтрокаТаблицыДанныеОВремени.Свойство("Дата")
И ЗначениеЗаполнено(ТекущаяСтрокаТаблицыДанныеОВремени.Дата) Тогда
ДатаСтроки = ТекущаяСтрокаТаблицыДанныеОВремени.Дата;
КонецЕсли;
ПараметрыФормы.Вставить("ДатаСтроки", ДатаСтроки);
ПараметрыФормы.Вставить("МесяцГрафика", Объект.МесяцГрафика);
ПараметрыФормы.Вставить("ГрафикРаботыСотрудников", Объект.ГрафикРаботыСотрудников);
СписокСотрудников = Новый СписокЗначений;
СписокСотрудников.Добавить(Сотрудник);
ПараметрыФормы.Вставить("КоллекцияСотрудников", СписокСотрудников);
ПараметрыФормы.Вставить("ПоОдномуСотруднику", Истина);
Оповещение = Новый ОписаниеОповещения("ПослеЗаписиДанныхФормыРасписаниеРаботы", ЭтотОбъект);
ОткрытьФорму("Документ.УстановкаГрафиковРаботы.Форма.РасписаниеРаботы", ПараметрыФормы, ЭтотОбъект, , , , Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписиДанныхФормыРасписаниеРаботы(Результат, ДопПараметры) Экспорт
Если Результат <> Неопределено Тогда
ПослеЗаписиДанныхФормыРасписаниеРаботыНаСервере(Результат, ДопПараметры);
КонецЕсли;
ОтрисоватьТаблицуДанныеОВремени();
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиДанныхФормыРасписаниеРаботыНаСервере(Результат, ДопПараметры)
КоллекцияСотрудников = Результат.КоллекцияСотрудников;
ГрафикРаботыПоКонкретномуСотруднику = Результат.ГрафикРаботыПоКонкретномуСотруднику;
ДатаРедактирования = Результат.ДатаРедактирования;
Для Индекс = 0 По КоллекцияСотрудников.Количество() - 1 Цикл
Отбор = Новый Структура("Сотрудник, Дата", КоллекцияСотрудников[Индекс].Значение, ДатаРедактирования);
НайденныеСтроки = Объект.ГрафикРаботыСотрудников.НайтиСтроки(Отбор);
Для Каждого Строка Из НайденныеСтроки Цикл
Объект.ГрафикРаботыСотрудников.Удалить(Строка);
КонецЦикла;
КонецЦикла;
Отбор = Новый Структура("Дата", ДатаРедактирования);
НайденныеСтроки = ГрафикРаботыПоКонкретномуСотруднику.НайтиСтроки(Отбор);
Для Каждого Строка Из НайденныеСтроки Цикл
НоваяСтрока = Объект.ГрафикРаботыСотрудников.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ОчиститьГрафикРаботыСотрудников()
Объект.ГрафикРаботыСотрудников.Очистить();
ОтрисоватьТаблицуДанныеОВремени();
КонецПроцедуры
&НаКлиенте
Процедура ДанныеОВремениПриАктивизацииСтроки(Элемент)
ТекущаяСтрокаПерем = Элемент.ТекущиеДанные;
СтруктураСтроки = Неопределено;
Если ТекущаяСтрокаПерем <> Неопределено И ТекущаяСтрокаПерем.Свойство("Дата") Тогда
СтруктураСтроки = Новый Структура("Дата", ТекущаяСтрокаПерем.Дата);
Для Каждого Сотрудник Из Объект.Сотрудники Цикл
ИмяРеквизита = ПолучитьИмяКолонкиПоСотруднику(Сотрудник.Сотрудник);
Если Не ПустаяСтрока(ИмяРеквизита) И ТекущаяСтрокаПерем.Свойство(ИмяРеквизита) Тогда
СтруктураСтроки.Вставить(ИмяРеквизита, ТекущаяСтрокаПерем[ИмяРеквизита]);
КонецЕсли;
КонецЦикла;
КонецЕсли;
ТекущаяСтрокаТаблицыДанныеОВремени = СтруктураСтроки;
КонецПроцедуры
&НаКлиенте
Процедура ДанныеОВремениВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ТекущаяСтрока = Элемент.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
Сотрудник = ПолучитьСотрудникаПоИмениКолонки(Поле.Имя);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ДатаСтроки", ТекущаяСтрока.Дата);
ПараметрыФормы.Вставить("НеизменяемаяДата", Истина);
ПараметрыФормы.Вставить("МесяцГрафика", Объект.МесяцГрафика);
ПараметрыФормы.Вставить("ГрафикРаботыСотрудников", Объект.ГрафикРаботыСотрудников);
СписокСотрудников = Новый СписокЗначений;
Если ЗначениеЗаполнено(Сотрудник) Тогда
ПараметрыФормы.Вставить("ПоОдномуСотруднику", Истина);
СписокСотрудников.Добавить(Сотрудник);
Иначе
Для Каждого СтрокаСотрудник Из Объект.Сотрудники Цикл
СписокСотрудников.Добавить(СтрокаСотрудник.Сотрудник);
КонецЦикла;
КонецЕсли;
ПараметрыФормы.Вставить("КоллекцияСотрудников", СписокСотрудников);
Оповещение = Новый ОписаниеОповещения("ПослеЗаписиДанныхФормыРасписаниеРаботы", ЭтотОбъект);
ОткрытьФорму("Документ.УстановкаГрафиковРаботы.Форма.РасписаниеРаботы", ПараметрыФормы, ЭтотОбъект, , , , Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоПроизводственномуГрафикуСотрудникаНаСервере(Сотрудник)
Отбор = Новый Структура("Сотрудник");
Отбор.Вставить("Сотрудник", Сотрудник);
НайденныеСтроки = Объект.ГрафикРаботыСотрудников.НайтиСтроки(Отбор);
Для Каждого Строка Из НайденныеСтроки Цикл
Объект.ГрафикРаботыСотрудников.Удалить(Строка);
КонецЦикла;
Для Каждого СтрокаТЧ ИЗ ПроизводственныйГрафик Цикл
Если СтрокаТЧ.ВремяНачала <> Неопределено И СтрокаТЧ.ВремяОкончания <> Неопределено
И СтрокаТЧ.ВремяНачала <> NULL И СтрокаТЧ.ВремяОкончания <> NULL Тогда
НоваяСтрока = Объект.ГрафикРаботыСотрудников.Добавить();
НоваяСтрока.Сотрудник = Сотрудник;
НоваяСтрока.ВремяНачала = СтрокаТЧ.ВремяНачала;
НоваяСтрока.ВремяОкончания = ?(СтрокаТЧ.ВремяОкончания = Дата(1, 1, 1, 0, 0, 0),
Дата(1, 1, 1, 23, 59, 0), СтрокаТЧ.ВремяОкончания);
НоваяСтрока.Дата = СтрокаТЧ.Дата;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоПроизводственномуГрафикуСотрудника(Команда)
Если ЗначениеЗаполнено(ТекущийСотрудникТаблицыСотрудник) Тогда
ЗаполнитьПоПроизводственномуГрафикуСотрудникаНаСервере(ТекущийСотрудникТаблицыСотрудник);
ОтрисоватьТаблицуДанныеОВремени();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СотрудникиПриАктивизацииСтроки(Элемент)
ТекущаяСтрокаПерем = Элемент.ТекущиеДанные;
ТекущийСотрудникТаблицыСотрудник = Неопределено;
ДоступностьКнопок = Ложь;
Если ТекущаяСтрокаПерем <> Неопределено И ТекущаяСтрокаПерем.Свойство("Сотрудник")
И ЗначениеЗаполнено(ТекущаяСтрокаПерем.Сотрудник) Тогда
ТекущийСотрудникТаблицыСотрудник = ТекущаяСтрокаПерем.Сотрудник;
ДоступностьКнопок = Истина;
КонецЕсли;
Элементы.СотрудникиКонтекстноеМенюЗаполнитьПоПроизводственномуГрафикуСотрудника.Доступность = ДоступностьКнопок;
Элементы.СотрудникиЗаполнитьПоПроизводственномуГрафикуСотрудника.Доступность = ДоступностьКнопок;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьКалендарь(Год)
МассивКалендарей = ПолучитьМассивКалендарей(Год);
Если МассивКалендарей.Количество() <> 0 Тогда
Возврат МассивКалендарей[0];
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьСписокЗначенийКалендарей(Год)
СписокКалендарей = Новый СписокЗначений;
СписокКалендарей.ЗагрузитьЗначения(ПолучитьМассивКалендарей(Год));
Возврат СписокКалендарей;
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьМассивКалендарей(Год)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГрафикРаботы.Ссылка КАК ПроизводственныйКалендарь
|ИЗ
| Справочник.ГрафикРаботы КАК ГрафикРаботы
|ГДЕ
| ГОД(ГрафикРаботы.ДатаНачала) = &Год
| И НЕ ГрафикРаботы.ПометкаУдаления
|
|УПОРЯДОЧИТЬ ПО
| ГрафикРаботы.Наименование";
Запрос.УстановитьПараметр("Год", Год);
РезультатМассив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ПроизводственныйКалендарь");
Возврат РезультатМассив;
КонецФункции
&НаСервере
Функция ВернутьГодПроизводственногоКалендаря()
Возврат Объект.ПроизводственныйКалендарь.Год;
КонецФункции
&НаКлиенте
Процедура ПроизводственныйКалендарьНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ГодВыбора = Год(Объект.МесяцГрафика);
СписокКалендарей = ПолучитьСписокЗначенийКалендарей(ГодВыбора);
Если СписокКалендарей.Количество() = 0 Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(СтрШаблон(НСтр("ru = 'Отсутствует производственный календарь за %1 год.'"), Формат(ГодВыбора, "ЧГ=0")));
Возврат;
КонецЕсли;
ВыбранныйЭлемент = СписокКалендарей.ВыбратьЭлемент(СтрШаблон(НСтр("ru = 'Выберите производственный календарь за %1'"), Формат(ГодВыбора, "ЧГ=0")));
Если ВыбранныйЭлемент <> Неопределено Тогда
Объект.ПроизводственныйКалендарь = ВыбранныйЭлемент.Значение;
ПроизводственныйКалендарьПриИзмененииНаКлиенте();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроизводственныйКалендарьПриИзмененииНаКлиенте()
ЗагрузитьТаблицуПроизводственногоКалендаря();
УправлениеДоступностьюЭлементов();
КонецПроцедуры
&НаКлиенте
Процедура УправлениеДоступностьюЭлементов()
Заполнено = ЗначениеЗаполнено(Объект.ПроизводственныйКалендарь);
Элементы.Сотрудники.Доступность = Заполнено;
Элементы.ДанныеОВремени.Доступность = Заполнено;
Элементы.ЗаполнитьПоПроизводственномуГрафику.Доступность = Заполнено;
Если Не Заполнено Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Заполните производственный календарь'"));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подбор(Команда)
Если Не ЗначениеЗаполнено(Объект.Подразделение) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Заполните подразделение'"));
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура("Подразделение", Объект.Подразделение);
ОткрытьФорму("Справочник.Сотрудники.Форма.ФормаПодбора", ПараметрыФормы, Элементы.Сотрудники);
КонецПроцедуры
&НаКлиенте
Процедура СотрудникиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) <> Тип("Массив") Тогда
Возврат;
КонецЕсли;
Для Каждого Сотрудник Из ВыбранноеЗначение Цикл
Отбор = Новый Структура("Сотрудник", Сотрудник);
Если Объект.Сотрудники.НайтиСтроки(Отбор).Количество() > 0 Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = Объект.Сотрудники.Добавить();
НоваяСтрока.Сотрудник = Сотрудник;
ДобавитьКолонкуСотрудника(Сотрудник);
КонецЦикла;
ОтрисоватьТаблицуДанныеОВремени();
КонецПроцедуры
&НаСервере
Процедура ДобавитьСоответствиеИмениКолонкиИСотрудника(ИмяКолонки, Сотрудник)
Отбор = Новый Структура;
Отбор.Вставить("Сотрудник", Сотрудник);
Отбор.Вставить("ИмяКолонки", ИмяКолонки);
НайденныеСтроки = Объект.СоответствиеКолонокСотрудников.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 0 Тогда
НовоеСоответствиеКолонкиИСотрудника = Объект.СоответствиеКолонокСотрудников.Добавить();
НовоеСоответствиеКолонкиИСотрудника.ИмяКолонки = ИмяКолонки;
НовоеСоответствиеКолонкиИСотрудника.Сотрудник = Сотрудник;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьСотрудникаПоИмениКолонки(ИмяКолонки)
Отбор = Новый Структура("ИмяКолонки", ИмяКолонки);
НайденныеСтроки = Объект.СоответствиеКолонокСотрудников.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() > 0 Тогда
Возврат НайденныеСтроки[0].Сотрудник;
КонецЕсли;
Возврат Справочники.Сотрудники.ПустаяСсылка();
КонецФункции
&НаКлиенте
Процедура СотрудникиПередУдалением(Элемент, Отказ)
СтрокаСотрудника = Элементы.Сотрудники.ТекущиеДанные;
Если СтрокаСотрудника <> Неопределено Тогда
УдалитьСотрудникаКомплексно(СтрокаСотрудника.Сотрудник);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СотрудникиПослеУдаления(Элемент)
Если Объект.Сотрудники.Количество() = 0 Тогда
Объект.ГрафикРаботыСотрудников.Очистить();
Объект.СоответствиеКолонокСотрудников.Очистить();
КонецЕсли;
ОтрисоватьТаблицуДанныеОВремени();
КонецПроцедуры
//&НаКлиенте
//Процедура МесяцРегистрацииСтрокойРегулирование(Элемент, Направление, СтандартнаяОбработка)
//
// Значение = Объект.МесяцГрафика;
//
// Если Значение <= '19000101' Тогда
//
// Значение = НачалоМесяца(ТекущаяДата());
//
// НовоеЗначение = Значение;
//
// Иначе
// НовоеЗначение = ДобавитьМесяц(Значение, Направление);
// КонецЕсли;
//
// Если НовоеЗначение >= '00010101' Тогда
//
// Значение = НовоеЗначение;
//
// Объект.МесяцГрафика = Значение;
// МесяцРегистрацииСтрокой = Формат(Объект.МесяцГрафика, "ДФ='ММММ гггг'");
//
// КонецЕсли;
// МесяцРегистрацииСтрокойПриИзменении();
//КонецПроцедуры
//&НаКлиенте
//Процедура СотрудникиПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
// ТекущаяСтрока = Элементы.Сотрудники.ТекущиеДанные;
// Если ТекущаяСтрока = Неопределено Тогда
// Отказ = Истина;
// Возврат;
// КонецЕсли;
// Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.Сотрудник)Тогда
// Отказ = Истина;
// ИндексСтроки = Объект.Сотрудники.Индекс(ТекущаяСтрока);
// Объект.Сотрудники.Удалить(ИндексСтроки);
// Возврат;
// КонецЕсли;
//
//
// Если ЕстьДубльСотрудника(ТекущаяСтрока.Сотрудник, ТекущаяСтрока.ПолучитьИдентификатор()) Тогда
// Сообщить("Сотрудник " + Строка(ТекущаяСтрока.Сотрудник) + " уже добавлен в таблицу");
// ОтменаРедактирования = Истина;
// Отказ = Истина;
// ИндексСтроки = Объект.Сотрудники.Индекс(ТекущаяСтрока);
// Объект.Сотрудники.Удалить(ИндексСтроки);
// Возврат;
// КонецЕсли;
//
// ДобавитьКолонкуСотрудника(ТекущаяСтрока.Сотрудник);
//
// ОтрисоватьТаблицуДанныеОВремени();
//КонецПроцедуры
&НаСервере
Процедура УдалитьСотрудникаКомплексно(Сотрудник)
Если Не ЗначениеЗаполнено(Сотрудник) Тогда
Возврат;
КонецЕсли;
ИмяКолонки = ВернутьУникальноеИмяКолонкиСотрудника(Сотрудник);
// Удаление элемента формы
ЭлементФормы = Элементы.Найти(ИмяКолонки);
Если ЭлементФормы <> Неопределено Тогда
Элементы.Удалить(ЭлементФормы);
КонецЕсли;
// Удаление реквизита формы
ИмяУдаляемогоРеквизита = "ДанныеОВремени." + ИмяКолонки;
МассивУдаляемыхРеквизитов = Новый Массив;
РекРодителя = ПолучитьРеквизиты("ДанныеОВремени");
Для Каждого ТекРек Из РекРодителя Цикл
Если ТекРек.Имя = ИмяКолонки Тогда
МассивУдаляемыхРеквизитов.Добавить(ИмяУдаляемогоРеквизита);
Прервать;
КонецЕсли;
КонецЦикла;
Если МассивУдаляемыхРеквизитов.Количество() > 0 Тогда
ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов);
КонецЕсли;
// Удаление из ТЧ ГрафикРаботыСотрудников
Индекс = Объект.ГрафикРаботыСотрудников.Количество() - 1;
Пока Индекс >= 0 Цикл
Если Объект.ГрафикРаботыСотрудников[Индекс].Сотрудник = Сотрудник Тогда
Объект.ГрафикРаботыСотрудников.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
// Удаление из ТЧ СоответствиеКолонокСотрудников
Индекс = Объект.СоответствиеКолонокСотрудников.Количество() - 1;
Пока Индекс >= 0 Цикл
Если Объект.СоответствиеКолонокСотрудников[Индекс].Сотрудник = Сотрудник Тогда
Объект.СоответствиеКолонокСотрудников.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецПроцедуры