Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вывод средней зарплаты по всем сотрудникам
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
JackHammer
Подскажите, есть отчёт по средней зарплате но там выбрать можно только одного сотрудника.
Как лучше вывести в таблицу отчёт по всем сотрудникам за год?
//*******************************************
Перем СпрСотрудники, Расч;
Перем ЖрнЗарплата, СрЗарплата;    
Перем ОчереднаяДата, ДнейН, ИдКод, Таб, СуммаБЛ;
Перем НазвМесяца[12],МесяцРасчета;

Функция НомерМесяцаПериода(Номер,Год)
    НазвМесяца[1] ="Січень " + Год;
    НазвМесяца[2] ="Лютий " + Год;
    НазвМесяца[3] ="Березень " + Год;
    НазвМесяца[4] ="Квітень " + Год;
    НазвМесяца[5] ="Травень " + Год;
    НазвМесяца[6] ="Червень " + Год;
    НазвМесяца[7] ="Липень " + Год;
    НазвМесяца[8] ="Серпень " + Год;
    НазвМесяца[9] ="Вересень " + Год;
    НазвМесяца[10]="Жовтень " + Год;
    НазвМесяца[11]="Листопад " + Год;
    НазвМесяца[12]="Грудень " + Год;
    Возврат НазвМесяца[Номер];
КонецФункции


Процедура ВыбратьРасч()                              nf,kb
    Если РаботаетРасчетчик = 1 Тогда
        Предупреждение("Операция запрещена!");
        ИмяРасч = Расч.Наименование;
    Иначе
      Если Расчетчики.ВыбратьЗначение(Расч,"Выбор расчетчика") = 1 Тогда
            ИмяРасч = Расч.Наименование;
        Иначе
            // если отказались от выбора расчетчика - все расчетчики
            ИмяРасч = "";
            Расч=Расчетчик;    
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры


Процедура ОтрабДни(ОчереднаяДата)
// Определение текущего месяца работы
  СпрСотрудники.ИспользоватьДату(ОчереднаяДата);
  СпрСотрудники.ВыбратьЭлементы();  
  КалендарныеДни = 0;
  Пока СпрСотрудники.ПолучитьЭлемент()=1 Цикл
       Если СпрСотрудники.ЭтоГруппа() = 1 Тогда
       Иначе    
           Если СпрСотрудники.ТекущийЭлемент() = Работник Тогда  
          КалендарныеДни = КонМесяца(ОчереднаяДата);               
          КалДни = ДатаЧисло(КалендарныеДни);
          НП = ЖрнЗарплата.НачалоПериодаПоДате(ОчереднаяДата);
          КП = ЖрнЗарплата.КонецПериодаПоДате(ОчереднаяДата);
            КалендСотр = Работник.Категория.Получить(КП).Календарь;
          ДнейГрафик = КалендСотр.Дней(НП,КП);
          Повр = СпрСотрудники.Повременно;
          ПрПовр = 0;
          Если Повр <=0 Тогда // (1)  
           ПрПовр = 1;
           Прервать;
          Иначе
           Если СпрСотрудники.НеПолнРабДень <> 0 Тогда
            Кд = Повр/СпрСотрудники.НеПолнРабДень;    // отработано дней
           Иначе
            Кд = Повр/8;               // отработано дней
           КонецЕсли;
           Если Кд - Цел(Кд) > 0 Тогда // округление до большего количества дней
            Кд = Цел(Кд) + 1;       // отработано дней
           КонецЕсли;
           НеОтработанныеДни = ДнейГрафик - Кд;
           Если НеОтработанныеДни > 0 Тогда
               Если СуммаБЛ > 0 Тогда
             ДнейН = КалДни - НеОтработанныеДни;
            Иначе
             ДнейН = КалДни;
            КонецЕсли;
           Иначе    
            ДнейН = КалДни;
           КонецЕсли;
           Прервать;    
          КонецЕсли;
       КонецЕсли;
      КонецЕсли;
  КонецЦикла;
КонецПроцедуры

Процедура Сформировать()

  Таб = СоздатьОбъект("Таблица");
  Пропись("Ukr.spl");
  ЖрнЗарплата = СоздатьОбъект("ЖурналРасчетов.Зарплата");

  ОчереднаяДата = ЖрнЗарплата.НачалоПериодаПоДате(ДН);
  ОчереднаяДатаК = ЖрнЗарплата.КонецПериодаПоДате(ДО)+1;
                    
///////////////////////////////////////////////////////////////////////
  ВсегоСумма = 0;  
  ВсегоСуммаСВ = 0;
  ВсегоСуммаПФ = 0;
  ВсегоСуммаСС = 0;
  ВсегоСуммаЦЗ = 0;  
  ВсегоСуммаНЛ = 0;
  ВсегоДней = 0;    
//////////////////////////////////////////////////////////////////////    
  СпрСотрудники.ИспользоватьДату(ДО);
  СпрСотрудники.ВыбратьЭлементы();
  Пока СпрСотрудники.ПолучитьЭлемент()=1 Цикл
       Если СпрСотрудники.ЭтоГруппа() = 1 Тогда
       Иначе    
           Если СпрСотрудники.ТекущийЭлемент() = Работник Тогда  
                   ИдКод = Работник.ИдентифКод;
                Прервать;    
         КонецЕсли;
       КонецЕсли;
  КонецЦикла;
  Таб.ВывестиСекцию("Шапка");
////////////////////////////////////////////////////////////////////////
  СЧД = 0;
  Пока ОчереднаяДата < ОчереднаяДатаК Цикл  
          Год = ДатаГод(ОчереднаяДата);
          Сч = ДатаМесяц(ОчереднаяДата);
        МесяцРасчета = НомерМесяцаПериода(Сч,Год);
          Сумма = 0;
        СуммаСВ = 0;
        СуммаПФ = 0;
        СуммаСС = 0;
        СуммаЦЗ = 0;
        СуммаНЛ = 0;            
        СуммаБЛ = 0;            
        ЖрнЗарплата.ВыбратьЗаписиПоОбъекту(Работник,ЖрнЗарплата.НачалоПериодаПоДате(ОчереднаяДата),ЖрнЗарплата.КонецПериодаПоДате(ОчереднаяДата));
           Пока ЖрнЗарплата.ПолучитьЗапись()>0 Цикл
            Если ЖрнЗарплата.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ВсеНачисления)=1 Тогда
                 Сумма = Сумма + ЖрнЗарплата.Результат;  
            КонецЕсли;
//            Если ЖрнЗарплата.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ОблагаетсяСС)=1 Тогда
            Если ЖрнЗарплата.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ОблагаетсяПФ)=1 Тогда
                 СуммаСВ = СуммаСВ + ЖрнЗарплата.Результат;  
            КонецЕсли;    
            Если ЖрнЗарплата.ВидРасч.ВходитВГруппу(ГруппаРасчетов.Пенсионный)=1 Тогда  
                 СуммаПФ = СуммаПФ + ЖрнЗарплата.Результат;
            КонецЕсли;
            Если ЖрнЗарплата.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ФондБезработицы)=1 Тогда  
                 СуммаЦЗ = СуммаЦЗ + ЖрнЗарплата.Результат;
            КонецЕсли;
            Если ЖрнЗарплата.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ФондСоцстраха)=1 Тогда  
                 СуммаСС = СуммаСС + ЖрнЗарплата.Результат;
            КонецЕсли;  
            Если ЖрнЗарплата.ВидРасч.ВходитВГруппу(ГруппаРасчетов.Налоги)=1 Тогда  
                 СуммаНЛ = СуммаНЛ + ЖрнЗарплата.Результат;
            КонецЕсли;
            Если ЖрнЗарплата.ВидРасч.ВходитВГруппу(ГруппаРасчетов.Больничные)=1 Тогда  
                 СуммаБЛ = СуммаСС + ЖрнЗарплата.Результат;
            КонецЕсли;  
        КонецЦикла;
           ВсегоСумма = ВсегоСумма + Сумма;
        ВсегоСуммаСВ = ВсегоСуммаСВ + СуммаСВ;
        ВсегоСуммаПФ = ВсегоСуммаПФ + СуммаПФ;
        ВсегоСуммаЦЗ = ВсегоСуммаЦЗ + СуммаЦЗ;
        ВсегоСуммаСС = ВсегоСуммаСС + СуммаСС;
        ВсегоСуммаНЛ = ВсегоСуммаНЛ + СуммаНЛ;
        ОтрабДни(ОчереднаяДата);  
        ВсегоДней = ВсегоДней + ДнейН;
        СЧД = СЧД + 1;
        Таб.ВывестиСекцию("Месяц");
        Сч=Сч+1;
        ОчереднаяДата = ЖрнЗарплата.КонецПериодаПоДате(ОчереднаяДата)+1;
  КонецЦикла;
  СрЗарплата = ВсегоСуммаСВ/ВсегоДней;
  СрЗарплатаМ = ВсегоСумма/СЧД;

Таб.ВывестиСекцию("Итог");
Таб.Опции(0,0,0,0);
Таб.ТолькоПросмотр(0);
Таб.Показать("Результат",);
    
КонецПроцедуры

// первоначально
Расч = Расчетчик;
Если Расч.Выбран()=1 Тогда
    ИмяРасч = Расчетчик.Наименование;
КонецЕсли;  
ЖрнЗарплата = СоздатьОбъект("ЖурналРасчетов.Зарплата");
СпрСотрудники = СоздатьОбъект("Справочник.Сотрудники");




 ! 

Правила, п. 5, 7, 8,
 


Предприятие 7.7 (7.70.027)
-=VJ=-
ИМХО, по хорошему - переписать всё на запрос.

Но как минимум:

Таб.ВывестиСекцию("Шапка");
Пока СпрСотрудники.ПолучитьЭлемент()=1 Цикл
       Если СпрСотрудники.ЭтоГруппа() = 1 Тогда
           Продолжить; //Только зачем? В сотрудниках один уровень вложенности, там групп не бывает. Или справочник меняли?
       КонецЕсли;
       Если ПустоеЗначение(Работник)=0 Тогда
              Если СпрСотрудники.ТекущийЭлемент() <> Работник Тогда  
                  Продолжить;
              КонецЕсли;
       КонецЕсли;
       ИдКод = Работник.ИдентифКод;
...
КонецЦикла;

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.