ЗУП: программно заполнить документ Увольнение

1. Tsprogrammist1 85 04.06.18 10:52 Сейчас в теме
Всем привет. Я создал документ (програмно), записал его, добавил сотрудника и т.п. как В Зиуп 3 программно рассчитать документ "Увольнение".
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
12. Bene_Valete 188 05.06.18 10:38 Сейчас в теме +2 $m
(1) Проверила, все работает. Копировать пришлось только процедуру расчета дней компенсации

&НаСервере
Функция СоздатьДокументУвольнениеНаСервере()
	
	НовДок = Документы.Увольнение.СоздатьДокумент(); 
	НовДок.Дата = Объект.Дата; 
	НовДок.Организация = Объект.Организация; 

	НовДок.Сотрудник = СтрокаТЧ.Сотрудник; 
	НовДок.ПериодРегистрации = НачалоМесяца(НовДок.Дата); 
	НовДок.ДатаУвольнения = НовДок.Дата; 
	НовДок.НачислитьЗарплату = Истина; 
	НовДок.МесяцНачалаРасчетов = НачалоМесяца(ТекущаяДата()); //обязательно для заполнения
	
	РассчитатьКоличествоДнейКомпенсацииУдержанияОтпускаНаСервере­(НовДок);	
	
	Попытка
		НовДок.Записать();
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
	Возврат НовДок.Ссылка;
	
КонецФункции

&НаКлиенте
Процедура СоздатьДокументУвольнение(Команда)
	
	док = СоздатьДокументУвольнениеНаСервере();
	Парам = Новый Структура("Ключ", Док);
	
	Форма =  ПолучитьФорму("Документ.Увольнение.Форма.ФормаДокумента", Парам); 
	Форма.открыть();
	
	Форма.РассчитатьНачисления(Команда);
	
КонецПроцедуры

&НаСервере
Процедура РассчитатьКоличествоДнейКомпенсацииУдержанияОтпускаНаСервере­(Объект)
	
	Объект.ПризнакКомпенсацииУдержанияОтпуска = Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.НеИспользовать;
	Объект.ДнейКомпенсацииУдержанияОтпуска = Неопределено;  
	Объект.РабочийГодС = Неопределено; 
	Объект.РабочийГодПо = Неопределено;
	Объект.ДополнительныеОтпуска.Очистить();
	
	Если Не ЗначениеЗаполнено(Объект.Сотрудник) Или Не ЗначениеЗаполнено(Объект.ДатаУвольнения) Тогда
		Возврат
	КонецЕсли;
	
	ИсключаемыеРегистраторы = Новый Массив;
	ИсключаемыеРегистраторы.Добавить(Объект.ссылка);
	
	//Добавить, если нужно
	//Если ЗначениеЗаполнено(Объект.СсылкаНаИсправленныйДокумент) Тогда
	//	ИсключаемыеРегистраторы.Добавить(Объект.СсылкаНаИсправленныйДокумент);
	//КонецЕсли;
	
	Результат = ОстаткиОтпусков.ОстатокОтпускаСотрудникаНаДату(Объект.Сотрудник, Объект.ДатаУвольнения, ИсключаемыеРегистраторы, Истина);
	
	Объект.РабочийГодС	= Результат.РабочийГодС;
	Объект.РабочийГодПо	= Мин(Объект.ДатаУвольнения, Результат.РабочийГодПо);
	
	ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении = ОстаткиОтпусков.ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении();
	
	Для Каждого Остаток Из Результат.ОстаткиВРазрезеВидовОтпусков Цикл
		Если НЕ ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении.Найти(Остаток.ВидЕжегодногоОтпуска) = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Если Остаток.ВидЕжегодногоОтпуска = ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыОтпусков.Основной") Тогда
			Объект.ПризнакКомпенсацииУдержанияОтпуска	= ?(Остаток.КоличествоДней > 0, Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные,Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом);
			Объект.ДнейКомпенсацииУдержанияОтпуска		= ?(Остаток.КоличествоДней > 0, Остаток.КоличествоДней, Остаток.КоличествоДней * (-1));
			Объект.РабочийГодС = Остаток.РабочийГодС;
			Объект.РабочийГодПо = Мин(Объект.ДатаУвольнения, Остаток.РабочийГодПо);
		Иначе
			Если ПолучитьФункциональнуюОпцию("ИспользоватьРасчетЗарплатыРасширенная") Тогда
				Строка = Объект.ДополнительныеОтпуска.Добавить();
				Строка.ВидОтпуска									= Остаток.ВидЕжегодногоОтпуска;
				Строка.ПризнакКомпенсацииУдержания					= ?(Остаток.КоличествоДней > 0, Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные,Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом);
				Строка.ДнейКомпенсацииУдержания						= ?(Остаток.КоличествоДней > 0, Остаток.КоличествоДней, Остаток.КоличествоДней * (-1));
				Строка.НачалоПериодаЗаКоторыйПредоставляетсяОтпуск 	= Остаток.РабочийГодС;
				Строка.КонецПериодаЗаКоторыйПредоставляетсяОтпуск 	= Мин(Объект.ДатаУвольнения, Остаток.РабочийГодПо);
			КонецЕсли;  
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры
Показать
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
12. Bene_Valete 188 05.06.18 10:38 Сейчас в теме +2 $m
(1) Проверила, все работает. Копировать пришлось только процедуру расчета дней компенсации

&НаСервере
Функция СоздатьДокументУвольнениеНаСервере()
	
	НовДок = Документы.Увольнение.СоздатьДокумент(); 
	НовДок.Дата = Объект.Дата; 
	НовДок.Организация = Объект.Организация; 

	НовДок.Сотрудник = СтрокаТЧ.Сотрудник; 
	НовДок.ПериодРегистрации = НачалоМесяца(НовДок.Дата); 
	НовДок.ДатаУвольнения = НовДок.Дата; 
	НовДок.НачислитьЗарплату = Истина; 
	НовДок.МесяцНачалаРасчетов = НачалоМесяца(ТекущаяДата()); //обязательно для заполнения
	
	РассчитатьКоличествоДнейКомпенсацииУдержанияОтпускаНаСервере­(НовДок);	
	
	Попытка
		НовДок.Записать();
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
	Возврат НовДок.Ссылка;
	
КонецФункции

&НаКлиенте
Процедура СоздатьДокументУвольнение(Команда)
	
	док = СоздатьДокументУвольнениеНаСервере();
	Парам = Новый Структура("Ключ", Док);
	
	Форма =  ПолучитьФорму("Документ.Увольнение.Форма.ФормаДокумента", Парам); 
	Форма.открыть();
	
	Форма.РассчитатьНачисления(Команда);
	
КонецПроцедуры

&НаСервере
Процедура РассчитатьКоличествоДнейКомпенсацииУдержанияОтпускаНаСервере­(Объект)
	
	Объект.ПризнакКомпенсацииУдержанияОтпуска = Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.НеИспользовать;
	Объект.ДнейКомпенсацииУдержанияОтпуска = Неопределено;  
	Объект.РабочийГодС = Неопределено; 
	Объект.РабочийГодПо = Неопределено;
	Объект.ДополнительныеОтпуска.Очистить();
	
	Если Не ЗначениеЗаполнено(Объект.Сотрудник) Или Не ЗначениеЗаполнено(Объект.ДатаУвольнения) Тогда
		Возврат
	КонецЕсли;
	
	ИсключаемыеРегистраторы = Новый Массив;
	ИсключаемыеРегистраторы.Добавить(Объект.ссылка);
	
	//Добавить, если нужно
	//Если ЗначениеЗаполнено(Объект.СсылкаНаИсправленныйДокумент) Тогда
	//	ИсключаемыеРегистраторы.Добавить(Объект.СсылкаНаИсправленныйДокумент);
	//КонецЕсли;
	
	Результат = ОстаткиОтпусков.ОстатокОтпускаСотрудникаНаДату(Объект.Сотрудник, Объект.ДатаУвольнения, ИсключаемыеРегистраторы, Истина);
	
	Объект.РабочийГодС	= Результат.РабочийГодС;
	Объект.РабочийГодПо	= Мин(Объект.ДатаУвольнения, Результат.РабочийГодПо);
	
	ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении = ОстаткиОтпусков.ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении();
	
	Для Каждого Остаток Из Результат.ОстаткиВРазрезеВидовОтпусков Цикл
		Если НЕ ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении.Найти(Остаток.ВидЕжегодногоОтпуска) = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Если Остаток.ВидЕжегодногоОтпуска = ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыОтпусков.Основной") Тогда
			Объект.ПризнакКомпенсацииУдержанияОтпуска	= ?(Остаток.КоличествоДней > 0, Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные,Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом);
			Объект.ДнейКомпенсацииУдержанияОтпуска		= ?(Остаток.КоличествоДней > 0, Остаток.КоличествоДней, Остаток.КоличествоДней * (-1));
			Объект.РабочийГодС = Остаток.РабочийГодС;
			Объект.РабочийГодПо = Мин(Объект.ДатаУвольнения, Остаток.РабочийГодПо);
		Иначе
			Если ПолучитьФункциональнуюОпцию("ИспользоватьРасчетЗарплатыРасширенная") Тогда
				Строка = Объект.ДополнительныеОтпуска.Добавить();
				Строка.ВидОтпуска									= Остаток.ВидЕжегодногоОтпуска;
				Строка.ПризнакКомпенсацииУдержания					= ?(Остаток.КоличествоДней > 0, Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные,Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом);
				Строка.ДнейКомпенсацииУдержания						= ?(Остаток.КоличествоДней > 0, Остаток.КоличествоДней, Остаток.КоличествоДней * (-1));
				Строка.НачалоПериодаЗаКоторыйПредоставляетсяОтпуск 	= Остаток.РабочийГодС;
				Строка.КонецПериодаЗаКоторыйПредоставляетсяОтпуск 	= Мин(Объект.ДатаУвольнения, Остаток.РабочийГодПо);
			КонецЕсли;  
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры
Показать
+
13. hlopotov1993 2 20.04.19 12:56 Сейчас в теме
Чтобы рассчитался средний заработок добавьте эти строки
НовДок.ПериодРасчетаСреднегоЗаработкаНачало = ДатаПриема;
НовДок.ПериодРасчетаСреднегоЗаработкаОкончание  = ДокУвольнения;
+
2. user633533_encantado 11 04.06.18 10:56 Сейчас в теме
Посмотрите как команда расчета документа вызывается из формы. Если она экспортная, то просто вызовите ее, если нет, то скопируйте код в свою обработку.
+
4. Tsprogrammist1 85 04.06.18 11:04 Сейчас в теме
(2) если есть возможность .. сможете привести пример кода?
+
3. Tsprogrammist1 85 04.06.18 11:03 Сейчас в теме
Функция расчета на форме экспортная. , но я не знаю как вызвать экспортную функцию которая находится на форме... (((
+
5. mylogin 107 04.06.18 11:08 Сейчас в теме +2 $m
(3) Получить форму документа и вызвать функцию
+
6. user633533_encantado 11 04.06.18 11:08 Сейчас в теме +1 $m
&НаКлиенте
Процедура Команда1(Команда)
	
	ФормаДокумента = ПолучитьФорму("Документ.Увольнение.Форма.ФормаДокумента");
	
	ФормаДокумента.РассчитатьНачисления(Неопределено);
	
КонецПроцедуры
Показать
+
7. Tsprogrammist1 85 04.06.18 11:23 Сейчас в теме
(6) А как программа поймет что нужно рассчитать документ созданный мной? Вот мой код. мне теперь ссылку созданного документа перекинуть на клиент там его открыть и рассчитать???

&НаСервере
Процедура СоздатьДокументУвольнениеНаСервере()
НовДок = Документы.Увольнение.СоздатьДокумент();
НовДок.Дата = Объект.Дата;
НовДок.Организация = Объект.Организация;
НовДок.Сотрудник = СтрокаТЧ.Сотрудник;
НовДок.ПериодРегистрации = НачалоМесяца(НовДок.Дата);
НовДок.ДатаУвольнения = НовДок.Дата;
НовДок.НачислитьЗарплату=Истина;
НовДок.Записать();
+
8. user705522_constantin_h 35 04.06.18 11:47 Сейчас в теме
(7)Дальше нужно выполнить такой код:
&НаСервере
Процедура ВыполнитьРасчетНачисленийНаСервере()
	
	Если РасчетЗарплатыРасширенныйКлиентСервер.ФормаДокументаГотоваДляРасчетаЗарплаты(ЭтаФорма, ОписаниеДокумента(ЭтаФорма), Ложь) Тогда
		ВремяНачалаЗамера = ОценкаПроизводительности.НачатьЗамерВремени();
		РассчитатьНачисленияНаСервере();
		ЗарплатаКадрыРасширенныйКлиентСервер.СброситьФлагНеобходимостиВыполненияРасчета(ЭтаФорма);
		ОценкаПроизводительности.ЗакончитьЗамерВремени("РасчетДокументаУвольнение", ВремяНачалаЗамера);
	Иначе 
		ОчиститьРассчитанныеДанные();
		ПерезаполнятьСреднийЗаработок = Истина;
	КонецЕсли;
	
КонецПроцедуры
Показать
+
10. user705522_constantin_h 35 04.06.18 12:05 Сейчас в теме
(7)Только в коде заменить ЭтаФорма на ВладелецФормы.
+
11. user633533_encantado 11 04.06.18 14:10 Сейчас в теме
(7) В форму документа передать параметр с ключем, где ключ - ссылка на новый документ.
Пример даже в синтаксис помощнике есть.
+
9. haereticus 04.06.18 11:54 Сейчас в теме
Да никак по-хорошему. Придется копировать кучу процедур, кроме нескольких процедур из общих модулей.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот