helpf.pro
Регистрация

v8: Программно создать документ Отпуск организаций

FILIPPt
22.01.2017 17:33Прочитано: 2823

Здравствуйте, помогите разобраться, програмно создаю документ с видом перечисления "Отпуск ежегодный", а рабочий период не рассчитывается (РабочийГодС и РабочийГодПо,) . спасибо.

Yandex
Возможно, вас также заинтересует
Реклама на портале
all4cf
22.01.2017 21:07Ответ № 1

Вот рабочий пример, использую при расчете резервов на отпуска

Код 1C v 8.3
 	ДокОбъект = Документы.НачислениеОтпускаРаботникамОрганизаций.СоздатьДокумент();
ДокОбъект.Дата = ТекущаяДата();
Порядок = 1;
Скорость=0;
Для Каждого стр из ТЧРезервы Цикл
#Если НаКлиенте Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
// Отладка
Если НЕ СотрудникДляОтладки.Пустая() Тогда
Если СотрудникДляОтладки = стр.Сотрудник Тогда
// СТОП
#Если НаКлиенте Тогда
Сообщить("ВОТ ОН!!!");
#КонецЕсли
Иначе 
Продолжить;
КонецЕсли;
КонецЕсли;
СкорСтарт=ТекущаяДата();
//Прерывание
//Если Порядок>70 Тогда Прервать; КонецЕсли;
#Если НаКлиенте Тогда
Состояние("3. Обрабатывается " + Порядок +" из " + ВсегоСотрудников + ". Сотрудник: " + стр.Сотрудник+"  => Осталось ~ "+Строка(Цел(((ВсегоСотрудников-Порядок)*Скорость)/60))+" мин. (1 за "+Строка(Скорость)+" сек.)");
#КонецЕсли
Если стр.ДоходСначалаГода = 0 Тогда
стр.ДоходСначалаГода = РасчетБазыСтрВзносов(стр.Сотрудник, РабДата);
КонецЕсли;
Если стр.СреднеДневнойЗаработок = 0 Тогда
стр.СреднеДневнойЗаработок = РасчетСреднегоПоСотруднику(ДокОбъект,стр.Сотрудник, РабДата,1);
стр.ДатаНачалаРабочегоГода = ДокОбъект.РабочийГодС;
стр.ДатаОкончанияРабочегоГода = ДокОбъект.РабочийГодПО;
КонецЕсли;
Если стр.СреднеДневнойЗаработок = 0 Тогда // -12 месяцев
стр.СреднеДневнойЗаработок = РасчетСреднегоПоСотруднику(ДокОбъект,стр.Сотрудник, ДобавитьМесяц(РабДата, -12),1);
стр.ДатаНачалаРабочегоГода = ДокОбъект.РабочийГодС;
стр.ДатаОкончанияРабочегоГода = ДокОбъект.РабочийГодПО;
КонецЕсли;
Если стр.СреднеДневнойЗаработок = 0 Тогда // -24 месяцев
стр.СреднеДневнойЗаработок = РасчетСреднегоПоСотруднику(ДокОбъект,стр.Сотрудник, ДобавитьМесяц(РабДата, -24),1);
стр.ДатаНачалаРабочегоГода = ДокОбъект.РабочийГодС;
стр.ДатаОкончанияРабочегоГода = ДокОбъект.РабочийГодПО;
КонецЕсли;
Если стр.СреднеДневнойЗаработок = 0 Тогда // -36 месяцев
стр.СреднеДневнойЗаработок = РасчетСреднегоПоСотруднику(ДокОбъект,стр.Сотрудник, ДобавитьМесяц(РабДата, -36),1);
стр.ДатаНачалаРабочегоГода = ДокОбъект.РабочийГодС;
стр.ДатаОкончанияРабочегоГода = ДокОбъект.РабочийГодПО;
КонецЕсли;
Если стр.СреднеДневнойЗаработок = 0 Тогда // -48 месяцев
стр.СреднеДневнойЗаработок = РасчетСреднегоПоСотруднику(ДокОбъект,стр.Сотрудник, ДобавитьМесяц(РабДата, -48),1);
стр.ДатаНачалаРабочегоГода = ДокОбъект.РабочийГодС;
стр.ДатаОкончанияРабочегоГода = ДокОбъект.РабочийГодПО;
ИначеЕсли стр.СреднеДневнойЗаработок = 0 Тогда
стр.СреднеДневнойЗаработок = 1;
КонецЕсли;
Скорость = ТекущаяДата()-СкорСтарт;
Порядок = Порядок + 1;
КонецЦикла;
Попытка
ДокОбъект.Удалить();
Исключение
#Если НаКлиенте Тогда
Сообщить(ОписаниеОшибки());
#КонецЕсли
КонецПопытки; 

Функция РасчетСреднегоПоСотруднику(Документ, Сотрудник, Период, ОстатокОтпуска) Экспорт
//Документ.Дата              = Период;
Документ.ПериодРегистрации = НачалоМесяца(Период);
Документ.Организация       = Сотрудник.ОбособленноеПодразделение;
Документ.Сотрудник         = Сотрудник;
Документ.Физлицо           = Сотрудник.ФизЛицо;
Документ.ДатаНачалаСобытия = Период;
Документ.ОсновнойОтпуск    = Истина;

Документ.ДатаНачалаОсновногоОтпуска    = Период;
Документ.ДатаОкончанияОсновногоОтпуска = Период + ((ОстатокОтпуска-1) * ДлинаСуток);
Документ.ДатаВыплатыДохода = Период + ((ОстатокОтпуска-1) * ДлинаСуток);
Документ.КоличествоДнейОсновногоОтпуска = ОстатокОтпуска;
Документ.ПорядокРасчетаОсновногоОтпуска = Перечисления.ПорядокРасчетаОтпуска.ПоКалендарнымДням;

// способ расчета Рабочего года и остатков отпуска 
ЗаполнитьЗначенияСвойств(Документ,ПроцедурыУправленияПерсоналом.РассчитатьПериодРаботыДляОсновногоОтпуска(Документ.Ссылка, Сотрудник, Документ.ДатаНачалаОсновногоОтпуска, Документ.ДатаОкончанияОсновногоОтпуска));

Документ.ОпределитьРасчетныйПериод();

//МассивТаблиц = НачислениеОтпускаРаботникамОрганизацийПереопределяемый.ПолучитьМассивТабличныхЧастей(Документ, "ПолныйРасчет");
МассивТаблиц = ПолучитьМассивТабличныхЧастей(Документ, "ПолныйРасчет");

Для каждого ТабличнаяЧасть Из МассивТаблиц Цикл
ТабличнаяЧасть.Очистить();
КонецЦикла;
ЗаписьЖурналаРегистрации("Расчет резерва", УровеньЖурналаРегистрации.Информация, , ,"Документ отпуск: " +Строка(Документ.Номер)+" от "+Формат(Документ.дата,"ДФ=dd.MM.yyyy"));
  Документ.Записать();

мРассчитываемыеТаблицы.Начисления = Ложь;
мРассчитываемыеТаблицы.РасчетСреднего = Истина;

Документ.Рассчитать(мРассчитываемыеТаблицы);
Документ.Записать();

СуммаОтпускных = 0;
//Это используется когда считаются отпускные
//Для каждого СтрокаНачислений Из Документ.Начисления Цикл
// СуммаОтпускных = СуммаОтпускных + СтрокаНачислений.Результат;
//КонецЦикла;
мСведенияОВидахРасчета = Новый Соответствие;
ВариантРасчетаДокумента = Документ.ОсновнойВариантРасчетаДокумента();
ВидРасчета = ВариантРасчетаДокумента.ВидРасчета;
СведениеОВидеРасчета = ПроведениеРасчетов.ПолучитьСведенияОВидеРасчета(мСведенияОВидахРасчета, ВидРасчета);
МесяцевРасчетногоПериода = ?(СведениеОВидеРасчета.ПорядокОпределенияРасчетногоПериодаСреднегоЗаработка = Перечисления.ПорядокОпределенияРасчетногоПериодаСреднегоЗаработка.ПоКолдоговору,СведениеОВидеРасчета.ПериодРасчетаСреднегоЗаработка,НачислениеОтпускаРаботникамОрганизацийПереопределяемый.КоличествоМесяцевРасчетаПоЗакону(Документ));
СуммаОтпускных = Формат(НачислениеОтпускаРаботникамОрганизацийПереопределяемый.РасчетСреднегоЗаработка(Документ, СведениеОВидеРасчета.СпособРасчета, МесяцевРасчетногоПериода, Документ.ПериодРасчетаСреднегоЗаработкаНачало, Документ.ПериодРасчетаСреднегоЗаработкаОкончание),  "ЧЦ=12; ЧДЦ=2; ЧН=");

Возврат СуммаОтпускных;
КонецФункции
Подсказка: Для быстрого перемещения к последнему ответу или к вопросу используйте или .
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.