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