ЗУП: программно заполнить документ Увольнение
По теме из базы знаний
Найденные решения
(1) Проверила, все работает. Копировать пришлось только процедуру расчета дней компенсации
&НаСервере
Функция СоздатьДокументУвольнениеНаСервере()
НовДок = Документы.Увольнение.СоздатьДокумент();
НовДок.Дата = Объект.Дата;
НовДок.Организация = Объект.Организация;
НовДок.Сотрудник = СтрокаТЧ.Сотрудник;
НовДок.ПериодРегистрации = НачалоМесяца(НовДок.Дата);
НовДок.ДатаУвольнения = НовДок.Дата;
НовДок.НачислитьЗарплату = Истина;
НовДок.МесяцНачалаРасчетов = НачалоМесяца(ТекущаяДата()); //обязательно для заполнения
РассчитатьКоличествоДнейКомпенсацииУдержанияОтпускаНаСервере (НовДок);
Попытка
НовДок.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Возврат НовДок.Ссылка;
КонецФункции
&НаКлиенте
Процедура СоздатьДокументУвольнение(Команда)
док = СоздатьДокументУвольнениеНаСервере();
Парам = Новый Структура("Ключ", Док);
Форма = ПолучитьФорму("Документ.Увольнение.Форма.ФормаДокумента", Парам);
Форма.открыть();
Форма.РассчитатьНачисления(Команда);
КонецПроцедуры
&НаСервере
Процедура РассчитатьКоличествоДнейКомпенсацииУдержанияОтпускаНаСервере (Объект)
Объект.ПризнакКомпенсацииУдержанияОтпуска = Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.НеИспользовать;
Объект.ДнейКомпенсацииУдержанияОтпуска = Неопределено;
Объект.РабочийГодС = Неопределено;
Объект.РабочийГодПо = Неопределено;
Объект.ДополнительныеОтпуска.Очистить();
Если Не ЗначениеЗаполнено(Объект.Сотрудник) Или Не ЗначениеЗаполнено(Объект.ДатаУвольнения) Тогда
Возврат
КонецЕсли;
ИсключаемыеРегистраторы = Новый Массив;
ИсключаемыеРегистраторы.Добавить(Объект.ссылка);
//Добавить, если нужно
//Если ЗначениеЗаполнено(Объект.СсылкаНаИсправленныйДокумент) Тогда
// ИсключаемыеРегистраторы.Добавить(Объект.СсылкаНаИсправленныйДокумент);
//КонецЕсли;
Результат = ОстаткиОтпусков.ОстатокОтпускаСотрудникаНаДату(Объект.Сотрудник, Объект.ДатаУвольнения, ИсключаемыеРегистраторы, Истина);
Объект.РабочийГодС = Результат.РабочийГодС;
Объект.РабочийГодПо = Мин(Объект.ДатаУвольнения, Результат.РабочийГодПо);
ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении = ОстаткиОтпусков.ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении();
Для Каждого Остаток Из Результат.ОстаткиВРазрезеВидовОтпусков Цикл
Если НЕ ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении.Найти(Остаток.ВидЕжегодногоОтпуска) = Неопределено Тогда
Продолжить;
КонецЕсли;
Если Остаток.ВидЕжегодногоОтпуска = ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыОтпусков.Основной") Тогда
Объект.ПризнакКомпенсацииУдержанияОтпуска = ?(Остаток.КоличествоДней > 0, Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные,Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом);
Объект.ДнейКомпенсацииУдержанияОтпуска = ?(Остаток.КоличествоДней > 0, Остаток.КоличествоДней, Остаток.КоличествоДней * (-1));
Объект.РабочийГодС = Остаток.РабочийГодС;
Объект.РабочийГодПо = Мин(Объект.ДатаУвольнения, Остаток.РабочийГодПо);
Иначе
Если ПолучитьФункциональнуюОпцию("ИспользоватьРасчетЗарплатыРасширенная") Тогда
Строка = Объект.ДополнительныеОтпуска.Добавить();
Строка.ВидОтпуска = Остаток.ВидЕжегодногоОтпуска;
Строка.ПризнакКомпенсацииУдержания = ?(Остаток.КоличествоДней > 0, Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные,Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом);
Строка.ДнейКомпенсацииУдержания = ?(Остаток.КоличествоДней > 0, Остаток.КоличествоДней, Остаток.КоличествоДней * (-1));
Строка.НачалоПериодаЗаКоторыйПредоставляетсяОтпуск = Остаток.РабочийГодС;
Строка.КонецПериодаЗаКоторыйПредоставляетсяОтпуск = Мин(Объект.ДатаУвольнения, Остаток.РабочийГодПо);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьОстальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(1) Проверила, все работает. Копировать пришлось только процедуру расчета дней компенсации
&НаСервере
Функция СоздатьДокументУвольнениеНаСервере()
НовДок = Документы.Увольнение.СоздатьДокумент();
НовДок.Дата = Объект.Дата;
НовДок.Организация = Объект.Организация;
НовДок.Сотрудник = СтрокаТЧ.Сотрудник;
НовДок.ПериодРегистрации = НачалоМесяца(НовДок.Дата);
НовДок.ДатаУвольнения = НовДок.Дата;
НовДок.НачислитьЗарплату = Истина;
НовДок.МесяцНачалаРасчетов = НачалоМесяца(ТекущаяДата()); //обязательно для заполнения
РассчитатьКоличествоДнейКомпенсацииУдержанияОтпускаНаСервере (НовДок);
Попытка
НовДок.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Возврат НовДок.Ссылка;
КонецФункции
&НаКлиенте
Процедура СоздатьДокументУвольнение(Команда)
док = СоздатьДокументУвольнениеНаСервере();
Парам = Новый Структура("Ключ", Док);
Форма = ПолучитьФорму("Документ.Увольнение.Форма.ФормаДокумента", Парам);
Форма.открыть();
Форма.РассчитатьНачисления(Команда);
КонецПроцедуры
&НаСервере
Процедура РассчитатьКоличествоДнейКомпенсацииУдержанияОтпускаНаСервере (Объект)
Объект.ПризнакКомпенсацииУдержанияОтпуска = Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.НеИспользовать;
Объект.ДнейКомпенсацииУдержанияОтпуска = Неопределено;
Объект.РабочийГодС = Неопределено;
Объект.РабочийГодПо = Неопределено;
Объект.ДополнительныеОтпуска.Очистить();
Если Не ЗначениеЗаполнено(Объект.Сотрудник) Или Не ЗначениеЗаполнено(Объект.ДатаУвольнения) Тогда
Возврат
КонецЕсли;
ИсключаемыеРегистраторы = Новый Массив;
ИсключаемыеРегистраторы.Добавить(Объект.ссылка);
//Добавить, если нужно
//Если ЗначениеЗаполнено(Объект.СсылкаНаИсправленныйДокумент) Тогда
// ИсключаемыеРегистраторы.Добавить(Объект.СсылкаНаИсправленныйДокумент);
//КонецЕсли;
Результат = ОстаткиОтпусков.ОстатокОтпускаСотрудникаНаДату(Объект.Сотрудник, Объект.ДатаУвольнения, ИсключаемыеРегистраторы, Истина);
Объект.РабочийГодС = Результат.РабочийГодС;
Объект.РабочийГодПо = Мин(Объект.ДатаУвольнения, Результат.РабочийГодПо);
ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении = ОстаткиОтпусков.ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении();
Для Каждого Остаток Из Результат.ОстаткиВРазрезеВидовОтпусков Цикл
Если НЕ ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении.Найти(Остаток.ВидЕжегодногоОтпуска) = Неопределено Тогда
Продолжить;
КонецЕсли;
Если Остаток.ВидЕжегодногоОтпуска = ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыОтпусков.Основной") Тогда
Объект.ПризнакКомпенсацииУдержанияОтпуска = ?(Остаток.КоличествоДней > 0, Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные,Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом);
Объект.ДнейКомпенсацииУдержанияОтпуска = ?(Остаток.КоличествоДней > 0, Остаток.КоличествоДней, Остаток.КоличествоДней * (-1));
Объект.РабочийГодС = Остаток.РабочийГодС;
Объект.РабочийГодПо = Мин(Объект.ДатаУвольнения, Остаток.РабочийГодПо);
Иначе
Если ПолучитьФункциональнуюОпцию("ИспользоватьРасчетЗарплатыРасширенная") Тогда
Строка = Объект.ДополнительныеОтпуска.Добавить();
Строка.ВидОтпуска = Остаток.ВидЕжегодногоОтпуска;
Строка.ПризнакКомпенсацииУдержания = ?(Остаток.КоличествоДней > 0, Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные,Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом);
Строка.ДнейКомпенсацииУдержания = ?(Остаток.КоличествоДней > 0, Остаток.КоличествоДней, Остаток.КоличествоДней * (-1));
Строка.НачалоПериодаЗаКоторыйПредоставляетсяОтпуск = Остаток.РабочийГодС;
Строка.КонецПериодаЗаКоторыйПредоставляетсяОтпуск = Мин(Объект.ДатаУвольнения, Остаток.РабочийГодПо);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(6) А как программа поймет что нужно рассчитать документ созданный мной? Вот мой код. мне теперь ссылку созданного документа перекинуть на клиент там его открыть и рассчитать???
&НаСервере
Процедура СоздатьДокументУвольнениеНаСервере()
НовДок = Документы.Увольнение.СоздатьДокумент();
НовДок.Дата = Объект.Дата;
НовДок.Организация = Объект.Организация;
НовДок.Сотрудник = СтрокаТЧ.Сотрудник;
НовДок.ПериодРегистрации = НачалоМесяца(НовДок.Дата);
НовДок.ДатаУвольнения = НовДок.Дата;
НовДок.НачислитьЗарплату=Истина;
НовДок.Записать();
&НаСервере
Процедура СоздатьДокументУвольнениеНаСервере()
НовДок = Документы.Увольнение.СоздатьДокумент();
НовДок.Дата = Объект.Дата;
НовДок.Организация = Объект.Организация;
НовДок.Сотрудник = СтрокаТЧ.Сотрудник;
НовДок.ПериодРегистрации = НачалоМесяца(НовДок.Дата);
НовДок.ДатаУвольнения = НовДок.Дата;
НовДок.НачислитьЗарплату=Истина;
НовДок.Записать();
(7)Дальше нужно выполнить такой код:
&НаСервере
Процедура ВыполнитьРасчетНачисленийНаСервере()
Если РасчетЗарплатыРасширенныйКлиентСервер.ФормаДокументаГотоваДляРасчетаЗарплаты(ЭтаФорма, ОписаниеДокумента(ЭтаФорма), Ложь) Тогда
ВремяНачалаЗамера = ОценкаПроизводительности.НачатьЗамерВремени();
РассчитатьНачисленияНаСервере();
ЗарплатаКадрыРасширенныйКлиентСервер.СброситьФлагНеобходимостиВыполненияРасчета(ЭтаФорма);
ОценкаПроизводительности.ЗакончитьЗамерВремени("РасчетДокументаУвольнение", ВремяНачалаЗамера);
Иначе
ОчиститьРассчитанныеДанные();
ПерезаполнятьСреднийЗаработок = Истина;
КонецЕсли;
КонецПроцедуры
Показать
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)