Имя: Пароль:
1C
1С v8
ЗуП отчет по расчету резервов отпусков.
0 ИУБиПовиц
 
12.02.14
10:20
Добрый день. Делаю отчет показывающий примерную сумму резервов на дату, и почему то данные отличаются чем если руками считать.

Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    РаботникиОрганизацийСрезПоследних.Сотрудник
        |ИЗ
        |    РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Дата, ) КАК РаботникиОрганизацийСрезПоследних
        |
        |УПОРЯДОЧИТЬ ПО
        |    РаботникиОрганизацийСрезПоследних.Сотрудник.Наименование";
        
        Запрос.УстановитьПараметр("Дата",КонецДня(ДатаОтчета));    
        
        Результат = Запрос.Выполнить();
        
        ВыборкаДетальныеЗаписи = Результат.Выгрузить();
        МассивСотров = ВыборкаДетальныеЗаписи.ВыгрузитьКолонку("Сотрудник");
        Остаток = ОстаткиОтпусков.ОстатокОтпускаСпискаСотрудниковНаДату( МассивСотров,ДатаОтчета);
        Остаток.Колонки.Добавить("СреднедневнойЗаработок");
        НачатьТранзакцию();
        Док = Документы.НачислениеОтпускаРаботникамОрганизаций.СоздатьДокумент();
        Док.Дата = КонецГода(ТекущаяДата());
        Док.Комментарий = "для расчета резерва";
        Док.Организация = Справочники.Организации.НайтиПоКоду("000000043");
        Док.Записать(РежимЗаписиДокумента.Запись);

        
        для каждого стр из остаток цикл
            
            Стр.СреднедневнойЗаработок = 0;
            Если Стр.ОстатокНаДату <= 0 тогда
                Продолжить;
            КонецЕсли;

            
            Док.Сотрудник = Стр.Сотрудник;
            Состояние("Обработка сотрудника " + Док.Сотрудник);
            Док.ДатаНачалаСобытия = ДатаОтчета;
            Док.ОсновнойОтпуск=Истина;
            Док.ПорядокРасчетаОсновногоОтпуска=Перечисления.ПорядокРасчетаОтпуска.ПоКалендарнымДням;
            Док.ДатаНачалаОсновногоОтпуска = ДатаОтчета;
            Док.КоличествоДнейОсновногоОтпуска = Стр.ОстатокНаДату;  
            Док.ДатаОкончанияОсновногоОтпуска =  ДатаОтчета + Стр.ОстатокНаДату;
                        
            
            ЗаполнениеДокументовЗК.ЗаполнитьДатыОтпуска(ДатаОтчета, Док.ДатаОкончанияОсновногоОтпуска,1,,,ЛОЖЬ );
            ЗаполнениеДокументовЗК.ЗаполнитьДатуВыплатыОтпускных(Док, Док.ДатаНачалаОсновногоОтпуска);
            
            
            
            
            ЗаполнитьЗначенияСвойств(Док, ОстаткиОтпусков.РабочийГодПериодаОтпуска(
            Док.Сотрудник, Док.ДатаНачалаОсновногоОтпуска, Док.ДатаОкончанияОсновногоОтпуска, Док.Ссылка, Док.ПорядокРасчетаОсновногоОтпуска, Не Док.ОсновнойОтпуск, Док.ВидРасчетаДополнительногоОтпуска, Док.ДатаНачалаДополнительногоОтпуска, Док.ДатаОкончанияДополнительногоОтпуска));
            
            
            Док.ПериодРасчетаСреднегоЗаработкаНачало = Док.РабочийГодС;
            Док.ПериодРасчетаСреднегоЗаработкаОкончание= Док.РабочийГодПо;
            Док.ПериодРегистрации = НачалоМесяца(ДатаОтчета);
            
            
            Док.Записать(РежимЗаписиДокумента.Запись);
            
            
            мРассчитываемыеТаблицы = Новый Структура("Начисления,РасчетСреднего");
            мРассчитываемыеТаблицы.Начисления = Истина;
            мРассчитываемыеТаблицы.РасчетСреднего = Истина;

           Док.Рассчитать(мРассчитываемыеТаблицы);
          
           мСведенияОВидахРасчета = Новый Соответствие;

           ВариантРасчетаДокумента = Док.ОсновнойВариантРасчетаДокумента();
           ВидРасчета = ВариантРасчетаДокумента.ВидРасчета;
          
           Если ЗначениеЗаполнено(ВидРасчета) Тогда
              
               СведениеОВидеРасчета = ПроведениеРасчетов.ПолучитьСведенияОВидеРасчета(мСведенияОВидахРасчета, ВидРасчета);
               МесяцевРасчетногоПериода = 0;
               ОбщегоНазначенияЗК.РазобратьРазностьДат(НачалоМесяца(Док.ПериодРасчетаСреднегоЗаработкаОкончание), НачалоМесяца(Док.ПериодРасчетаСреднегоЗаработкаНачало), , МесяцевРасчетногоПериода);
               Если ЗначениеЗаполнено(МесяцевРасчетногоПериода) Тогда
                   МесяцевРасчетногоПериода = МесяцевРасчетногоПериода + 1;
               Иначе
                   МесяцевРасчетногоПериода = ?(СведениеОВидеРасчета.ПорядокОпределенияРасчетногоПериодаСреднегоЗаработка = Перечисления.ПорядокОпределенияРасчетногоПериодаСреднегоЗаработка.ПоКолдоговору,СведениеОВидеРасчета.ПериодРасчетаСреднегоЗаработка,НачислениеОтпускаРаботникамОрганизацийПереопределяемый.КоличествоМесяцевРасчетаПоЗакону(Док));
               КонецЕсли;
               СреднедневнойЗаработок = Формат(НачислениеОтпускаРаботникамОрганизацийПереопределяемый.РасчетСреднегоЗаработка(ДОк, СведениеОВидеРасчета.СпособРасчета, МесяцевРасчетногоПериода, Док.ПериодРасчетаСреднегоЗаработкаНачало, Док.ПериодРасчетаСреднегоЗаработкаОкончание),  "ЧЦ=12; ЧДЦ=2; ЧН=");
              
           КонецЕсли;
              
          
          
           Стр.СреднедневнойЗаработок = Число(СреднедневнойЗаработок);
           Если Стр.СреднедневнойЗаработок = Неопределено тогда
               Стр.СреднедневнойЗаработок = 0;
           КонецЕсли;
           //прервать;
          
            
        КонецЦикла;
        ОтменитьТранзакцию();
1 ivanoa
 
12.02.14
10:46
Сервер 1С 8.3.4.408
Большая часть баз на 1С Бухгалтерия 3.0 в тонком клиенте.
2 ivanoa
 
12.02.14
10:47
извините- пост 1 не туда.
3 ИУБиПовиц
 
12.02.14
10:52
хм. Добавил
//Док.ПериодРасчетаСреднегоЗаработкаНачало = Док.РабочийГодС;
            //Док.ПериодРасчетаСреднегоЗаработкаОкончание= Док.РабочийГодПо;
            Если ЗначениеЗаполнено(Док.ДатаНачалаСобытия) Тогда
                мСведенияОВидахРасчета = Новый Соответствие;

                ВидРасчета = Док.ОсновнойВариантРасчетаДокумента().ВидРасчета;
                Если ЗначениеЗаполнено(ВидРасчета) Тогда
                    СведениеОВидеРасчета = ПроведениеРасчетов.ПолучитьСведенияОВидеРасчета(мСведенияОВидахРасчета, ВидРасчета);
                    МесяцевРасчетногоПериода = ?(СведениеОВидеРасчета.ПорядокОпределенияРасчетногоПериодаСреднегоЗаработка = Перечисления.ПорядокОпределенияРасчетногоПериодаСреднегоЗаработка.ПоКолдоговору,СведениеОВидеРасчета.ПериодРасчетаСреднегоЗаработка,НачислениеОтпускаРаботникамОрганизацийПереопределяемый.КоличествоМесяцевРасчетаПоЗакону(Док));
                Иначе
                    МесяцевРасчетногоПериода = 12
                КонецЕсли;
                
                ПериодРасчетаСреднегоЗаработкаНачало = ДобавитьМесяц(НачалоМесяца(Док.ДатаНачалаСобытия), - МесяцевРасчетногоПериода);
                ПериодРасчетаСреднегоЗаработкаОкончание = НачалоМесяца(Док.ДатаНачалаСобытия) - 1;
            Иначе
                ПериодРасчетаСреднегоЗаработкаНачало = "";
                ПериодРасчетаСреднегоЗаработкаОкончание = ""
            КонецЕсли;
            
            Док.ПериодРасчетаСреднегоЗаработкаНачало = ПериодРасчетаСреднегоЗаработкаНачало;
            Док.ПериодРасчетаСреднегоЗаработкаОкончание= ПериодРасчетаСреднегоЗаработкаОкончание;

Вроде то что нужно получилось по одному челу, ща попробую по всем.
4 ИУБиПовиц
 
12.02.14
11:12
Если бы еще как то ускорить эту хрень:)
5 Йохохо
 
12.02.14
11:24
сверку легко сделать создав вручную документ на дату отчета, механизм то не меняется
чтобы ускорить - добавьте отборы по сотруднику, больше вариантов вроде бы нет)
6 ИУБиПовиц
 
12.02.14
11:25
так мне по всем работающим надо:)
7 Йохохо
 
12.02.14
11:28
(6) надо 1 раз сохранить в эксель и 7 раз протестировать
Ошибка? Это не ошибка, это системная функция.