Итак... в ЗУП подобного механизма, как я понял, не имеется, а вместо этого предлагается выполнять исправление документа, где на вкладке "Продления, переносы, отзывы" заполняется период в который сотрудник был отозван из отпуска.
Проблема, собственно, заключается в том, что сформировать печатную форму к которой привыкли кадровики не представляется возможным, так как нужно связать 3 документа отпуск:
первый: отпуск, когда сотрудник пошел туда в отпуск (прошу прощения за тавтологию) -> второй: документ -отпуск (исправление), в котором указывается период отзыва -> третий: сотрудник отгуливает дни за отозванные дни отпуска.
Сразу хочу оговориться, что мое решение простое и, наверное, не эффективное (так как я начинающий), а так же упрощенное, не учитывающее некоторые нюансы. Но может кому-то будет полезным...
Как вообще это выглядит:
в документе "Отпуск" через расширение конфигурации добавлен еще один реквизит:
То есть кадровик указывает документ - отзыв из отпуска по этому сотруднику.
Ну и конечно, это не отменяет необходимости указывать дни, когда сотрудник был отозван из отпуска (на вкладке "Продления, переносы, отзывы").
Расширение добавляет также печатную форму "Отзыв из отпуска":
Также в нашем случае у сотрудника не бывает многочисленных отзывов, например 13-го, 15-го, 18-го, то есть нет "рваного отзыва". Это у меня пока не реализовано! В нашем случае все просто: отзыв 13-го на 1 день. Или с 13-го по 15-е на 3 дня. И.Т.Д.
Если подобное решение вам приемлемо - прошу...
1) создаем расширение конфигурации (у меня оно называется КРГ_ЗУП с префиксом КРГ_) - у вас оно, конечно, будет свое:
2) Открываем наше расширение, затем ищем в основной конфигурации документ "Отпуск" и добавляем его в наше расширение.
Так же необходимо создать новый реквизит - КРГ_ДокументОтзывИзОтпуска и макет - КРГ_ПриказОтзывИзОтпуска с типом "ДокументСсылка.Отпуск":
После этого необходимо добавить в расширение форму "ФормаДокумента" из документа "Отпуск":
Когда вы это сделаете, необходимо открыть форму "ФормаДокумента" (которая в нашем расширении) и затем:
1. Встать на "Объект" на вкладке "Реквизиты" и нажать на кнопку "Добавить в расширение".
2. Создать группу и перетащить туда наш реквизит КРГ_ДокументОтзывИзОтпуска из Объекта.
В общем, на форме должен появиться наш реквизит:
3) теперь нужно сделать вот что: при выборе документа - отзыв из отпуска кадровику будут выдаваться все документы, а желательно только по тому сотруднику с которым она работает сейчас. Иными словами необходимо реализовать фильтр в форме списка.
Для этого встанем на реквизит КРГ_ДокументОтзывИзОтпуска в нашем расширении и вызовем его свойства (правая кнопка мыши - Свойства).
Нас интересует свойство "Связи параметров выбора", которое мы настроим следующим образом:
4) Теперь необходимо создать макет (КРГ_ПриказОтзывИзОтпуска), если еще он не создан.
5) Непосредственно сам код:
Во-первых откройте модуль менеджера документа "Отпуск". Нам необходимо добавить в расширение процедуру "ДобавитьКомандыПечати" и "Печать".
Далее полный код модуля менеджера документа "Отпуск" в нашем расширении:
&НаСервере
Функция КРГ_ВыполнитьЗапрос(СсылкаНаДокументОтпуск)
Запрос = Новый Запрос;
Запрос.Текст = "
|//Получить ссылку на документ - отзыв из отпуска в текущем документе
|ВЫБРАТЬ
| КРГ_ДокументОтзывИзОтпуска КАК ДокументОтзывИзОтпуска
|ПОМЕСТИТЬ
| врДокументОтзывИзОтпуска
|ИЗ
| Документ.Отпуск КАК Отпуск
|ГДЕ
| Отпуск.Ссылка = &ТекущийДокумент
|;
|ВЫБРАТЬ
| ПериодыПриостановкиОтпуска.Ссылка КАК Ссылка,
| ПериодыПриостановкиОтпуска.ДатаНачалаПериода,
| ПериодыПриостановкиОтпуска.ДатаОкончанияПериода,
| ПериодыПриостановкиОтпуска.КоличествоДнейПриостановки
|ПОМЕСТИТЬ
| врПериодыПриостановкиОтпуска
|ИЗ
| Документ.Отпуск.ПериодыПриостановкиОтпуска КАК ПериодыПриостановкиОтпуска
|ЛЕВОЕ СОЕДИНЕНИЕ
| врДокументОтзывИзОтпуска КАК врДокументОтзывИзОтпуска
| ПО ПериодыПриостановкиОтпуска.Ссылка = врДокументОтзывИзОтпуска.ДокументОтзывИзОтпуска
|ГДЕ
| ПериодыПриостановкиОтпуска.Ссылка = врДокументОтзывИзОтпуска.ДокументОтзывИзОтпуска
|;
|ВЫБРАТЬ
| Отпуск.Дата КАК Дата,
| Отпуск.Номер КАК Номер,
| // данные сотрудника
| Отпуск.КРГ_ДокументОтзывИзОтпуска КАК ДокументОтзывИзОтпуска,
| Отпуск.Сотрудник КАК Сотрудник,
| Отпуск.Сотрудник.ФизическоеЛицо.Пол КАК Пол,
| Отпуск.Сотрудник.Код КАК ТабельныйНомер,
| КадроваяИсторияСотрудников.Должность КАК Должность,
| КадроваяИсторияСотрудников.Подразделение КАК Подразделение,
| // приостановка отпуска
| врПериодыПриостановкиОтпуска.ДатаНачалаПериода КАК НачалоПриостановки,
| врПериодыПриостановкиОтпуска.ДатаОкончанияПериода КАК ОкончаниеПриостановки,
| врПериодыПриостановкиОтпуска.КоличествоДнейПриостановки КАК КоличествоДнейПриостановки,
| //
| // основной отпуск
| Отпуск.ДатаНачалаОсновногоОтпуска КАК НачалоОтпуска,
| Отпуск.ДатаОкончанияОсновногоОтпуска КАК ОкончаниеОтпуска,
| Отпуск.КоличествоДнейОсновногоОтпуска КАК КоличествоДнейОтпуска,
| Отпуск.ВидРасчетаОсновногоОтпуска КАК ВидОтпуска,
| Отпуск.НачалоПериодаЗаКоторыйПредоставляетсяОтпуск КАК НачалоПериодаЗаКоторыйПредоставляетсяОтпуск,
| Отпуск.КонецПериодаЗаКоторыйПредоставляетсяОтпуск КАК КонецПериодаЗаКоторыйПредоставляетсяОтпуск,
| //
| // отозванный отпуск
| врПериодыПриостановкиОтпуска.Ссылка.ДатаНачалаОсновногоОтпуска КАК НачалоОтпускаОтзыв,
| врПериодыПриостановкиОтпуска.Ссылка.ДатаОкончанияОсновногоОтпуска КАК ОкончаниеОтпускаОтзыв,
| врПериодыПриостановкиОтпуска.Ссылка.КоличествоДнейОсновногоОтпуска КАК КоличествоДнейОтпускаОтзыв,
| врПериодыПриостановкиОтпуска.Ссылка.ВидРасчетаОсновногоОтпуска КАК ВидОтпускаОтзыв,
| врПериодыПриостановкиОтпуска.Ссылка.НачалоПериодаЗаКоторыйПредоставляетсяОтпуск КАК НачалоПериодаЗаКоторыйПредоставляетсяОтпускОтзыв,
| врПериодыПриостановкиОтпуска.Ссылка.КонецПериодаЗаКоторыйПредоставляетсяОтпуск КАК КонецПериодаЗаКоторыйПредоставляетсяОтпускОтзыв,
| // организация
| КадроваяИсторияСотрудников.Организация КАК Организация,
| Отпуск.Руководитель КАК Руководитель
|ИЗ
| Документ.Отпуск КАК Отпуск
|ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних КАК КадроваяИсторияСотрудников
| ПО КадроваяИсторияСотрудников.Сотрудник = Отпуск.Сотрудник
|ЛЕВОЕ СОЕДИНЕНИЕ
| врПериодыПриостановкиОтпуска КАК врПериодыПриостановкиОтпуска
| ПО Отпуск.КРГ_ДокументОтзывИзОтпуска = врПериодыПриостановкиОтпуска.Ссылка
|ГДЕ
| Отпуск.Ссылка = &ТекущийДокумент
| ИЛИ Отпуск.Ссылка = врПериодыПриостановкиОтпуска.Ссылка
|УПОРЯДОЧИТЬ ПО Отпуск.Дата ВОЗР ";
Запрос.УстановитьПараметр("ТекущийДокумент",СсылкаНаДокументОтпуск);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
// добавить результат запроса в структуру
Структура = Новый Структура;
Пока Выборка.Следующий() Цикл
Структура.Вставить("Дата",Выборка.Дата);
Структура.Вставить("Номер",Выборка.Номер);
Структура.Вставить("ДокументОтзывИзОтпуска",Выборка.ДокументОтзывИзОтпуска);
Структура.Вставить("Сотрудник",Выборка.Сотрудник);
Структура.Вставить("Пол",Выборка.Пол);
Структура.Вставить("ТабельныйНомер",Выборка.ТабельныйНомер);
Структура.Вставить("Должность",Выборка.Должность);
Структура.Вставить("Подразделение",Выборка.Подразделение);
Структура.Вставить("НачалоПриостановки",Выборка.НачалоПриостановки);
Структура.Вставить("ОкончаниеПриостановки",Выборка.ОкончаниеПриостановки);
Структура.Вставить("КоличествоДнейПриостановки",Выборка.КоличествоДнейПриостановки);
Структура.Вставить("НачалоОтпуска",Выборка.НачалоОтпуска);
Структура.Вставить("ОкончаниеОтпуска",Выборка.ОкончаниеОтпуска);
Структура.Вставить("КоличествоДнейОтпуска",Выборка.КоличествоДнейОтпуска);
Структура.Вставить("ВидОтпуска",Выборка.ВидОтпуска);
Структура.Вставить("НачалоПериодаЗаКоторыйПредоставляетсяОтпуск",Выборка.НачалоПериодаЗаКоторыйПредоставляетсяОтпуск);
Структура.Вставить("КонецПериодаЗаКоторыйПредоставляетсяОтпуск",Выборка.КонецПериодаЗаКоторыйПредоставляетсяОтпуск);
Структура.Вставить("НачалоОтпускаОтзыв",Выборка.НачалоОтпускаОтзыв);
Структура.Вставить("ОкончаниеОтпускаОтзыв",Выборка.ОкончаниеОтпускаОтзыв);
Структура.Вставить("КоличествоДнейОтпускаОтзыв",Выборка.КоличествоДнейОтпускаОтзыв);
Структура.Вставить("ВидОтпускаОтзыв",Выборка.ВидОтпускаОтзыв);
Структура.Вставить("НачалоПериодаЗаКоторыйПредоставляетсяОтпускОтзыв",Выборка.НачалоПериодаЗаКоторыйПредоставляетсяОтпускОтзыв);
Структура.Вставить("КонецПериодаЗаКоторыйПредоставляетсяОтпускОтзыв",Выборка.КонецПериодаЗаКоторыйПредоставляетсяОтпускОтзыв);
Структура.Вставить("Организация",Выборка.Организация);
Структура.Вставить("Руководитель",Выборка.Руководитель);
КонецЦикла;
Возврат Структура;
КонецФункции
&НаСервере
Функция КРГ_ПолучитьМакет()
Макет = Документы.Отпуск.ПолучитьМакет("КРГ_ПриказОтзывИзОтпуска");
Возврат Макет;
КонецФункции
&НаСервере
Функция КРГ_ПолучитьОбласть(Макет, Область)
Область = Макет.ПолучитьОбласть(Область);
Возврат Область;
КонецФункции
&Перед("ДобавитьКомандыПечати")
Процедура КРГ_ДобавитьКомандыПечати(КомандыПечати)
// печатная форма Отзыв из отпуска
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ОтзывИзОтпуска";
КомандаПечати.Представление = НСтр("ru = 'Отзыв из отпуска (мод)'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КонецПроцедуры
&НаСервере
Процедура КРГ_ВывестиОбласть(ТабличныйДокумент, Область, Структура)
Область.Параметры.НомерДокумента = структура.Номер;
Область.Параметры.ДатаДокумента = Формат(структура.Дата,"ДЛФ=Д");
Область.Параметры.Организация = структура.Организация;
Область.Параметры.ТабельныйНомер = структура.ТабельныйНомер;
Область.Параметры.Должность = структура.Должность;
Область.Параметры.Подразделение = структура.Подразделение;
Если Строка(Структура.Пол) = "Мужской" Тогда
Область.Параметры.Сотрудник = СклонениеПредставленийОбъектов.ПросклонятьФИО(Строка(структура.Сотрудник),2,,1);
ИначеЕсли Строка(Структура) = "Женский" Тогда
Область.Параметры.Сотрудник = СклонениеПредставленийОбъектов.ПросклонятьФИО(Строка(структура.Сотрудник),2,,2);
КонецЕсли;
Область.Параметры.НачалоПриостановки = Формат(структура.НачалоПриостановки,"ДЛФ=Д");
Область.Параметры.ОкончаниеПриостановки = Формат(структура.ОкончаниеПриостановки,"ДЛФ=Д");
Область.Параметры.КоличествоДнейПриостановки = структура.КоличествоДнейПриостановки;
Область.Параметры.ВидОтпуска = структура.ВидОтпуска;
Область.Параметры.НачалоПериодаЗаКоторыйПредоставляетсяОтпуск = Формат(структура.НачалоПериодаЗаКоторыйПредоставляетсяОтпуск,"ДЛФ=Д");
Область.Параметры.КонецПериодаЗаКоторыйПредоставляетсяОтпуск = Формат(структура.КонецПериодаЗаКоторыйПредоставляетсяОтпуск,"ДЛФ=Д");
// Область.Параметры.НачалоОтпускаОтзыв = структура.НачалоОтпускаОтзыв;
// Область.Параметры.ОкончаниеОтпускаОтзыв = структура.ОкончаниеОтпускаОтзыв;
// Область.Параметры.КоличествоДнейОтпускаОтзыв = структура.КоличествоДнейОтпускаОтзыв;
Область.Параметры.ВидОтпускаОтзыв = структура.ВидОтпускаОтзыв;
Область.Параметры.НачалоПериодаЗаКоторыйПредоставляетсяОтпускОтзыв = Формат(структура.НачалоПериодаЗаКоторыйПредоставляетсяОтпускОтзыв,"ДЛФ=Д");
Область.Параметры.КонецПериодаЗаКоторыйПредоставляетсяОтпускОтзыв = Формат(структура.КонецПериодаЗаКоторыйПредоставляетсяОтпускОтзыв,"ДЛФ=Д");
Область.Параметры.НачалоОтпуска = Формат(структура.НачалоОтпуска,"ДЛФ=Д");
Область.Параметры.ОкончаниеОтпуска = Формат(структура.ОкончаниеОтпуска,"ДЛФ=Д");
Область.Параметры.КоличествоДнейОтпуска = структура.КоличествоДнейОтпуска;
// Область.Параметры.Руководитель = ФизическиеЛицаКлиентСервер.ФамилияИнициалы(Строка(структура.Руководитель));
РуководствоОрганизации= ПодписиДокументов.ОтветственныеЛицаОрганизации(структура.Организация, "Руководитель", ТекущаяДата());
Область.Параметры.Руководитель = ФизическиеЛицаКлиентСервер.ФамилияИнициалы(Строка(РуководствоОрганизации.Руководитель));
Область.Параметры.ДолжностьРуководителя = Строка(РуководствоОрганизации.РуководительДолжность);
ТабличныйДокумент.Вывести(Область);
КонецПроцедуры
&Перед("Печать")
Процедура КРГ_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
// печатная форма Отзыв из отпуска
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ОтзывИзОтпуска") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,"ОтзывИзОтпуска", НСтр("ru = Отзыв из отпуска (мод)'"),КРГ_ОтзывИзОтпуска(УправлениеПечатью.МакетПечатнойФормы("Документ.Отпуск.КРГ_ПриказОтзывИзОтпуска"), МассивОбъектов, ОбъектыПечати), , "Документ.Отпуск.КРГ_ПриказОтзывИзОтпуска");
КонецЕсли;
КонецПроцедуры
Функция КРГ_ОтзывИзОтпуска(Макет, МассивОбъектов, ОбъектыПечати)
СсылкаНаДокумент = МассивОбъектов[0].Ссылка;
КРГ_ДокументОтзывИзОтпуска = МассивОбъектов[0].КРГ_ДокументОтзывИзОтпуска;
Если СсылкаНадокумент <> Неопределено И ЗначениеЗаполнено(КРГ_ДокументОтзывИзОтпуска) Тогда
ТабличныйДокумент = Новый ТабличныйДокумент;
Структура = КРГ_ВыполнитьЗапрос(СсылкаНаДокумент);
Если Структура <> Неопределено Тогда
ТабличныйДокумент.ИмяПараметровПечати = "Приказ об отзыве из отпуска работника";
Макет = КРГ_ПолучитьМакет();
Область1 = КРГ_ПолучитьОбласть(Макет, "Область1");
КРГ_ВывестиОбласть(ТабличныйДокумент, Область1, Структура);
ТабличныйДокумент.АвтоМасштаб = Истина;
Возврат ТабличныйДокумент;
КонецЕсли;
КонецЕсли;
КонецФункции
Запускаем...
Теперь смотрите, как использовать (как, например, у нас по согласованию с кадровиками).
Пример такой:
1. Документ 421-от - Сотрудник пошел в отпуск
2. Документ 109-к - сотрудник отозван 13.08 на 1 день
3. Документ 421/1-от сотрудник пошел отдыхать за счет того дня, когда был отозван из отпуска.
В данном случае мы в последнем документе 421/1-от ссылаемся на документ 109-к в котором он был отозван из отпуска:
После записи можно печатать нашу форму.