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

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 Сейчас в теме
Да никак по-хорошему. Придется копировать кучу процедур, кроме нескольких процедур из общих модулей.
Оставьте свое сообщение
Вакансии
Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день