Небольшая доработка к механизму отзыва из отпуска в ЗУП (+ печатная форма Отзыв из отпуска)

10.09.24

Задачи пользователя - Адаптация типовых решений

Здравствуйте! Наша организация завершила переход на ЗУП КОРП с внутренней программы. Среди множества проблем была и такая: в старой программе работники кадров имели документ "Отзыв из отпуска" в котором задавали дату/даты, когда работник был отозван. Данные из этого документа попадали в табель и печаталась прекрасная форма отзыва из отпуска сотрудника.

Итак... в ЗУП подобного механизма, как я понял, не имеется, а вместо этого предлагается выполнять исправление документа, где на вкладке "Продления, переносы, отзывы" заполняется период в который сотрудник был отозван из отпуска.

Проблема, собственно, заключается в том, что сформировать печатную форму к которой привыкли кадровики не представляется возможным, так как нужно связать 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-к в котором он был отозван из отпуска:

 

 

После записи можно печатать нашу форму.

См. также

Зарплата Регламентированный учет и отчетность Кадровый учет Обновление 1С Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Зарплата и Управление Персоналом 2.5 Бухгалтерский учет Налоговый учет Управленческий учет Акцизы ЕНВД ЕСН Земельный налог ИП, ПБОЮЛ, КФХ Налог на имущество Налог на прибыль НДС НДФЛ ФОМС, ЕФС Транспортный налог УСН ПСН (патентная система налогообложения) Платные (руб)

Обновления для конфигураций: КА 1.1; ЗУП 2.5; БУХ 2.0; КА 1.1 Комплексная автоматизация торговли алкогольной продукцией; КА 1.1 Комплексный учет сельскохозяйственного предприятия

27900 руб.

01.04.2020    145727    642    358    

234

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    10470    11    8    

13

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    5634    14    5    

24

Логистика, склад и ТМЦ Адаптация типовых решений Пользователь Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3896    11    0    

29

Загрузка и выгрузка в Excel Зарплата Кадровый учет Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Обработка позволяет загрузить из структурированного файла данные по физическим лицам, сотрудникам. Предусмотрено создание документов "Прием на работу". Данные загружаются не только в справочники и документы, но и в регистры сведений. Обработка разработана для конфигураций "Зарплата и Управление Персоналом, редакция 3.1"/"Зарплата и кадры государственного учреждения, редакция 3.1" на платформе 8.3.

6000 руб.

15.07.2015    64448    97    49    

101

Зарплата Кадровый учет Загрузка и выгрузка в Excel Бухгалтер Пользователь Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Обработка больше предназначена как основа для своей разработки, чем как универсальное решение. Но можно использовать и как готовое решение для небольшой организации. Переносит данные из файла Excel в ЗУП, по аналогии как данные переносятся из ЗУП 2.5.

7200 руб.

19.01.2023    6271    4    4    

5

Кадровый учет Печатные формы Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Электронный обходной лист в 1С предназначен для безбумажной работы с обходными листами, по возможности их автоматического заполнения, с возможностями управления полномочиями по созданию и подписи документов, назначения заместителей, для отсутствующих сотрудников, при увольнении.

9600 руб.

11.01.2022    13249    3    6    

9
Оставьте свое сообщение