1. Tsprogrammist1 83 04.06.18 10:52 Сейчас в теме

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

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

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

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

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

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

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

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

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

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

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

Вакансии

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

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

Работа от Инфостарт
Санкт-Петербург
Временный (на проект)

Руководитель отдела внедрения 1С
Новосибирск
зарплата от 60 000 руб. до 160 000 руб.
Полный день

Ведущий программист 1С
Сочи
зарплата от 82 500 руб. до 99 000 руб.
Полный день