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